tocco-admin 0.5.35 → 0.5.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +49 -0
- package/dist/00280aae09f2a71c1ab46c7cfb9f491c.js +1 -0
- package/dist/01ac8e05b621fce247d8d553656903c6.js +1 -0
- package/dist/02703e133100c3be64cfec414d4db706.js +1 -0
- package/dist/03276b6288c255cf1682f53ec11bb5a2.js +1 -0
- package/dist/036680d9c1d332cf478c5823cd2a47db.js +1 -0
- package/dist/0536af8c74f6fdf2d45e5e8990ee60cc.js +1 -0
- package/dist/06d453ace473034cd357edb758d539ab.js +1 -0
- package/dist/0768225f873adf5f103dcb714f17783d.js +1 -0
- package/dist/07c0a60b390501dfbb57219d5c8fbc1a.js +1 -0
- package/dist/07c26a67fe6aa27f701c6fb03a7bbafd.js +1 -0
- package/dist/0870bcf868f8d64dc9a6226a6c8b341d.js +1 -0
- package/dist/09195a75bcf8a7ac579281ac2ed5954a.js +1 -0
- package/dist/09ec1e19429e9349a4f69e00cdc89509.js +1 -0
- package/dist/0a4b12234fd7cba4d7c62207e4835f4c.js +1 -0
- package/dist/0a5adf8110dfa37b8a75edf8cafb1dd7.js +1 -0
- package/dist/0b56e82ae05b7ec2022e1cb35b8b6e10.js +1 -0
- package/dist/0bd6d25a3183a767309cd45cd8b8f347.js +1 -0
- package/dist/0c125a87d8efb9ce303b6b91783eb165.js +1 -0
- package/dist/0c2b3b3b66a73e289e2ca47cf22ef150.js +1 -0
- package/dist/0cbaf3ecc6b20dbc83c2164e9a1eac02.js +1 -0
- package/dist/0dc486b4415f7cbd7ddde8f32b6f12f1.js +1 -0
- package/dist/0dd0f45c3dde9af3fcf9706e6a2a1edd.js +1 -0
- package/dist/0f908578998bc65a3c374078edd4d880.js +1 -0
- package/dist/100f9b1846c1e1ecae19e0ca2fc8224c.js +1 -0
- package/dist/1084edaced97872890c9d87a9944cdcd.js +1 -0
- package/dist/119d8ff08e82b0f391f59f1fe657130f.js +1 -0
- package/dist/1295d4470d348d3ff8ea442b1dcef3d3.js +1 -0
- package/dist/1365ff3d277ebdab408e6aeec886cf08.js +1 -0
- package/dist/13b157cfddcb9a76ae0800b47a8f0122.js +1 -0
- package/dist/142d258626093a8c3187029538e32bbc.js +1 -0
- package/dist/144991c48dbba89bfe10e886aaaed32a.js +1 -0
- package/dist/155500be4d3113e94dca99f997defb7a.js +1 -0
- package/dist/1570e695c448e6a4f3a6bdf0372b58f0.js +1 -0
- package/dist/15abe309c5ecbc579dccc79beb041fd8.js +1 -0
- package/dist/167a62ec377adafbeb4bbb1cef73250d.js +1 -0
- package/dist/17c85759d562794da4d2ff11f1b9b3bd.js +1 -0
- package/dist/1840080076c4078d157a5b05d0d95551.js +1 -0
- package/dist/18a893070398343ab529fdb7b62f1b6d.js +1 -0
- package/dist/19a2b55271f405d0b97fad53c9d5ec2d.js +1 -0
- package/dist/1afe87852eca4b28294075c659ff8c45.js +1 -0
- package/dist/1c9874850164cfdaa7e1d212d09124a7.js +1 -0
- package/dist/1cb8df3a3416707163473b1ee9268faf.js +1 -0
- package/dist/1d837e2c9de35cbb09a85208da4a0d8a.js +1 -0
- package/dist/1de3569bf4cf2463628d69ecd92150ca.js +1 -0
- package/dist/1e33cb44dfab039b4a7e88a3ee1bbfe7.js +1 -0
- package/dist/1f03c9a69a8b9f79bcb7a338963f80c8.js +1 -0
- package/dist/1f1abd5e247cf6b2e9a3db6303277572.js +1 -0
- package/dist/1f7235986d23e6842cc54ba78816f16d.js +1 -0
- package/dist/2031467f3d02be43b638c5e3ccba3996.js +1 -0
- package/dist/20b003ac07f216a490981c397b91a117.js +1 -0
- package/dist/20f8061729d26f9786679bbf7af0b87a.js +1 -0
- package/dist/214a729dcea91ee8a56f8ef43e17243a.js +1 -0
- package/dist/219db9db1df39ce8cf197c72cb643801.js +1 -0
- package/dist/21c12c627149bdfc030e3de47acde151.js +1 -0
- package/dist/21dca974f7343f200597e43a55766c6e.js +1 -0
- package/dist/21e63141d475afcb7d4fd1fac1da934b.js +1 -0
- package/dist/223593fe8dd78b83f22808f9aad86ae9.js +1 -0
- package/dist/22812e27a1f54c0a4ff744a444a32d6c.js +1 -0
- package/dist/22b1c8bf4c2bdd7e438f832b888c75e4.js +1 -0
- package/dist/22d4f336d4fbe548273812e6e4cd345e.js +1 -0
- package/dist/2334a9d0e81f9aa6df36e30a4158e213.js +1 -0
- package/dist/242fb5a92733d151e9ca303fcd3ae7ff.js +1 -0
- package/dist/243d8101969c933d25388b5287bb3425.js +1 -0
- package/dist/2681042a598b029b51d51f7669b81c4d.js +1 -0
- package/dist/2839e845bd0cf60f35f3a8ca90a5ee22.js +1 -0
- package/dist/28f7c5b28bbad7b0bac0cc3cc5b89bad.js +1 -0
- package/dist/294fbc5b00264d6215dd8ff838dc2999.js +1 -0
- package/dist/29a4e3548d286388c4d5e8f0670a4381.js +1 -0
- package/dist/2a7b2ac7dc47105609001b93c25190b8.js +1 -0
- package/dist/2ac58492ad5a1b5244deb0fef1e5a773.js +1 -0
- package/dist/2bba99eb717e1aa22e45284a964ca73f.js +1 -0
- package/dist/2dea096a03cd8f864db5f06e9f0113e5.js +1 -0
- package/dist/2e6b449c270c4420523a24d1a806eb47.js +1 -0
- package/dist/2f1b71c04ca88bae69f1798880dbc985.js +1 -0
- package/dist/2fe13737434324ed67582ac97d484c54.js +1 -0
- package/dist/30314e1b4a51b1aed3766eadecde2a42.js +1 -0
- package/dist/3045404d52d03253c81822bdf760cfd1.js +1 -0
- package/dist/31459a657ac30dcaa54765c6d76d8c81.js +1 -0
- package/dist/318f90759f2ff0d2a437350e87578172.js +1 -0
- package/dist/31bcb02e59d84ce2e38b85616a0b44db.js +1 -0
- package/dist/31f3f1c32b27587832d28b634351325c.js +1 -0
- package/dist/330543be2120b9dcc9bec41ba5e05805.js +1 -0
- package/dist/33856f6eaf3444eaff9e4e5d3fe810c8.js +1 -0
- package/dist/34f05dc84111ffe37a1d5b5aacff7488.js +1 -0
- package/dist/35858a47038a7be957df49854e8e5eea.js +1 -0
- package/dist/35dc4119f9e28cb9baba1475537460bb.js +1 -0
- package/dist/37bc2ca46b9a9d40678a3cd05d50e397.js +1 -0
- package/dist/37e37aa178d97ffcd94eeee1e1a25967.js +1 -0
- package/dist/38528de2a5c097da375fd0a076667441.js +1 -0
- package/dist/38a696bcfe6021b6442e70b6d3017b93.js +1 -0
- package/dist/398b591b6e9b2ae73dde100bca36f84a.js +1 -0
- package/dist/3a969f15f742add3d383e55d0ceb3d25.js +1 -0
- package/dist/3baeab62d681338ba3287f0a50e5dad1.js +1 -0
- package/dist/3c58f68d787710c79906a2cd6d248295.js +1 -0
- package/dist/3cab7110c6a090f72c540dcc1cfbe3b5.js +1 -0
- package/dist/3cce0c7e1a8e1148f97de59a4b1ee73f.js +1 -0
- package/dist/3cd86defa6e36c165ae673afab6b5eab.js +1 -0
- package/dist/3cf64ec91a700bfa1dece0957c49c7dc.js +1 -0
- package/dist/3e6808cd6eefd1be1040403985581374.js +1 -0
- package/dist/3e6cde7f6a3d84c5cff5127be1c019f3.js +1 -0
- package/dist/3f9e3ae9d4ee540b9fb067b6fd29d529.js +1 -0
- package/dist/4037e6d4b18e3e286dec455cc63c1d17.js +1 -0
- package/dist/40505d6c2f34fc08502d3e596573c7f8.js +1 -0
- package/dist/40ba797ae7e4433f9847cd2c68bfbdf7.js +1 -0
- package/dist/413ec783ae29da56e8bdabae45457f91.js +1 -0
- package/dist/4190490a8257bdfcce6e2bd4f0634086.js +1 -0
- package/dist/41f85ea0c545f0539b6ae2753eb1f79c.js +1 -0
- package/dist/4263ed179f5b2268965e1157074583e8.js +1 -0
- package/dist/4339a83a0599fb43f59642dffbdbe8f5.js +1 -0
- package/dist/434a5902436fc0f4bac913f7ae1471c6.js +1 -0
- package/dist/43a9bcfc200d80676bc68fe9a3c8ab6d.js +1 -0
- package/dist/43bd62d6b50d1253f782c9ae5be1593d.js +1 -0
- package/dist/43dab3876e6402fc9ae359a033683cc4.js +1 -0
- package/dist/446ad37d55a836cf56e5417fcc9b986f.js +1 -0
- package/dist/4474c9775d04684871043fae3501ec66.js +1 -0
- package/dist/44e6d883ecccba28d8adf592cb83e01b.js +1 -0
- package/dist/451c3753fb6dfc1f2de25cb7524f4bb2.js +1 -0
- package/dist/46bac1e89f220258537c533035a6e263.js +1 -0
- package/dist/4705b919138245a5b454d25f8e418435.js +1 -0
- package/dist/4750f0ff62cbd59f35aac31b996194e6.js +1 -0
- package/dist/47bc1cf488af29738e21d8b5f4c8766b.js +1 -0
- package/dist/47cd5c7d174e6b624e55510c4e503600.js +1 -0
- package/dist/47ecd829f86e48857a05b2189ee9c097.js +1 -0
- package/dist/4ab6dffb1b7255cc39ef77a35eb53293.js +1 -0
- package/dist/4c23cecd95c406d71cbe8fe49ad3ab6c.js +1 -0
- package/dist/4cbd6f8a4f52821c1d3476139078797d.js +1 -0
- package/dist/4d694d41a0c1b3eaad752a8352c5661c.js +1 -0
- package/dist/4e4d407bd6bf0ce7bfc869f7eb6e93d3.js +1 -0
- package/dist/4e9e0e943cacfdf9d350ba0c59bfb53b.js +1 -0
- package/dist/4ee6db42bdfd31631aaa20c2a02cf90e.js +1 -0
- package/dist/4f30f5432d9bfb925c918a6870451fef.js +1 -0
- package/dist/5094b30d2471cc7312746173d8a4bb25.js +1 -0
- package/dist/51e6918f996813eafa4b1491d9dd343b.js +1 -0
- package/dist/51e6ccd3ea9d7443949b155b113eebd5.js +1 -0
- package/dist/51fd63020e12665fab2b755ae7a901d4.js +1 -0
- package/dist/540bba54b49ea7a6ec513270449132db.js +1 -0
- package/dist/553aa6bb3b625428f4df57f5885d50f3.js +1 -0
- package/dist/5540bb93f39dcb670a0f9b4e4b793d02.js +1 -0
- package/dist/57c2d2eb6a844a8c9ecd932c6d4067b0.js +1 -0
- package/dist/57c7c145c720f31f3749b658e3769833.js +1 -0
- package/dist/587c674b536ffaf75df5db37c7b67c4a.js +1 -0
- package/dist/58d885ab56201085ce55e8eb5d3f2ac2.js +1 -0
- package/dist/58f38fb5c5d8da84e75bd48f7d501d59.js +1 -0
- package/dist/59457eef0e0be735680874d74c13e469.js +1 -0
- package/dist/5a8b5a01cd9dadacb661063269f44c66.js +1 -0
- package/dist/5bd58f2ebad7e63ff72a891fb43e2b38.js +1 -0
- package/dist/5c5f571e7b4ac9500fa21c5abd909c27.js +1 -0
- package/dist/5ce9c9a26cf28c9ccdcf82388efacf29.js +1 -0
- package/dist/5d2589bbfd66894e296ec080a28d70e1.js +1 -0
- package/dist/5e4dd0452f14cf5dbb02a7dc7d9dda76.js +1 -0
- package/dist/5e62ca244220154bbcae2a7eb2c50e0f.js +1 -0
- package/dist/5e9314c1c0d4e5f4cb7a3f80fc01530c.js +1 -0
- package/dist/5eeee1acc01b04328cf42db0715bb7f5.js +1 -0
- package/dist/5f6f5026d13b2a9b884a8144a119cf9e.js +1 -0
- package/dist/60fc15a66fa7ba74ccd248f85b50fbe5.js +1 -0
- package/dist/611cab878498fbf52880d2323991f3d7.js +1 -0
- package/dist/61cc56da80a76731283878abc3b13761.js +1 -0
- package/dist/628b24103fca421515ec8724d12f026f.js +1 -0
- package/dist/63ccb1f1a27a2bf6271f40d3082186f4.js +1 -0
- package/dist/642f5bce034554539cc93a5b965e730a.js +1 -0
- package/dist/646323ed2e6bfb9e711785e109cf8d5f.js +1 -0
- package/dist/646c9322233a0ba128268dee916e5719.js +1 -0
- package/dist/6477e8f75e2259e66e943bdef7b9e4a7.js +1 -0
- package/dist/64a7727963416cd27ab100d1dfff8168.js +1 -0
- package/dist/64f93b6b093bba4147485023263cf65f.js +1 -0
- package/dist/66670f2c1f5e7c4e531007e89bb85355.js +1 -0
- package/dist/66fb250b0cba71f9e58d9c94c4d7341a.js +1 -0
- package/dist/68cf9a0e1eaff7cc991e970a855108f8.js +1 -0
- package/dist/697c2df91bf7c729d317c620a3cd77bd.js +1 -0
- package/dist/6d9ca7a980db8fa74e39b1ff3b0c75cd.js +1 -0
- package/dist/6dafd4eb9102ea47229a42a24d40f457.js +1 -0
- package/dist/6ddf5e6270865af626321055852c6cb5.js +1 -0
- package/dist/6e4d1075690c1f17775f02251592ac60.js +1 -0
- package/dist/6e88d3943f4c3a068493aad131cd4898.js +1 -0
- package/dist/6e9ca56e0fa3e784eab3da45f8d0d8ac.js +1 -0
- package/dist/6ed72418f4fa5f71dee7780ac5bb95e0.js +1 -0
- package/dist/6f0543453c605ea6d673a3bd31dd1090.js +1 -0
- package/dist/6f783ca6efdcb90ccde9175312f6558d.js +1 -0
- package/dist/70647aa39b1179b9db672c874eaf3a9e.js +1 -0
- package/dist/7074e18e67a10875c827b6cfe2665b83.js +1 -0
- package/dist/7150c52abe226d317116208cfe9fdc88.js +1 -0
- package/dist/727184c92f9da8d8b0c013fd79cf32fe.js +1 -0
- package/dist/72d23326220bc76ce06b4c1c68efb378.js +1 -0
- package/dist/72d2343e3b39f8b214aa614fea10c9ab.js +1 -0
- package/dist/740ff6a6e968e50d530fde5e13064fd7.js +1 -0
- package/dist/74973bbb728e661679e49a16773535a4.js +1 -0
- package/dist/749b5fd2f9c2f584602aae4564fa1400.js +1 -0
- package/dist/781aab91bdb94039619a5d6086109f80.js +1 -0
- package/dist/78999d905693a14a2c4677977ba222fb.js +1 -0
- package/dist/79701bbf8c5436771916d9af708ae8ec.js +1 -0
- package/dist/7982ae381c10e501e9a46d8693deddf6.js +1 -0
- package/dist/7a679adc4e97aa2dab36bf2b4f37b6d3.js +1 -0
- package/dist/7af5865535fb306e7d0364a9ff81f389.js +1 -0
- package/dist/7bdb2e4d3bc51d15863aa7be6e0a23a9.js +1 -0
- package/dist/7cef38946c33fa981d6d2c86c62428e0.js +1 -0
- package/dist/7d46cd8e5efaac33d5bf823ed4268841.js +1 -0
- package/dist/7e89c064ec09f955a6c3ffbfb96908a2.js +1 -0
- package/dist/7e98c4d98664d6f7bcc52a07f21a1f9f.js +1 -0
- package/dist/7f10fe526aec57bd522af77ea6ac2b62.js +1 -0
- package/dist/7f63b670b51e07bd9a30869b68ada191.js +1 -0
- package/dist/8043595ccf704fc61e7e3e4c7c7e77a5.js +1 -0
- package/dist/81096321488be75b81be9dbd40d9bb24.js +1 -0
- package/dist/8120c57dbca7501da3ecf702c811f16f.js +1 -0
- package/dist/81350551f7c2ff74244535aaff56dd11.js +1 -0
- package/dist/817d52a47a4657b8a4dab79e057f5fb0.js +1 -0
- package/dist/81be1aff3c1cfa0531037ebab355abbb.js +1 -0
- package/dist/82ce99851e7fc39e91603bc3320fe6d2.js +1 -0
- package/dist/833b242747fd7b098d46011e4289bc3f.js +1 -0
- package/dist/83ea78d42f1a8e5f7346f3a30140ebfb.js +1 -0
- package/dist/84f75bf9ddb5400925d2a043a2013cec.js +1 -0
- package/dist/852f3a4ec9ee58d75bd55c85161bb68f.js +1 -0
- package/dist/85f71b723441bcf428b8abed1fc8f56f.js +1 -0
- package/dist/85fe85850b026b668c10d2c9e0e5e8c6.js +1 -0
- package/dist/867fb2b26eef123915aff8634c0bbf4a.js +1 -0
- package/dist/8681f562786fa45bebe8ee7ed2461026.js +1 -0
- package/dist/86dfc095a8bb97b2b6d94b798ebcdc61.js +1 -0
- package/dist/8770a939f7943a9fc6ef55f01bbf58b4.js +1 -0
- package/dist/8833a126ef9d8892bfb372d227f7f088.js +1 -0
- package/dist/8870430db332faf22d90e12f1620ee84.js +1 -0
- package/dist/88d5efab68c7526ad2ad4196932adb03.js +1 -0
- package/dist/88f2b86b79781364b99947d07d3c3469.js +1 -0
- package/dist/89859a411a50c90f1e669deaf8a6775f.js +1 -0
- package/dist/89a47a0051ac0b3885ef8af2476526f0.js +1 -0
- package/dist/8a50c9e16faa7bc5e88b7261601fbea3.js +1 -0
- package/dist/8a7d1e82245ba58033df533faadfbaf4.js +1 -0
- package/dist/8afcf3a037a7f37f9c0bbad01507d73b.js +1 -0
- package/dist/8bdbab2f0d58195a7d509ad6fbe02966.js +1 -0
- package/dist/8c8877c66a2c6404ed17f0f364f2f229.js +1 -0
- package/dist/8dec848a9d34e3804976ae4a589fbc4f.js +1 -0
- package/dist/8e6a809082edab0aaf90b9eb118ae571.js +1 -0
- package/dist/8e7a3ed0365cf37663cd6432382b9f87.js +1 -0
- package/dist/8e81f51d2e7be98e9e45fe93239c7e99.js +1 -0
- package/dist/8e9de0496ec7e61744c335d3156e3e91.js +1 -0
- package/dist/8ee6948d963e299de55144b3c7a60c0a.js +1 -0
- package/dist/8f69fc81a83ba318eca7dbae6c6eba75.js +1 -0
- package/dist/902223f10df9241dca67a311e6be82d2.js +1 -0
- package/dist/90643b9da87302fef490f3f48af806e2.js +1 -0
- package/dist/908119c25a234151c8c7c1a97005c866.js +1 -0
- package/dist/91832748c8f066b07af2341ccc6dd5b1.js +1 -0
- package/dist/91c0f3f78f13aefc3168b4ef28ff49db.js +1 -0
- package/dist/92cf63e9a949f08d97a74d9ed17392ed.js +1 -0
- package/dist/9360974ffacadb05145e2f6c1458f35b.js +1 -0
- package/dist/94a0179602c94d55621a35e41c97ed5c.js +1 -0
- package/dist/94a5c40baab0f2df8b43889ed5fb6b8a.js +1 -0
- package/dist/957cecf7fe593e179b14e2cb8795819c.js +1 -0
- package/dist/983ddc3115fae8e0dfd108d799662892.js +1 -0
- package/dist/985b400088bf5e23fb83e70d9948eccb.js +1 -0
- package/dist/998c5f13555e18b42e9bf826578b2e16.js +1 -0
- package/dist/99b756405f919e9022e6a4e3579dd5ee.js +1 -0
- package/dist/99f6bcba35fb277563c6362f3caab715.js +1 -0
- package/dist/9abcc804fa38b6d05e62a10cb8dbb668.js +1 -0
- package/dist/9c202aefac35a5ff49d3d3795e9932bc.js +1 -0
- package/dist/9c2b91bc7cd844308f5a746886a7d573.js +1 -0
- package/dist/9cf3be7669b89ac4036cd07c9baf7e13.js +1 -0
- package/dist/9d0f4f65be2f50ad54488089f126feda.js +1 -0
- package/dist/9e357a97da26127713394684a51946b8.js +1 -0
- package/dist/9e69cb39701c3578226b39536edd4dd7.js +1 -0
- package/dist/9e875d25eb6d80340adac0cfc35700c1.js +1 -0
- package/dist/a026164ca1f6f157fcb0f5f6bfd4abce.js +1 -0
- package/dist/a036e6a0313d9a77375018f2ac758d6b.js +1 -0
- package/dist/a06ea1f6e485f67413d6cb34d7cc3515.js +1 -0
- package/dist/a07f2b025030bd4f277803aea0e6a539.js +1 -0
- package/dist/a26463d029a2515171748a1ebcca53c3.js +1 -0
- package/dist/a28e3425f856992a4e5e4b0d448316cd.js +1 -0
- package/dist/a311e02008e0f00a37305a12d479159a.js +1 -0
- package/dist/a33f52a5f1ea0162305f99d63235f807.js +1 -0
- package/dist/a477d7b35783dd10040a243a84c86a0c.js +1 -0
- package/dist/a5cb31cfb4711ef14999198f0d35eaf3.js +1 -0
- package/dist/a65a0bae3e5b73407d15ea6bbb08e515.js +1 -0
- package/dist/a71d8ecb9a2a4b35fcd828bb970e7e84.js +1 -0
- package/dist/a84f565fc5473f112281550ea6c2ccf4.js +1 -0
- package/dist/a93bbe4d82b7f6cc642b7ebc38f4df5d.js +1 -0
- package/dist/aa1233d5e8262d6c87d7e17025479ac1.js +1 -0
- package/dist/aa2f98073a8d9f266f3928b5d9c457d1.js +1 -0
- package/dist/ab16c1237e6e04bbf0024ee2bae42130.js +1 -0
- package/dist/acc30207efba7ab5b7b509b599f37e6f.js +1 -0
- package/dist/acc4ded8b9debce27f884c9cce5bf63c.js +1 -0
- package/dist/acc7448b80728a73c9a4046b3ec4407f.js +1 -0
- package/dist/adbb57fa182dce548204311d3be6dffa.js +1 -0
- package/dist/af45a0eba37254fde00bc0845dc16954.js +1 -0
- package/dist/b02513e1d0cc664936e1ba9cb5a923af.js +1 -0
- package/dist/b02e760aa00b054a6e53138426bd9411.js +1 -0
- package/dist/b048c40cfb4768fc6b65a121049f0b9e.js +1 -0
- package/dist/b0ae5887d5b545dcdd5db18846651f7f.js +1 -0
- package/dist/b0fc54e0e936c84253a30c9b39cfd9bf.js +1 -0
- package/dist/b111a00f8f22708140c6fdbc26963155.js +1 -0
- package/dist/b131314d1ea62fa7bba91a4da8360298.js +1 -0
- package/dist/b26738d581e044c69f7a4392906e6843.js +1 -0
- package/dist/b435aebcb57d65080cfd510e0a9d5d9d.js +1 -0
- package/dist/b49c9a9ab619e46a7ba6f9f89c800589.js +1 -0
- package/dist/b4bd28ac3a7935d0c52a6cb19c89aced.js +1 -0
- package/dist/b518725b1ee5b4ba27eec173687966f0.js +1 -0
- package/dist/b69a91688637c9acd4bcce30598faeee.js +1 -0
- package/dist/b830d88aa22a866a208be27af90526a7.js +1 -0
- package/dist/ba07c8c1ca6ea903fd0f0379db66ea1e.js +1 -0
- package/dist/bae95bdb1bbcc0969e0e40fb72539df3.js +1 -0
- package/dist/bb3e0098a11d21ca01d6e44c2e39f90b.js +1 -0
- package/dist/bb48e1051c32d32d425681e9200706bc.js +1 -0
- package/dist/bb9282d93d3ae9d53870a66627f8c797.js +1 -0
- package/dist/bbd62124f6d03e01eb4332f55ead999d.js +1 -0
- package/dist/bc26ab0797e975ba01e701683935864b.js +1 -0
- package/dist/bd33197d8c34bf6387e39130c28f8342.js +1 -0
- package/dist/bd98610e395f3b4c7915cf3fbe854f6f.js +1 -0
- package/dist/bd9ff502ba460f402b4e2005689402a7.js +1 -0
- package/dist/be267e990e45f420b52971b942b6cd36.js +1 -0
- package/dist/be2fbe775b19bdc18e4f78de18beb433.js +1 -0
- package/dist/bef8dd4d998c8a971c0c8a9eb298470d.js +1 -0
- package/dist/bf06f353bf67ef497b65afe567e7f294.js +1 -0
- package/dist/bffad0f26b7a14d73f338aefa2d2f9e5.js +1 -0
- package/dist/c02d976c2c838a2b5ad0e5dfd1facb75.js +1 -0
- package/dist/c0b4241b59cd6750a7d6ad4f3d019d84.js +1 -0
- package/dist/c0b4cd50c3fcc1292b34cedf813a16dd.js +1 -0
- package/dist/c0f91d067bd4f665ec7b85a632e3168d.js +1 -0
- package/dist/c23b1f80ab9746b425f3848bdaacc144.js +1 -0
- package/dist/c24de6963d7d00c269db34091059e06d.js +1 -0
- package/dist/c2b469d0ddb280bda5f621563579725d.js +1 -0
- package/dist/c2c0e5fa8323e2c5c1f54f20afda51b8.js +1 -0
- package/dist/c38a3226f3858a47ba9fb788dc7b44fc.js +1 -0
- package/dist/c3b0cd15adcc12a549e7ac5d165ac1f4.js +1 -0
- package/dist/c56ad0a02cde76fcd540a7f7db5eca1e.js +1 -0
- package/dist/c5d7c4a345a7bb4c84ee8ced7322a8db.js +1 -0
- package/dist/c6d4a590e14107a8a5ad505d66241032.js +1 -0
- package/dist/c6f608398c43e25821557ee65cda5e58.js +1 -0
- package/dist/c755e7fc08446566ee8dd3a8aa8fe43f.js +1 -0
- package/dist/c7d3b0afe7600a632fbf44ee8d84996e.js +1 -0
- package/dist/c7fb0ccebacccfb5c2f7b2f6023ebe4a.js +1 -0
- package/dist/c806ba4f0026195e7907bfb62d00b502.js +1 -0
- package/dist/c8bdb139ff462c0e7dc4ba2f56a49318.js +1 -0
- package/dist/c95085763daaf58802818ae50c902db8.js +1 -0
- package/dist/c98e5722b508d4eb3afcea637246de33.js +1 -0
- package/dist/c9e10cf9c0a5a1dee23414b7bc709a11.js +1 -0
- package/dist/ca1483809659f6c87cc6f588891d2bd4.js +1 -0
- package/dist/cb5e8b8ede9cae0b8fb986da038763e3.js +1 -0
- package/dist/ce73c3243f61524d76000c4ace94f2bb.js +1 -0
- package/dist/ceadf1677ee2a5b133bac039155145ec.js +1 -0
- package/dist/cf0a04afa21ac9ba23a1de0416a03105.js +1 -0
- package/dist/cf1f6c842a1ec0af6b00ce1859dce6d5.js +1 -0
- package/dist/cf6e250c7df1f6206ad0330880821dca.js +1 -0
- package/dist/chunk-215.fff39767c95996b4de4d.js +2 -0
- package/dist/chunk-215.fff39767c95996b4de4d.js.map +1 -0
- package/dist/chunk-346.865b1decda71d260e2ea.js +20 -0
- package/dist/chunk-346.865b1decda71d260e2ea.js.map +1 -0
- package/dist/chunk-404.13695a51db7223d614da.js +2 -0
- package/dist/chunk-404.13695a51db7223d614da.js.map +1 -0
- package/dist/{chunk-vendor-flatpickr.137a4f12e1ce7db82305.js → chunk-669.ea90314a2e6355528ce7.js} +3 -2
- package/dist/chunk-669.ea90314a2e6355528ce7.js.map +1 -0
- package/dist/chunk-744.cf1b11985b1acf8f8758.js +7 -0
- package/dist/chunk-744.cf1b11985b1acf8f8758.js.map +1 -0
- package/dist/chunk-817.46476531b6e7efc9219a.js +2 -0
- package/dist/chunk-817.46476531b6e7efc9219a.js.map +1 -0
- package/dist/chunk-82.856d20bcbc6eedcbd32f.js +2 -0
- package/dist/chunk-82.856d20bcbc6eedcbd32f.js.map +1 -0
- package/dist/chunk-872.a9273eaa81fc55df7a8b.js +2 -0
- package/dist/chunk-872.a9273eaa81fc55df7a8b.js.map +1 -0
- package/dist/chunk-actions.36f03e5e0bdd9b2974c7.js +2 -0
- package/dist/chunk-actions.36f03e5e0bdd9b2974c7.js.map +1 -0
- package/dist/chunk-code-editor.f6597326374cd04ca8c0.js +7 -0
- package/dist/chunk-code-editor.f6597326374cd04ca8c0.js.map +1 -0
- package/dist/chunk-docs-actions.ef86e48f48f3c697c1ec.js +2 -0
- package/dist/chunk-docs-actions.ef86e48f48f3c697c1ec.js.map +1 -0
- package/dist/chunk-vendor-icons.627e759cd9f60ab5c5f5.js +1 -0
- package/dist/{chunk-vendor-quill.bcff7a1213d0e7ba09f1.js → chunk-vendor-quill.1789cce485c0fe1c2550.js} +1 -1
- package/dist/d04b75913eb7152475e4db038e643095.js +1 -0
- package/dist/d08030a8f6057b63643bacf4cee162b0.js +1 -0
- package/dist/d08daa8e673c585e1311729dbcb63eb4.js +1 -0
- package/dist/d27d5c5480c14bffe9ffc07fec3a806d.js +1 -0
- package/dist/d2e30554e6939a2542e5135fff541daa.js +1 -0
- package/dist/d345689433789d4b690fa2d03b1d83ee.js +1 -0
- package/dist/d465c0a35c6ef244bf587b0e6bdb4019.js +1 -0
- package/dist/d47938906a471dea833a3b57991c7124.js +1 -0
- package/dist/d70ab0885fcc546aaf5eee0c5fca6278.js +1 -0
- package/dist/d750a8dbf9dd09c0a33b9986e79e3c8c.js +1 -0
- package/dist/d754905fe54aac6f3c350df34f51a0b6.js +1 -0
- package/dist/d7889907dbb51f58ceadb3e1eec03a5d.js +1 -0
- package/dist/d7cdf8e31755f70cd564c742feec3be0.js +1 -0
- package/dist/d7f9c3bcea90f112bc7cac6559dcb00c.js +1 -0
- package/dist/d9a00ccd64f554cd458b3d6f6c66f465.js +1 -0
- package/dist/da06d4429e8bccd9ef90b16ebe49354b.js +1 -0
- package/dist/da1719655627488c0c1afaa1379e2c1d.js +1 -0
- package/dist/dad7909925cdea4ce193d5c14a13abf3.js +1 -0
- package/dist/db7eff370e6f80152653db4bc1c65285.js +1 -0
- package/dist/dc5f6600785254887cbe9c35ce55e769.js +1 -0
- package/dist/dcb084d6aacfa517923dd3a94e3b9af5.js +1 -0
- package/dist/dcf8b9b721cab79d285ab33fe2154a58.js +1 -0
- package/dist/dd40dfc7840568927fdef65087a233ed.js +1 -0
- package/dist/dde12e6c2c05d17c95ed0a94da234b3b.js +1 -0
- package/dist/de385e48e4b7a8c5837c9a2fd07ede3e.js +1 -0
- package/dist/de581fe10be3ac282fa6abc2f8171551.js +1 -0
- package/dist/e0476257d7657264e527f7a1f1ecbece.js +1 -0
- package/dist/e0e2b1267a5d4acb4dda3a4a598cd8a5.js +1 -0
- package/dist/e1cbafb3a5880cd8e5532e2acf8b6998.js +1 -0
- package/dist/e1dbe800b2d3f5d74b2b5480ea2b897a.js +1 -0
- package/dist/e2792218bae78a6aef6764de4e61fd82.js +1 -0
- package/dist/e337fbde626a0753b0b7f6caf3208266.js +1 -0
- package/dist/e393bf5358fc198ca07e518900b24311.js +1 -0
- package/dist/e4d51c8b4202d444cb39db4e7642d7d9.js +1 -0
- package/dist/e53ab2ed7040ddd0541d4795f8d224e9.js +1 -0
- package/dist/e6c2b11f457b5aa71fd08de4ae738c3f.js +1 -0
- package/dist/e745f8fb4f054a3f5b66ccad100a1217.js +1 -0
- package/dist/e8250271e7641960341ae2ac170af4ac.js +1 -0
- package/dist/e9f63cc0a627466e1096f848ff476ca5.js +1 -0
- package/dist/ea5c101c16108be8cf1522aae5736f5f.js +1 -0
- package/dist/eb6f00b565c6441d02346354a0ef64ce.js +1 -0
- package/dist/ee0650a4d7fd0181d898e58648474a26.js +1 -0
- package/dist/ef2640638453d7df3e7e1659d1f67105.js +1 -0
- package/dist/efa2aae8c65855514b0ca66c4fe1cc68.js +1 -0
- package/dist/efc508c36f4e417ec6bd5ec72989443b.js +1 -0
- package/dist/f102c542cd35eef623ab82b087af2f14.js +1 -0
- package/dist/f120c3f4e008f9abcd3a576bd66dd315.js +1 -0
- package/dist/f2195d2eae3dbef7e3798e115209dcd7.js +1 -0
- package/dist/f2cfc0e604350e23bfcd7c78165b1411.js +1 -0
- package/dist/f35e34e60520cef0b0dbba2bc2931941.js +1 -0
- package/dist/f3a0f6e7e442de2ae51eddbf4eb98d97.js +1 -0
- package/dist/f3b6993cd8f9bbdd1d5ad68a5e1cdf70.js +1 -0
- package/dist/f457edce8a9809fa16aab3c8e695bf38.js +1 -0
- package/dist/f4ee92824c023ab7278694588c9c40f1.js +1 -0
- package/dist/f50d7c4ce743ce495230d19bd33fefab.js +1 -0
- package/dist/f5292be525fc36a337ce7bfb792070de.js +1 -0
- package/dist/f52e2798c3b260592cf35f3a20958d87.js +1 -0
- package/dist/f5dda2fc10c4a825f922a439633d70ea.js +1 -0
- package/dist/f61f1aaed3f32a7dabd977a6f47ecd5f.js +1 -0
- package/dist/f7443e8232a7e4289b9f2ed4a512750c.js +1 -0
- package/dist/f7b04f07406ef16d88688a7ffb81ce3f.js +1 -0
- package/dist/f80c6eb0f52a68464b21211240e3d6e6.js +1 -0
- package/dist/f88127ad8950e3c94c3af6c65a7120fa.js +1 -0
- package/dist/f913332fa21973f354fcb5b680811e56.js +1 -0
- package/dist/f95dc04dc50d90d0555ca3561e75c4c2.js +1 -0
- package/dist/fa1618cda4da7d5362c381ea2d5f7321.js +1 -0
- package/dist/faf460076b3383fdc3ecc224068964cf.js +1 -0
- package/dist/fb41d9c741510992c10cc1deb4e9f269.js +1 -0
- package/dist/fb4580529d9585e912b7142f6b62cae4.js +1 -0
- package/dist/fe4de7aeda3abed04c238956a8565de4.js +1 -0
- package/dist/fe51d45583c0425b00c9a784727072e0.js +1 -0
- package/dist/fe56e099960b1f5a3ac7143e245f7ce1.js +1 -0
- package/dist/fe58209a4ef163863b95ab289a69cdaf.js +1 -0
- package/dist/fe5fd32b764aa22fde63925ac549a9c9.js +1 -0
- package/dist/fffbc895129cdb3efeafa5b234743aa0.js +1 -0
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-322.1a602064fbfb22a5a7d0.js +0 -2
- package/dist/chunk-322.1a602064fbfb22a5a7d0.js.map +0 -1
- package/dist/chunk-564.dc6ec2a0e64e928cbe39.js +0 -2
- package/dist/chunk-564.dc6ec2a0e64e928cbe39.js.map +0 -1
- package/dist/chunk-82.3247bc18e2ce1c9526c4.js +0 -2
- package/dist/chunk-82.3247bc18e2ce1c9526c4.js.map +0 -1
- package/dist/chunk-894.58313a4b8efa74b80173.js +0 -25
- package/dist/chunk-894.58313a4b8efa74b80173.js.map +0 -1
- package/dist/chunk-actions.e503c18f1601b650fe22.js +0 -2
- package/dist/chunk-actions.e503c18f1601b650fe22.js.map +0 -1
- package/dist/chunk-docs-actions.4d26a36c311792924a4d.js +0 -2
- package/dist/chunk-docs-actions.4d26a36c311792924a4d.js.map +0 -1
- package/dist/chunk-vendor-fontawesome.16c50d38361e83bc0ae8.js +0 -6
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./packages/admin/src/components/ErrorView/ErrorView.js","webpack:///./packages/sso-login/src/utils/providers.js","webpack:///./packages/sso-login/src/modules/sagas.js","webpack:///./packages/sso-login/src/modules/actions.js","webpack:///./packages/sso-login/src/modules/reducer.js","webpack:///./packages/sso-login/src/modules/index.js","webpack:///./packages/sso-login/src/utils/loginWindow.js","webpack:///./packages/sso-login/src/utils/popUp.js","webpack:///./packages/sso-login/src/components/ProviderButton/StyledProviderButton.js","webpack:///./packages/sso-login/src/components/ProviderButton/ProviderButton.js","webpack:///./packages/sso-login/src/components/LoginBox/LoginBox.js","webpack:///./packages/sso-login/src/components/LoginBox/index.js","webpack:///./packages/sso-login/src/containers/LoginBoxContainer.js","webpack:///./packages/sso-login/src/main.js","webpack:///./packages/admin/src/components/Login/StyledComponents.js","webpack:///./packages/admin/src/components/Login/Login.js","webpack:///./packages/admin/src/components/Login/LoginContainer.js","webpack:///./packages/tocco-ui/src/BurgerButton/BurgerButton.js","webpack:///./packages/admin/src/components/MenuTree/StyledComponents.js","webpack:///./packages/admin/src/components/MenuTree/MenuItem.js","webpack:///./packages/admin/src/utils/navigationUtils.js","webpack:///./packages/admin/src/components/MenuTree/MenuTree.js","webpack:///./packages/admin/src/components/MenuTree/index.js","webpack:///./packages/admin/src/components/Navigation/StyledComponents.js","webpack:///./packages/admin/src/components/Navigation/menuType/StyledComponents.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuEntry.js","webpack:///./packages/admin/src/modules/preferences/selectors.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuEntryContainer.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuChildrenWrapper.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuChildrenWrapperContainer.js","webpack:///./packages/admin/src/components/Navigation/menuType/EntityExplorerEntry.js","webpack:///./packages/admin/src/components/Navigation/menuType/ActionEntry.js","webpack:///./packages/admin/src/components/Navigation/Navigation.js","webpack:///./packages/admin/src/components/Navigation/NavigationContainer.js","webpack:///./packages/admin/src/components/Navigation/index.js","webpack:///./packages/dashboard/src/modules/dashboard/actions.js","webpack:///./packages/dashboard/src/components/Dashboard/StyledComponents.js","webpack:///./packages/dashboard/src/utils/dropTypes.js","webpack:///./packages/dashboard/src/utils/infoBoxTypes.js","webpack:///./packages/dashboard/src/utils/dashboardUtils.js","webpack:///./packages/dashboard/src/components/Menu/StyledComponents.js","webpack:///./packages/dashboard/src/components/Menu/Menu.js","webpack:///./packages/dashboard/src/components/Menu/MenuContainer.js","webpack:///./packages/dashboard/src/utils/constants.js","webpack:///./packages/dashboard/src/components/InfoBox/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxHtmlFieldContent.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContent.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContentContainer.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContentProvider.js","webpack:///./packages/dashboard/src/components/InfoBox/InfoBoxContent.js","webpack:///./packages/dashboard/src/components/InfoBox/InfoBox.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardInfoBox.js","webpack:///./packages/dashboard/src/components/InfoBox/DropPreview.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardColumn.js","webpack:///./packages/dashboard/src/components/Dashboard/Dashboard.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardContainer.js","webpack:///./packages/dashboard/src/modules/dashboard/reducer.js","webpack:///./packages/dashboard/src/modules/dashboard/index.js","webpack:///./packages/dashboard/src/components/InfoBoxSettings/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBoxSettings/InfoBoxSettings.js","webpack:///./packages/dashboard/src/utils/positionUtils.js","webpack:///./packages/dashboard/src/modules/dashboard/sagas.js","webpack:///./packages/dashboard/src/modules/reducers.js","webpack:///./packages/dashboard/src/main.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/StyledComponents.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/Dashboard.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/DashboardContainer.js","webpack:///./packages/tocco-util/src/route/input.js","webpack:///./packages/tocco-util/src/route/route.js","webpack:///./packages/tocco-util/src/route/Router.js","webpack:///./packages/tocco-util/src/route/index.js","webpack:///./packages/tocco-util/src/route/asyncRoute.js","webpack:///./packages/admin/src/routes/entities/index.js","webpack:///./packages/admin/src/routes/docs/index.js","webpack:///./packages/admin/src/routes/settings/components/Settings/Settings.js","webpack:///./packages/admin/src/routes/settings/components/Settings/index.js","webpack:///./packages/tocco-ui/src/Button/StyledRouterLinkButton.js","webpack:///./packages/tocco-ui/src/Button/RouterLinkButton.js","webpack:///./packages/admin/src/components/Header/StyledComponents.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDot.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDotContainer.js","webpack:///./packages/admin/src/components/Header/NotificationCenterButton.js","webpack:///./packages/admin/src/components/AboutTocco/StyledComponents.js","webpack:///./packages/admin/src/components/AboutTocco/AboutTocco.js","webpack:///./packages/admin/src/components/AboutTocco/AboutToccoContainer.js","webpack:///./packages/admin/src/components/Header/Header.js","webpack:///./packages/admin/src/components/Header/HeaderContainer.js","webpack:///./packages/admin/src/components/Admin/StyledComponents.js","webpack:///./packages/admin/src/components/Admin/Admin.js","webpack:///./packages/admin/src/components/Admin/AdminContainer.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuard.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuardContainer.js","webpack:///./packages/admin/src/routes/entities/utils/navigationStrategy.js","webpack:///./packages/admin/src/utils/routing.js","webpack:///./packages/app-extensions/src/actions/actionComponentTypes.js","webpack:///./packages/app-extensions/src/actions/actions.js","webpack:///./packages/app-extensions/src/actions/modules/reducer.js","webpack:///./packages/app-extensions/src/actions/modules/actions.js","webpack:///./packages/app-extensions/src/actions/actionTypes.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/simpleAction.js","webpack:///./packages/app-extensions/src/actions/containers/simpleFormConnector.js","webpack:///./packages/app-extensions/src/actions/utils/report.js","webpack:///./packages/app-extensions/src/actions/components/StyledReportSettings.js","webpack:///./packages/app-extensions/src/actions/components/ReportSettings.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/report.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/customAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/legacyAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/index.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/preCheckHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/confirmHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/initialFormHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/largeSelectionHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/prepare.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/index.js","webpack:///./packages/app-extensions/src/actions/modules/sagas.js","webpack:///./packages/app-extensions/src/actions/components/selectionHelper.js","webpack:///./packages/app-extensions/src/actions/components/ActionGroup.js","webpack:///./packages/app-extensions/src/actions/components/SingleAction.js","webpack:///./packages/app-extensions/src/actions/components/Action.js","webpack:///./packages/app-extensions/src/actions/containers/ActionContainer.js","webpack:///./packages/app-extensions/src/actions/index.js","webpack:///./packages/app-extensions/src/actions/addToStore.js","webpack:///./packages/app-extensions/src/actions/utils/selection.js","webpack:///./packages/tocco-ui/src/Range/StyledRange.js","webpack:///./packages/tocco-ui/src/Range/rangeTypeMappings.js","webpack:///./packages/tocco-ui/src/Range/Range.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/decimal.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/integer.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/location.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/select.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/boolean.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/duration.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/html.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/phone.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/searchFilter.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/percent.js","webpack:///./packages/app-extensions/src/field/editableValueFactory.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/description.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/formattedValueFactory.js","webpack:///./packages/app-extensions/src/field/mappings.js","webpack:///./packages/app-extensions/src/field/fieldFactory.js","webpack:///./packages/app-extensions/src/field/index.js","webpack:///./packages/app-extensions/src/form/formErrors.js","webpack:///./packages/tocco-ui/src/Layout/LayoutBox.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/LayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/index.js","webpack:///./packages/app-extensions/src/formField/formField.js","webpack:///./packages/app-extensions/src/formField/index.js","webpack:///./packages/app-extensions/src/form/ReduxFormFieldAdapter.js","webpack:///./packages/app-extensions/src/form/enums/componentTypes.js","webpack:///./packages/app-extensions/src/form/formDefinition.js","webpack:///./packages/app-extensions/src/form/reduxForm.js","webpack:///./packages/app-extensions/src/form/enums/layoutTypes.js","webpack:///./packages/app-extensions/src/form/StyledFormBuilder.js","webpack:///./packages/app-extensions/src/form/FormBuilder.js","webpack:///./packages/app-extensions/src/form/validators/syncValidators.js","webpack:///./packages/app-extensions/src/form/validators/asyncValidators.js","webpack:///./packages/app-extensions/src/form/validators/index.js","webpack:///./packages/app-extensions/src/form/validators/mandatory.js","webpack:///./packages/app-extensions/src/form/asyncValidation.js","webpack:///./packages/app-extensions/src/form/enums/scopes.js","webpack:///./packages/app-extensions/src/form/transformInputValues.js","webpack:///./packages/app-extensions/src/form/index.js","webpack:///./packages/app-extensions/src/form/syncValidation.js","webpack:///./packages/app-extensions/src/formData/relationEntities/actions.js","webpack:///./packages/app-extensions/src/formData/relationEntities/reducer.js","webpack:///./packages/app-extensions/src/formData/tooltips/actions.js","webpack:///./packages/app-extensions/src/formData/tooltips/reducer.js","webpack:///./packages/app-extensions/src/formData/relationEntities/sagas.js","webpack:///./packages/app-extensions/src/formData/tooltips/sagas.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/actions.js","webpack:///./packages/app-extensions/src/formData/values/actions.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/StyledAdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearchContainer.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/utils.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/sagas.js","webpack:///./packages/app-extensions/src/formData/values/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/documents.js","webpack:///./packages/app-extensions/src/formData/upload/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/reducer.js","webpack:///./packages/app-extensions/src/formData/searchFilters/utils.js","webpack:///./packages/app-extensions/src/formData/searchFilters/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/actions.js","webpack:///./packages/app-extensions/src/formData/locations/utils.js","webpack:///./packages/app-extensions/src/formData/locations/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreate.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreateContainer.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/sagas.js","webpack:///./packages/app-extensions/src/formData/formData.js","webpack:///./packages/app-extensions/src/formData/FormDataContainer.js","webpack:///./packages/app-extensions/src/formData/index.js","webpack:///./packages/app-extensions/src/remoteEvents/index.js","webpack:///./packages/app-extensions/src/remoteEvents/actions.js","webpack:///./packages/entity-list/src/modules/entityList/actions.js","webpack:///./packages/entity-list/src/util/searchFormTypes.js","webpack:///./packages/entity-list/src/modules/entityList/reducer.js","webpack:///./packages/entity-list/src/modules/entityList/index.js","webpack:///./packages/entity-list/src/modules/list/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/actions.js","webpack:///./packages/entity-list/src/modules/preferences/actions.js","webpack:///./packages/entity-list/src/modules/entityList/sagas.js","webpack:///./packages/entity-list/src/modules/list/reducer.js","webpack:///./packages/entity-list/src/modules/list/index.js","webpack:///./packages/entity-list/src/util/api/fetchOptions.js","webpack:///./packages/entity-list/src/modules/selection/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/StyledComponents.js","webpack:///./packages/entity-list/src/util/StyledComponents.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancer.js","webpack:///./packages/entity-list/src/util/lazyLoading.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancerContainer.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/index.js","webpack:///./packages/entity-list/src/util/fieldFactory.js","webpack:///./packages/entity-list/src/util/cellRenderer.js","webpack:///./packages/entity-list/src/util/api/forms.js","webpack:///./packages/entity-list/src/util/searchFormValidation.js","webpack:///./packages/entity-list/src/components/ColumnPicker/StyledColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPickerContainer.js","webpack:///./packages/entity-list/src/components/ColumnPicker/index.js","webpack:///./packages/entity-list/src/modules/searchForm/sagas.js","webpack:///./packages/entity-list/src/util/api/entities.js","webpack:///./packages/entity-list/src/modules/list/sagas.js","webpack:///./packages/entity-list/src/modules/searchForm/reducer.js","webpack:///./packages/entity-list/src/modules/searchForm/index.js","webpack:///./packages/entity-list/src/modules/selection/reducer.js","webpack:///./packages/entity-list/src/modules/selection/index.js","webpack:///./packages/entity-list/src/util/selectionStyles.js","webpack:///./packages/entity-list/src/util/selection.js","webpack:///./packages/entity-list/src/modules/selection/sagas.js","webpack:///./packages/entity-list/src/modules/preferences/reducer.js","webpack:///./packages/entity-list/src/modules/preferences/index.js","webpack:///./packages/entity-list/src/util/preferences.js","webpack:///./packages/entity-list/src/modules/preferences/sagas.js","webpack:///./packages/entity-list/src/modules/reducers.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/FullTextSearchForm.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/index.js","webpack:///./packages/entity-list/src/containers/FullTextSearchFormContainer.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/StyledBasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/BasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/index.js","webpack:///./packages/entity-list/src/containers/BasicSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/StyedComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/utils.js","webpack:///./packages/entity-list/src/components/SearchFilterList/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterList.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterListContainer.js","webpack:///./packages/entity-list/src/components/SearchFilterList/index.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchForm.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/index.js","webpack:///./packages/entity-list/src/components/SearchView/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchView/SearchView.js","webpack:///./packages/entity-list/src/components/SearchView/index.js","webpack:///./packages/entity-list/src/containers/SearchViewContainer.js","webpack:///./packages/entity-list/src/components/SelectionController/StyledSelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/SelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/index.js","webpack:///./packages/entity-list/src/containers/SelectionControllerContainer.js","webpack:///./packages/entity-list/src/components/Table/NavigationCellHeader.js","webpack:///./packages/entity-list/src/components/Table/navigationCell.js","webpack:///./packages/entity-list/src/components/Table/StyledComponents.js","webpack:///./packages/entity-list/src/components/Table/markingCell.js","webpack:///./packages/entity-list/src/components/Table/Table.js","webpack:///./packages/entity-list/src/components/Table/index.js","webpack:///./packages/entity-list/src/containers/TableContainer.js","webpack:///./packages/entity-list/src/util/actions.js","webpack:///./packages/entity-list/src/containers/ActionContainer.js","webpack:///./packages/entity-list/src/components/ListView/StyledComponents.js","webpack:///./packages/entity-list/src/components/ListView/ListView.js","webpack:///./packages/entity-list/src/components/ListView/index.js","webpack:///./packages/entity-list/src/containers/ListViewContainer.js","webpack:///./packages/entity-list/src/components/EntityList/StyledComponents.js","webpack:///./packages/entity-list/src/components/EntityList/EntityList.js","webpack:///./packages/entity-list/src/components/EntityList/EntityListContainer.js","webpack:///./packages/entity-list/src/components/EntityList/index.js","webpack:///./packages/entity-list/src/input.js","webpack:///./packages/entity-list/src/customActions.js","webpack:///./packages/entity-list/src/main.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/actions.js","webpack:///./packages/login/src/modules/passwordRequest/actions.js","webpack:///./packages/login/src/modules/login/actions.js","webpack:///./packages/login/src/types/Pages.js","webpack:///./packages/login/src/components/StyledLoginForm.js","webpack:///./packages/login/src/components/LoginForm/LoginForm.js","webpack:///./packages/login/src/components/LoginForm/index.js","webpack:///./packages/login/src/modules/actions.js","webpack:///./packages/login/src/containers/LoginFormContainer.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/ValidationRules.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/index.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/messages.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/FailureMessage.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/index.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/actions.js","webpack:///./packages/login/src/modules/passwordUpdate/password/actions.js","webpack:///./packages/login/src/containers/PasswordUpdateDialogContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/actions.js","webpack:///./packages/login/src/components/PasswordRequest/PasswordRequest.js","webpack:///./packages/login/src/components/PasswordRequest/index.js","webpack:///./packages/login/src/containers/PasswordRequestContainer.js","webpack:///./packages/login/src/components/TwoStepLoginForm/StyledTwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/TwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/actions.js","webpack:///./packages/login/src/containers/TwoStepLoginContainer.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/TwoFactorConnectorForm.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/index.js","webpack:///./packages/login/src/containers/TwoFactorConnectorContainer.js","webpack:///./packages/login/src/components/Login/Login.js","webpack:///./packages/login/src/components/Login/index.js","webpack:///./packages/login/src/containers/LoginContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/utils.js","webpack:///./packages/login/src/modules/passwordUpdate/password/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/password/index.js","webpack:///./packages/login/src/modules/passwordUpdate/password/validate.js","webpack:///./packages/login/src/modules/loginForm/actions.js","webpack:///./packages/login/src/modules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/reducers.js","webpack:///./packages/login/src/modules/login/reducer.js","webpack:///./packages/login/src/modules/login/index.js","webpack:///./packages/login/src/modules/loginForm/reducer.js","webpack:///./packages/login/src/modules/loginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/sagas.js","webpack:///./packages/login/src/modules/twoStepLogin/reducer.js","webpack:///./packages/login/src/modules/twoStepLogin/index.js","webpack:///./packages/login/src/modules/passwordRequest/sagas.js","webpack:///./packages/login/src/modules/passwordRequest/reducer.js","webpack:///./packages/login/src/modules/passwordRequest/index.js","webpack:///./packages/login/src/modules/reducers.js","webpack:///./packages/login/src/main.js","webpack:///./packages/simple-form/src/modules/simpleForm/actions.js","webpack:///./packages/simple-form/src/modules/simpleForm/reducer.js","webpack:///./packages/simple-form/src/modules/simpleForm/index.js","webpack:///./packages/simple-form/src/modules/simpleForm/sagas.js","webpack:///./packages/simple-form/src/modules/reducers.js","webpack:///./packages/simple-form/src/components/Form/StyledComponents.js","webpack:///./packages/simple-form/src/components/Form/Form.js","webpack:///./packages/simple-form/src/components/Form/index.js","webpack:///./packages/simple-form/src/containers/FormContainer.js","webpack:///./packages/simple-form/src/main.js","webpack:///./packages/tocco-ui/src/AdminLink/linkStyle.js","webpack:///./packages/tocco-ui/src/AdminLink/StyledLink.js","webpack:///./packages/tocco-ui/src/Breadcrumbs/StyledBreadcrumbs.js","webpack:///./packages/tocco-ui/src/Breadcrumbs/Breadcrumbs.js","webpack:///./packages/tocco-ui/src/ButtonGroup/ButtonGroup.js","webpack:///./packages/tocco-ui/src/ButtonGroup/StyledButtonGroup.js","webpack:///./packages/tocco-ui/src/Select/ClearIndicator.js","webpack:///./packages/tocco-ui/src/Select/DropdownIndicator.js","webpack:///./packages/tocco-ui/src/Select/IndicatorsContainer.js","webpack:///./packages/tocco-ui/src/Select/LoadingIndicator.js","webpack:///./packages/tocco-ui/src/Select/Menu.js","webpack:///./packages/tocco-ui/src/Select/MenuList.js","webpack:///./packages/tocco-ui/src/Select/ClickableWrapper.js","webpack:///./packages/tocco-ui/src/Select/MultiValueLabel.js","webpack:///./packages/tocco-ui/src/Select/SingleValue.js","webpack:///./packages/tocco-ui/src/Select/Select.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/SingleSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/MultiSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledStringEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StringEdit.js","webpack:///./packages/tocco-util/src/userAgent/index.js","webpack:///./packages/tocco-util/src/userAgent/userAgent.js","webpack:///./packages/tocco-ui/src/TextareaAutosize/StyledComponents.js","webpack:///./packages/tocco-ui/src/TextareaAutosize/TextareaAutosize.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/TextEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledDateAbstract.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateAbstract.js","webpack:///./packages/tocco-ui/src/EditableValue/utils.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateTimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledTimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/TimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/BoolEdit.js","webpack:///./packages/tocco-ui/src/Upload/StyledView.js","webpack:///./packages/tocco-ui/src/Upload/View.js","webpack:///./packages/tocco-ui/src/Upload/helpers.js","webpack:///./packages/tocco-ui/src/Upload/StyledUploadProgress.js","webpack:///./packages/tocco-ui/src/Upload/UploadProgress.js","webpack:///./packages/tocco-ui/src/Upload/StyledUploadInput.js","webpack:///./packages/tocco-ui/src/Upload/SyledUploadInput.js","webpack:///./packages/tocco-ui/src/Upload/UploadInput.js","webpack:///./packages/tocco-ui/src/Upload/Upload.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/Document.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/HtmlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/RemoteSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/MultiRemoteSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/SearchFilterEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledUrlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/UrlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledPhoneEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/PhoneEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledDurationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DurationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledNumberEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/NumberEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/IntegerEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledLocationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/LocationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditorFactory.js","webpack:///./packages/tocco-ui/src/EditableValue/EditableValue.js","webpack:///./packages/tocco-ui/src/EditableValue/StyledEditableValue.js","webpack:///./packages/tocco-ui/src/DatePicker/GlobalDatePickerStyles.js","webpack:///./packages/tocco-ui/src/GlobalStyles/GlobalStyles.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutBox.js","webpack:///./packages/tocco-ui/src/Menu/BallMenu.js","webpack:///./packages/tocco-ui/src/Menu/ButtonMenu.js","webpack:///./packages/tocco-ui/src/Menu/Menu.js","webpack:///./packages/tocco-ui/src/Menu/MenuItem.js","webpack:///./packages/tocco-ui/src/Menu/StyledComponents.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/MultiCheckbox.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/index.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanel.js","webpack:///./packages/tocco-ui/src/Panel/Panel.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/PanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelBody.js","webpack:///./packages/tocco-ui/src/Panel/PanelBody.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/PanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/index.js","webpack:///./packages/tocco-ui/src/QRCode/QRCode.js","webpack:///./packages/tocco-ui/src/SearchBox/StyledSearchBox.js","webpack:///./packages/tocco-ui/src/SearchBox/SearchBox.js","webpack:///./packages/tocco-ui/src/SearchBox/index.js","webpack:///./packages/tocco-ui/src/SignalList/StyledSignalListItem.js","webpack:///./packages/tocco-ui/src/SignalList/StyledSignalList.js","webpack:///./packages/tocco-ui/src/SignalList/SignalList.js","webpack:///./packages/tocco-ui/src/SignalList/SignalListItem.js","webpack:///./packages/tocco-ui/src/SignalList/index.js","webpack:///./packages/tocco-ui/src/StatedValue/ErrorList.js","webpack:///./packages/tocco-ui/src/StatedValue/StatedValue.js","webpack:///./packages/tocco-ui/src/StatedValue/StyledStatedValue.js","webpack:///./packages/tocco-ui/src/Table/ResizingController.js","webpack:///./packages/tocco-ui/src/Table/StyledTable.js","webpack:///./packages/tocco-ui/src/Table/selection/useSelection.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionStyles.js","webpack:///./packages/tocco-ui/src/Table/selection/SingleSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectHeader.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionColumnEnhancer.js","webpack:///./packages/tocco-ui/src/Table/SortingState.js","webpack:///./packages/tocco-ui/src/Table/TableHeader.js","webpack:///./packages/tocco-ui/src/Table/StaticCell.js","webpack:///./packages/tocco-ui/src/Table/TableBody.js","webpack:///./packages/tocco-ui/src/Pagination/StyledComponents.js","webpack:///./packages/tocco-ui/src/Pagination/Pagination.js","webpack:///./packages/tocco-ui/src/Pagination/index.js","webpack:///./packages/tocco-ui/src/Table/TableFooter.js","webpack:///./packages/tocco-ui/src/Table/Table.js","webpack:///./packages/tocco-ui/src/utilStyles/colorMap.js","webpack:///./packages/tocco-util/src/api/entities.js","webpack:///./packages/tocco-util/src/api/table.js","webpack:///./packages/tocco-util/src/api/index.js","webpack:///./packages/tocco-util/src/api/display.js","webpack:///./packages/tocco-util/src/dragAndDrop/useDnD.js","webpack:///./packages/tocco-util/src/dragAndDrop/index.js","webpack:///./packages/tocco-util/src/queryString/queryString.js","webpack:///./packages/tocco-util/src/queryString/index.js","webpack:///./packages/tocco-util/src/resize/measureSize.js","webpack:///./packages/tocco-util/src/resize/index.js","webpack:///./packages/tocco-util/src/resize/useResize.js","webpack:///./packages/tocco-util/src/tqlBuilder/tqlBuilder.js","webpack:///./packages/tocco-util/src/tqlBuilder/index.js","webpack:///./packages/tocco-util/src/validation/validation.js","webpack:///./packages/tocco-util/src/validation/index.js","webpack:///./packages/tocco-util/src/viewPersistor/viewPersistor.js","webpack:///./packages/tocco-util/src/viewPersistor/index.js","webpack:///./packages/two-factor-connector/src/modules/actions.js","webpack:///./packages/two-factor-connector/src/modules/sagas.js","webpack:///./packages/two-factor-connector/src/modules/reducer.js","webpack:///./packages/two-factor-connector/src/modules/index.js","webpack:///./packages/two-factor-connector/src/components/GlobalStyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Start/Start.js","webpack:///./packages/two-factor-connector/src/components/Start/StartContainer.js","webpack:///./packages/two-factor-connector/src/components/Start/index.js","webpack:///./packages/two-factor-connector/src/components/Secret/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Secret/Secret.js","webpack:///./packages/two-factor-connector/src/components/Secret/SecretContainer.js","webpack:///./packages/two-factor-connector/src/components/Secret/index.js","webpack:///./packages/two-factor-connector/src/components/Verification/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Verification/Verification.js","webpack:///./packages/two-factor-connector/src/components/Verification/VerificationContainer.js","webpack:///./packages/two-factor-connector/src/components/Verification/index.js","webpack:///./packages/two-factor-connector/src/components/Result/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Result/Result.js","webpack:///./packages/two-factor-connector/src/components/Result/ResultContainer.js","webpack:///./packages/two-factor-connector/src/components/Result/index.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnector.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnectorContainer.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/index.js","webpack:///./packages/two-factor-connector/src/main.js","webpack:///./packages/admin/src/assets/tocco-circle.svg","webpack:///./packages/admin/src/assets/tocco_red.svg","webpack:///./packages/admin/src/assets/tocco_white.svg"],"names":["StyledErrorView","styled","scale","StyledIconWrapper","theme","icon","title","message","transformProviderEntities","response","data","map","provider","_reduce","paths","result","value","key","loadProviders","loginCompleted","mainSagas","intlSelector","state","intl","select","query","conditions","locale","active","call","rest","method","entities","put","type","payload","providers","cache","externalEvents","all","takeLatest","ACTION_HANDLERS","reducerUtil","initialState","ssoLogin","action","handler","sagas","rootSaga","openLoginWindow","loginEndpoint","encodedWindowUrl","encodeURIComponent","window","location","href","url","__BACKEND_URL__","unique_id","popUp","open","label","height","width","features","left","screen","top","resizable","scrollbars","status","join","getPopUpFeatures","ssoPopUpCallback","close","StyledButton","props","declareInteractionColors","generateInteractionColors","bg","primaryColor","fg","secondaryColor","_get","StyledProviderButton","button_primary_color","button_secondary_color","onClick","button_icon","position","button_label","StyledButtonContainer","LoginBox","prevProps","prevState","snapshot","this","autoLogin","length","autoLoginProvider","find","entity","idx","React","mapActionCreators","connect","input","ssoLoginEndpoint","EXTERNAL_EVENTS","LoginBoxContainer","initApp","id","events","publicPath","content","store","appFactory","reducers","actions","textResourceModules","SsoLoginApp","reduce","event","app","component","GlobalBodyStyle","createGlobalStyle","StyledLogin","ToccoLogo","StyledHeadingLogin","StyledH1","StyledSpanLogin","StyledSpan","StyledLoginWrapper","StyledSloganImg","StyledMobileSloganImg","StyledSsoMsg","StyledSsoError","breakWords","src","ToccoSlogan","alt","ssoAvailable","loginSuccessful","checkSsoAvailable","useState","showError","setShowError","showRegistrationText","setShowRegistrationText","Cookies","useEffect","successful","registration","expires","SsoLoginPart","loginSuccess","timeout","showTitle","session","injectIntl","Login","isOpen","size","color","lineProps","stroke","vectorEffect","strokeWidth","initial","animate","transition","ease","duration","LazyMotion","then","res","m","viewBox","overflow","preserveAspectRatio","aria-label","formatMessage","x1","x2","y1","y2","variants","closed","rotate","translateY","opened","opacity","StyledMenuEntry","declareFont","level","childrenCount","StyledMenuEntryWrapper","MenuItem","item","menuTreePath","typeMapping","mappedType","menuType","Component","ChildrenWrapperComponent","childrenWrapperComponent","MenuItems","children","child","name","data-cy","getMenuPreferencesKey","preferencesPrefix","getCompleteMenuPreferences","items","collapse","acc","hasChildren","MenuTree","searchFilter","requireSearch","prepareMenuTree","isParentMatching","includeInTree","matchingAttribute","getMatchingAttribute","filterAttributes","attr","toLowerCase","includes","undefined","itemMatching","Boolean","filter","secondary","secondaryLight","StyledNav","StyledSearchBox","StyledTabsContainer","StyledNavSwitchButton","Button","StyledNavButton","narrow","StyledSearchBoxWrapper","StyledMenuWrapper","StyledScrollbar","StyledMenuButtonsWrapper","StyledMenuButton","Ball","StyledMenuLink","Link","StyledIconLink","StyledMenuLinkWrapper","StyledTogglerIconWrapper","StyledMenuIconWrapper","StyledMenuChildrenWrapper","canCollapse","saveUserPreferences","toggleMenyEntryCollapsed","menuIsOpenPrefrencesSelector","preferences","userPreferences","MenuEntry","MenuChildrenWrapper","entityNameDisplay","data-quick-navigation","to","target","rel","tabs","MODULES","SETTINGS","SYSTEM","COMPLETE","createMenuTypeMap","hasFilterApplied","EntityExplorerEntry","ActionEntry","modulesMenuTree","settingsMenuTree","systemMenuTree","completeMenuTree","menuOpen","activeMenuTab","setActiveMenuTab","setVisibleMenus","visibleMenus","inputEl","useRef","navigationEl","setFilter","showMenu","tabMenuMap","modulesTypeMap","useMemo","settingsTypeMap","systemTypeMap","completeTypeMap","current","focus","msg","changeMenuTab","tab","ref","onKeyDown","e","focusableElements","currentIdx","preventDefault","querySelectorAll","findIndex","el","document","activeElement","isEqualNode","SearchBox","minInputLength","onSearch","placeholder","navigation","Navigation","setDashboard","infoBoxes","StyledDashboardWrapper","StyledColumnWrapper","StyledColumn","StyledInfoBoxWrapper","StyledResizeHandle","shadeColor","isReszing","Column","InfoBox","InfoBoxRenderTypes","sortInfoBoxes","boxes","sort","a","b","col","row","reindex","sortedBoxes","box","index","nextIndex","insertDraggedAtDropped","draggingId","dragOverId","dragOverColumn","draggingBox","moveBoxHere","dragAndDrop","displayInfoBoxSettings","resetInfoBoxSettings","BallMenu","buttonProps","Menu","colorizeBorder","StyledDroppedPreview","StyledInfoBoxContentWrapper","scrollable","text","FormattedValue","DetailLinkRelative","entityKey","entityModel","StyledLink","navigationStrategy","emitAction","searchfilter","entityName","scope","limit","formName","searchFilters","showActions","onRowClick","openDetail","searchFormType","searchFormPosition","selectionStyle","sortable","disableSelectionController","showLink","actionEmitter","InfoBoxSearchFilterContent","htmlfield","InfoBoxHtmlFieldContent","InfoBoxSearchFilterContentContainer","InfoBoxContent","consoleLogger","propTypes","PropTypes","Typography","infoBox","isResizing","startResize","onDragStart","onDragEnter","onDragOver","onDrop","draggable","onMouseDown","resizeState","dndState","makeDndEvents","currentlyDragOver","resizingElement","DropTypes","storedInfoBoxes","saveInfoBoxHeight","saveInfoBoxPositions","setInfoBoxes","columns","Array","keys","onInfoBoxHeightChanged","useCallback","finalHeight","c","onInfoBoxHeightChanging","resize","querySelector","resizingEvents","currentlyDragging","dragOverType","updatedInfoBoxes","appendDraggedAsLastItemToDropped","moveDraggedToDropped","dndEvents","dropPosition","column","isOverItself","draggingPreviewBox","renderBoxes","folded","showPreviewHere","getRenderInfoBoxesForColumn","dashboard","Dashboard","StyledButtonWrapper","StyledUl","StyledLabel","StyledCheckbox","initialInfoBoxes","onOk","checked","onChange","for","look","isUnpositionedInfoBox","distributeInfoBoxes","unpositionedInfoBoxes","positionedInfoBoxes","numberOfBoxesPerCol","minCol","Object","min","parseInt","numberOfBoxes","Number","MAX_VALUE","getColumnWithMinAmountOfInfoBoxes","prepareInfoBoxes","split","Math","max","mapPositionToColAndRow","loadDashboard","saveInfoBoxSettings","saveInfoBoxPreferences","dashboardSelector","takeEvery","options","body","infoboxes","channel","answerChannel","notification","take","dashboardReducer","dashboardSagas","DashboardContainer","handleNotifications","DashboardApp","StyledWrapper","StyledBreadcrumbs","match","history","Breadcrumbs","currentView","display","pathPrefix","loadedComponents","importRouteDependencies","getComponent","Promise","resolve","imported","route","forEach","saga","sagaUtil","inputDispatches","inputDispatch","actionCreator","mandatory","defaultValue","logger","prototype","hasOwnProperty","dispatch","dispatchInput","container","AsyncComponent","mounted","setState","ignoredAttributes","areEqual","nextProps","diff","js","clean","_omitBy","_omit","v","entries","memo","ReactReduxContext","useStore","buttonStyle","aria","ink","iconOnly","design","StyledBackgroundCover","StyledHeader","StyledConfig","StyledBackgroundLogo","runEnv","colors","primary","StyledPopper","StyledNotificationBellWrapper","StyledBall","StyledRedDot","AdminLink","unreadNotificationKeys","innerRef","center","NotificationCenterRedDot","popperModifiers","offset","padding","visible","setVisibility","referenceElement","popperElement","redDotElement","handleMouseDown","contains","addEventListener","removeEventListener","usePopper","modifiers","styles","attributes","NotificationCenterRedDotContainer","ReactDOM","style","popper","StyledFormattedMessageWrapper","StyledBlockWrapper","StyledLogo","niceVersion","niceRevision","dangerouslySetInnerHTML","__html","neutral","serverSettings","AboutTocco","StyledBallMenuWrapper","username","currentBusinessUnit","businessUnits","loadBusinessUnits","changeBusinessUnit","doLogout","openModalComponent","removeModalComponent","info","ButtonMenu","onOpen","bU","disabled","success","onSuccess","replace","Header","calcViewportHeight","vh","documentElement","clientHeight","setProperty","StyledContent","StyledMenu","SlideMenu","burgerMenuStyles","bmBurgerButton","outline","zIndex","bmBurgerBarsHover","background","bmMenuWrap","minWidth","bmMenu","fontSize","bmMorphShape","fill","bmItemList","bmItem","bmOverlay","GlobalStyles","exact","from","path","DashboardRoute","EntitiesRoute","Settings","DocsRoute","ErrorView","withTheme","initializeNavigation","setMenuOpen","baseRoute","confirm","loadPrincipal","loadSettingsAndPreferences","adminAllowed","setHistory","initializeHistory","browserHistory","createBrowserHistory","basename","getUserConfirmation","confirmCallback","LoadMask","required","onStateChange","customCrossIcon","customBurgerIcon","paper","pageWrapId","outerContainerId","viewPersistor","render","login","Admin","Helmet","defer","doSessionCheck","loggedIn","loadingText","LoginGuard","relation","DetailLink","ListLink","entityKeys","queryString","pathname","search","ListOrDetailLink","navigateToCreateRelative","relationName","push","entityBaseUrl","goBack","navigateToActionRelative","definition","selection","queryStringUtil","actionProperties","properties","appId","inNewTab","createHref","amount","normalizedUrl","i","substring","lastIndexOf","freeze","ACTION","REPORT","ACTION_GROUP","ACTION_BAR","isAction","componentType","values","componentTypes","indexOf","modeFitsScopes","mode","scopes","reducer","ACTION_INVOKE","ACTION_IN_PROGRESS","ACTION_INVOKED","actionInvoke","parent","actionInvoked","CUSTOM","SIMPLE","DIVIDER","LEGACY","invokeActionAsync","invokeActionSync","invokeRequest","showToaster","params","runAsync","runInBackgroundTask","invokeFnc","endpoint","formProperties","acceptedErrorCodes","headers","randomId","uuid","progressMsg","remoteEvents","errorCode","validation","errors","downloadUrl","download","fileResponse","filename","errorLogging","notificationKey","TOASTER_KEY_PREFIX","cancelTask","NotificationBody","DISPLAY","DOWNLOAD","getFormDefinition","settingsDefinition","extractFields","field","dataType","description","targetEntity","hidden","readonly","modelid","layoutType","customSettings","form","generalSettings","recipient","StyledReportSettings","StyledStickyButtons","formApp","onSubmit","listApp","customSettingsDefined","valid","customSettingsValid","settings","setSettings","settingsRef","SimpleFormContainer","simpleFormConnector","noButtons","transform","groupedValues","groupValues","getGroupedValues","isArray","displayReportSettings","awaitSettingsSubmit","actionDefinition","config","settingsModalId","queryParams","model","ids","resource","reportId","formValues","recipientSettings","customSettingsEntity","api","__model","additionalProperties","formData","handleCustomActionModal","handleFullScreenActions","handleAppActionsFallback","handleAnswer","fullscreen","customActions","appComponent","actionStatus","ActionComponent","context","onError","onCancel","loadSequentially","readRemoteEvents","registerRemoteEventsListener","handleNotification","readNotifications","registerNotificationsListener","initLegacyActionsEnv","getSelection","getScope","loadScript","reject","s","createElement","onload","onerror","head","appendChild","loadCss","getElementsByTagName","link","media","sources","currentEnv","legacyActionEnv","source","envs","f","channelFeedingCallback","arg","remoteEventsChannel","getDataRegistry","dataRegistry","setNewClientCallback","callback","spawn","newNotification","Error","notificationsChannel","getGui","gui","getNotifier","notifier","legacyActionsEnvInitialized","setUpLegacyActionsEnv","listSelector","list","entityListSelector","entityList","entityDetailSelector","entityDetail","getManualQuery","listState","nice2","netui","ManualQuery","queryWhere","where","queryOrderBy","sortingArray","sorting","getListFormId","FormIdentifier","formDefinition","legacySelection","selectedEntities","selectionType","manualQuery","listForm","detail","ClientActionDefinition","setEnabled","readOnly","_isPlainObject","setPropertyEffects","entityExplorer","modules","NewClientLegacyActionsModule","init","panel","NewClientLegacyActionsPanel","ctx","entityexplorer","EntityExplorerActionContext","getRecord","situation","NetuiActionRegistry","newActionFromDefinition","getSelectionNumber","perform","actionTypes","handleSimpleAction","handleReportAction","handleCustomAction","handleLegacyAction","preCheckHandler","preparationResponse","preCheck","abort","abortMessage","confirmHandler","promptConfirm","confirmMessage","confirmResponse","onYes","initialFormHandler","handleInitialForm","initialFormValues","defaultValues","formTitle","formMessage","Date","valueOf","onSend","largeSelectionHandler","threshold","confirmationThreshold","count","doRequest","run","getHandlers","handlers","handlerResponse","invokeAction","prepare","actionHandler","actionHandlers","actionType","remoteEvent","isValidSelection","selectedCount","minSelection","maxSelection","notEnough","tooMany","selectionText","hasDefaultAction","defaultAction","onClickHandler","actionId","childDefinition","getChildMenuItems","validSelection","isActionGroup","getLabel","shouldUseLabel","getTitle","useLabel","buttonType","withoutBackground","stopPropagation","ActionVisual","customRenderedActions","ActionType","ActionGroup","SingleAction","Action","addToStore","sagaMiddleware","sagasUtil","errorLoging","getSingleEntitySelection","StyledInputWrapper","StyledInputItemWrapper","StyledRange","StyledInput","StyledExtender","datetimeFormat","datetime","toRange","moment","utc","format","add","isRangeValue","fromRange","local","getToOptions","fromValue","flatpickrOptions","minDate","getFromOptions","toValue","maxDate","date","hasRangeValue","exactEvents","toEvents","fromEvents","rangeTypeMappings","baseType","EditableValue","getFromOrTo","getRangeValue","getOptions","formField","postPointDigits","prePointDigits","minValue","maxValue","allowNegative","upload","uploadDocument","uploadText","uploadingText","downloadText","deleteText","fixLabel","dataContainerProps","relationEntities","tooltips","moreOptionsAvailable","isLoading","fetchOptions","loadRelationEntities","forceReload","order","formBase","searchOptions","searchTerm","openAdvancedSearch","loadTooltip","noResultsText","moreOptionsAvailableText","createPermission","openRemoteCreate","constriction","boolean","number","decimal","hoursLabel","minutesLabel","integer","hasValue","locationMapping","city","postcode","getValue","filteredLocationData","renamedLocationData","locKey","filteredLocDataKey","getEvents","locationObject","changeFieldValue","onBlur","touchField","locations","fields","isDirty","fetchSuggestions","country","loadLocationsSuggestions","suggestions","mapButtonTitle","fixedDecimalScale","remote","customPhoneRegex","defaultCountry","isMulti","multiple","loadSearchFilters","group","EditableValueFactory","range","formType","editableTypeConfigs","currentValue","Range","fromText","toText","downloadTitle","FormattedValueFactory","fieldType","formattedTypeConfigs","overwrittenValue","editableMapping","editableValueFactory","formattedValueFactory","readOnlyMapping","editable","binary","image","birthdate","updatets","createts","moneyamount","percent","long","counter","time","factory","mappingType","mappings","getFieldErrors","formErrors","fieldErrors","getGeneralErrors","hasFieldErrors","getValidatorErrors","hasValidatorErrors","hasRelatedEntityErrors","hasOutdatedError","getFirstErrorField","getRelatedEntityErrorsCompact","relatedEntityErrors","relatedEntityError","entityValidatorErrors","r","_forOwn","fieldName","errorKey","addErrors","outdatedResponseToFormError","_pick","sameEntity","getOutdatedError","LayoutBox","StyledLayoutBox","containerWidth","minBoxWidth","occupiesRemainingHeight","LayoutContainer","setContainerWidth","setPixelWidth","offsetWidth","defaultProps","Box","Container","FormFieldWrapper","hasValueOverwrite","typeEditable","StatedValue","dirty","error","displayFieldTypes","multiTypes","isMultipleFields","displayFieldAsDisplayOnly","parentReadOnly","MultiSeparator","ValueField","fieldMappingType","Field","prev","curr","resources","requestedFromData","formDefinitionField","entityField","touched","submitting","isDisplay","immutable","mandatoryTitle","exception","ReduxFormFieldAdapter","meta","extractEventsFromInput","fomFieldData","isRequired","FIELD_SET","FIELD","LAYOUT","TABLE","SUB_TABLE","getFieldId","validFieldTypes","getFieldsOfChildren","ignoreCopy","typePathsHandlers","fieldDefinition","validationErrorToFormError","transformFieldName","transformFieldNameBack","formValuesToFlattenEntity","val","getDirtyFields","initialValues","isCreate","dirtyFields","_isEqual","VERTICAL_BOX","HORIZONTAL_BOX","StyledActionsWrapper","FormBuilder","componentMapping","beforeRenderField","modeFitsScope","formTraverser","createLayoutComponent","createAction","createFieldSet","createCustomComponent","fieldSet","writable","hasEmptyValue","shouldRenderField","elements","Panel","isFramed","LayoutComponent","layoutTypes","Layout","minLength","maxLength","maxNumber","toString","prePoint","pattern","RegExp","test","isEmail","isUrl","require_tld","syncValidators","asyncValidators","phone","phoneValidation","libphone","isValidCustomRegex","customRegex","isValidPhoneNumber","isValidNumber","defaultRegion","mandatoryError","valueDefined","hasError","localeValidation","fieldDefinitions","validators","asyncValidatorKey","_has","validatorValue","validator","validatorErrors","validateRequest","flattenEntity","_validate","resp","asyncValidation","localeValidationErrors","validateRequestErrors","CREATE","UPDATE","loadDisplays","transformInputValues","displayRequest","fieldModel","arrayValue","relationFieldTransformer","displays","fieldTypeTransformer","multi","formErrorsUtil","getFieldDefinitions","getDefaultValues","valueObj","getUsedPaths","_uniq","accumulator","entityToFormValues","syncValidation","syncValidatorKey","submitValidation","SubmissionError","isValueEmpty","setRelationEntityLoading","setRelationEntities","moreEntitiesAvailable","setToolTip","tooltip","enhanceEntitiesWithDisplays","loadRelationEntity","requestedDisplays","fieldDataSelector","fieldData","dataLoaded","relationEntitiesActions","getQuery","requestOptions","splice","loadToolTip","tooltipSelector","tooltipActions","advancedSearchUpdate","StyledAdvancedSearch","StyledAdvancedSearchButtonWrapper","listFormDefinition","onSelectionChange","onOkClick","ListApp","showSearchForm","onSelectChange","selectOnRowClick","AdvancedSearch","getAdvancedSearchComponent","fieldId","AdvancedSearchContainer","closeAdvancedSearch","textResourceSelector","messages","fieldFormBase","formNameField","remoteFieldFormName","modalId","advancedSearchTitle","advancedSearchComponent","advancedSearchActions","modalOpen","valueActions","changeValue","formActions","UPLOAD_ENDPOINT_URL","uploadRequest","file","FormData","append","fetch","credentials","json","documentToFormValueTransformer","uploadResponse","responseAttributes","mimeType","contentType","binaryLink","preview","thumbnailLink","startsWith","documentFormValue","JSON","stringify","timestamp","now","setSearchFilter","filters","searchFilterResponseTransformer","searchFilterResponse","uniqueId","searchFiltersSelector","setLocationSuggestions","setLocationSuggestionsLoading","getCountryCodeByKey","loadCountries","requestSuggestions","getCountry","countryCache","prop","countryCode","suggestion","allCountries","allCountriesUniq","notLoaded","countriesResponse","transformToSuggestions","countries","fieldCountries","loadLocations","searchInput","countryValue","suggestionsResponse","handleEntityCreated","DetailApp","onEntityCreated","RemoteCreate","detailApp","buildCreateForm","combineReducers","relationEntitiesSagas","tooltipsSaga","advancedSearchSagas","valueSagas","uploadSagas","searchFilterSagas","locationSagas","remoteCreateSagas","relationEntitiesData","FormDataContainer","isDirtySelector","_merge","getFormSubmitErrors","getFormSyncErrors","getFormAsyncErrors","areStatePropsEqual","REMOTE_EVENT","setSearchFormType","searchFormTypes","NONE","BASIC","ADMIN","newSearchFormType","enumV","initialized","searchFormCollapsed","initialize","setEntities","addEntitiesToStore","page","setEntityCount","entityCount","setFormDefinition","setSorting","setCurrentPage","currentPage","setInProgress","inProgress","refresh","setEndpoint","setSearchEndpoint","searchEndpoint","setConstriction","setLazyData","navigateToAction","toggleMarkings","setDisablePreferencesMenu","disablePreferencesMenu","setInitialized","executeSearch","submitSearchForm","setFormFieldsFlat","formFieldsFlat","setSearchFilters","setSearchFilterActive","searchFilterId","exclusive","loadPreferences","setPositions","positions","setColumns","resetSorting","reloadData","collapsed","getOpposite","currentSorting","entityStore","lazyData","formSelectable","formClickable","inputTql","inputKeys","inputSearchFilters","getFilterArray","getFetchOptionsFromSearchForm","searchFormValues","formFields","addition","tql","tqlBuilder","setSelection","isSelected","setTableSelectionStyle","tableSelectionStyle","setQuery","StyledActionWrapper","multiRelationHandler","singleRelationHandler","typeHandlers","typeHandler","infos","LazyDataEnhancer","FormattedValueWrapper","modelField","getAction","isMultiType","pathValue","formDataContainer","__key","fieldFactory","getDisplayExpression","definitionCache","getTable","getSorting","table","getSelectable","selectable","getClickable","clickable","getDisablePreferencesMenu","getEndpoint","getSearchEndpoint","getConstriction","isDisplayableChild","getSortingAttributes","sortRank","rightAlignedTypes","getColumnDefinition","columnDisplayPreferences","cellRenderers","reverseRelationName","shrinkToContent","widthFixed","rightAligned","CellRenderer","rowData","clientRenderer","cellRenderer","getFields","relationFields","displayExpressionFields","getFormFieldFlat","searchChildren","node","changeParentFieldType","formElement","parentPath","containsParentField","some","getTableColumns","validateSearchFields","fieldDefinitionCache","get","getFieldDefinition","validateField","typeValidator","typeValidators","StyledId","StyledItem","StyledLi","isDraggedOver","lighten","dndEnabled","initialColumns","setSearchTerm","currentlyDraggingItem","cols","ColumnPicker","getListFormDefinition","setInitialFormValues","transformFieldNames","submitSearchFrom","loadSearchFilter","setSimpleForm","loadSearchForm","getEntityModel","resetSearchFilters","resetSearch","getSearchFormValues","saveSearchFilter","saveNewSearchFilter","deleteSearchFilter","saveDefaultSearchFilter","resetDefaultSearchFilter","displaySearchFieldsModal","saveSearchFields","resetSearchFields","inputSelector","searchFormSelector","searchForm","listFromDefinitionSelector","searchValuesSelector","getFormValues","formActionTypes","searchFormVisible","preselectedSearchFields","preselectedValues","fromDefaultValues","transformedFromValues","oldValues","valuesInitialized","listHasNoParent","defaultFilter","txtFulltext","forceLoad","searchValues","setName","searchFilterName","getBasicQuery","createdSearchFilter","primaryKey","ActionAppComponent","actionAppComponent","modelName","flatMap","columnsSorted","hiddenFields","displayedFields","entitiesListTransformer","queryChanged","loadData","prepareEndpointUrl","countEntities","changePage","refreshData","getSearchFilter","hasActiveSearchFilterOrderBy","loadDisplayExpressions","loadRelationDisplays","loadMarkings","setMarked","setLazyDataMarked","fetchEntitiesAndAddToStore","requestEntities","delayedPreloadNextPage","preloadNextPage","displayEntity","getPreferencesSorting","loadFormDefinition","extractFormInformation","loadEntityModel","navigateToCreate","selectionSelector","preferencesSelector","selectionActions","fork","regardSelection","showSelectedRecords","searchFormSearchFilter","searchFormFetchOptions","relevantSearchFormFetchOptions","getTql","hasUserChanges","parentKey","selectedEndpoint","preparedEndpoint","queryCount","searchInputsFilters","adminSearchFormFilters","activeSearchFormFilters","_union","orderBy","searchTql","request","markable","marked","oldMarkings","setToMarked","newMarkings","markings","currentEntityMarkings","newEntityMarkings","columnPreferences","basicQuery","delay","nextPage","setCountAction","tableSorting","preferencesSorting","activeSearchFilterHasOrderBy","fetchedFormDefinition","selected","containsEntityOfModel","deletedEntityKeys","fieldArray","simpleSearchFields","trim","showExtendedSearchForm","disableSimpleSearch","comparator","showSelectionController","selectionStyles","SINGLE","MULTI","MULTI_EXPLICIT","showSelectionComponent","inputSelectionStyle","getTableSelectionStyle","fromSelectable","ascendingNumberComparator","combineSelection","currentSelection","newSelection","slice","k","clearSelection","setTableStyle","selectionMode","selectionControllerVisible","widths","preferencesLoaded","getPositions","endsWith","getPositionsFromColumns","fixedPosition","changePosition","fieldAfterPosition","getPositionsPreferencesToSave","keyRegex","transformSortingKey","keyMatch","transformSortingField","getSortingPreferencesToSave","getAdditionalSortingPreferencesToSave","getColumns","getColumnPreferencesToSave","saveSorting","resetPreferences","displayColumnModal","saveColumnPreferences","resetColumns","listSagas","entityListState","util","afterFieldPosition","newPositions","positionPreferences","sortings","sortingPreferences","preferencesColumns","formColumns","diffColumns","columnName","entityListReducer","listReducer","searchFormReducer","selectionReducer","preferencesReducer","entityListSagas","searchFormSagas","selectionSagas","preferencesSaga","reduxForm","destroyOnUnmount","liveSearch","FullTextSearchForm","StyledBasicSearchForm","StyledSearchFormButtons","searchFormDefinition","setShowExtendedSearchForm","hasExtendedOnlySearchFields","every","isHidden","searchInputs","BasicSearchForm","StyledSplit","Split","StyledSplitWrapper","AdminSearchGrid","isCollapsed","StyledPlaceHolder","StyledToggleCollapseButton","StyledGutter","searchFilterCompare","SearchFilterListWrapper","StyledSpanSearchFilter","StyledAddRemoveButton","StyleButtonWrapper","StyledSearchFilterButton","StyledItemLabel","StyledMessageWrapper","EllipsisMenu","canEdit","canDelete","SearchFilterButton","setActive","dense","editAllowed","deleteAllowed","SearchFilterList","tabIndex","BasicSearchFormContainer","searchFormDirty","toggleCollapse","splitWrapperEl","setSize","searchFilterExpanded","setSearchFilterExpanded","showExpandSearchFilter","setShowExpandSearchFilter","searchFilterHeight","splitWrapperHeight","searchFilterHeightPercentage","ceil","isSingleSearchFilterActive","Popover","direction","gutterSize","sizes","minSize","gutter","gutterEl","AdminSearchForm","StyledAdminSearchFormWrapper","isToggleable","SearchView","toggleShowSelectedRecords","selectionPossible","StyledSelectionController","SelectionController","showNavigation","StyledMarkingWrapper","MarkingCellRenderer","mouseOver","setMouseOver","onMouseEnter","onMouseLeave","Table","showNavigationLink","showPreferencesMenu","dynamic","HeaderRenderer","NavigationCellHeader","columnDefinitions","onColumnWidthChange","changeWidth","dataLoadingInProgress","paginationInfo","totalCount","recordsPerPage","onPageChange","onPageRefresh","onSortingChange","setSortingInteractive","onColumnPositionChange","dragging","dragOver","deriveSelectionFromState","StyledListWrapper","StyledListView","SelectionControllerContainer","ListView","List","columnsDefinitions","TableContainer","ActionBar","actionBar","getActionBar","ActionContainer","currentPageIds","TopPositioning","LeftPositioning","SearchGrid","ListGrid","ListViewContainer","setSearchFormCollapsed","PositioningContainer","SearchViewContainer","initializeSearchForm","EntityList","getDispatchActions","actionSettings","actionSetting","argsFactory","reloadOptions","reload","setListFormDefinition","new","mark","allCustomActions","viewName","contextParams","SimpleFormApp","EntityListApp","changedProps","_pickBy","_isEmpty","reloadOption","aS","setShowOldPasswordField","showOldPasswordField","setForcedUpdate","forcedUpdate","setUsernameOrPk","usernameOrPk","setPasswordRequest","passwordRequest","setUsername","setPassword","password","Pages","StyledLoginFormInput","StyledInputCss","StyledLoginFormInputWrapper","StyledEditableWrapperCss","StyledLoginButton","StyledTransparentButton","StyledLoginFormWrapper","StyledButtonGroup","captchaKey","loginPending","recaptchaActivated","autoFill","setAutoFill","recaptchaRef","handleSubmit","recaptchaToken","executeAsync","reset","handleAutoFill","animationName","passwordFocus","usernameFocus","autoFocus","onAnimationStart","onFocus","SignalList","condition","negative","badge","sitekey","hl","pending","captchaToken","loginForm","LoginForm","StyledPasswordInput","StyledPasswordInputWrapper","getSignal","signal","rules","rule","INVALID_CREDENTIALS","UNEXPECTED_ERROR","StyledValidationRulesWrapper","fetchValidationRules","savePassword","updateNewPassword","updateNewPasswordRepeat","updateOldPassword","validationRules","isSubmittable","newPasswordRepeat","newPassword","passwordUpdatePending","oldPasswordReadOnly","newPasswordReadOnly","oldPassword","newPasswordRepeatReadOnly","newPasswordValidationErrors","StyledPasswordUpdateDialog","passwordUpdateFailed","passwordUpdateErrorCode","rulesNeutral","UPDATE_OLD_PASSWORD","UPDATE_NEW_PASSWORD","SAVE_PASSWORD","VALIDATE","setNewPasswordValidationErrors","savePasswordFailure","validationMessages","passwordUpdate","dialog","PasswordUpdateDialog","requestPassword","bind","handleUsernameChange","PasswordRequest","StyledTwoStepLogin","StyledEditableValue","twoStepLogin","userCode","setUserCode","formEl","useLayoutEffect","allowLeadingZeros","TwoStepLoginForm","secret","forced","TwoFactorConnectorForm","GlobalRecaptchaBadgeStyle","TwoFactorConnectorContainer","PasswordRequestContainer","TwoStepLoginContainer","LoginFormContainer","resizeWatcher","validationMessagesToErrorMap","ruleName","validateCharacterRule","regex","specificCharsCount","VALIDATORS","setMessage","setPending","doLoginRequest","doSessionRequest","handleTwoStepLoginResponse","handleTwoStepActivationResponse","handlePasswordUpdateResponse","handleBlockResponse","handleFailedResponse","handleSuccessfulLogin","loginSaga","checkSessionSaga","loadSettings","loginSelector","Headers","twoFactorResponse","loginData","CAPTCHA","TWOSTEPLOGIN","RESET_PASSWORD_REQUIRED","LOGIN_BLOCKED","TWOSTEPLOGIN_ACTIVATION","storePassword","remoteValidate","validate","getData","getLoginData","formChanged","validationRulesSelector","usernameOrPkSelector","passwordSelector","standaloneSelector","standalone","acceptedStatusCodes","ok","localValidate","object","constructor","singleTransferReducer","attributeName","loadValidationRules","validationResponse","passwordSagas","validationRulesSagas","twoStepSaga","args","moduleSagas","requestPasswordSaga","passwordRequestSaga","textResourcesState","passwordUpdateReducers","passwordRequestSagas","twoStepLoginSagas","passwordUpdateSagas","initLoginApp","customTheme","LoginContainer","loginReducers","initPasswordUpdateApp","LoginApp","EXTERNAL_EVENTS_PASSWORD_UPDATE","PasswordUpdateApp","setApp","setFieldDefinitions","submit","cancel","change","getValues","CHANGE","UPDATE_SYNC_ERRORS","INITIALIZE","inputDefaultValues","formUtil","isValid","simpleForm","formReducer","formSagas","StyledButtonsWrapper","initializeForm","handleSubmitProp","submitText","cancelText","ms","setTimeout","Form","FormContainer","linkStyle","css","backgroundColor","StyledBreadcrumbsLink","StyledBreadcrumbsTitle","breadcrumbsInfo","breadcrumbs","breadcrumb","reverse","breadcrumbsItem","Comp","ButtonGroup","innerProps","selectProps","isDisabled","menuIsOpen","handleAdvancedSearch","openCreate","onTouchEnd","onMouseUp","TetherPosition","attachment","targetAttachment","constraints","wrapperWidth","wrapperHeight","reactSelectTheme","ClickableWrapper","html","onMouseOver","selectComponent","selectWrapper","debouncedSearchOptions","_debounce","clientWidth","outlineStyle","cursor","getOptionLabel","option","getOptionValue","components","ClearIndicator","LoadingIndicator","DropdownIndicator","IndicatorsContainer","IndicatorSeparator","MenuList","MultiValueLabel","SingleValue","noOptionsMessage","closeMenuOnSelect","isSearchable","filterOption","isClearable","loadingMessage","menuShouldScrollIntoView","onInputChange","onMenuOpen","reactSelectStyles","themeSelect","blurInputOnSelect","openMenuOnClick","react","userAgent","navigator","StyledText","StyledSizeWrapper","StyledTextarea","data-replicated-value","rows","maxRows","StyledDateAbstractInput","StyledDateAbstractOuterWrapper","StyledDateAbstractWrapper","DateAbstract","flatpickr","localeMap","wrap","handleOnChange","altInput","altInputClass","clickOpens","defaultDate","Flatpickr","wrapper","calendarContainer","classList","fontFamily","handleConfirmKey","localeCode","l10ns","en","selectedDates","isoStrings","toISOString","altValue","setDate","shiftKey","focusInput","handleOnBlur","componentIsUnmounted","German","French","Italian","initializeFlatPickr","optionsDiff","set","redraw","getLocale","localize","destroy","inputElement","data-wrap","data-input","placeholderText","atMostOne","array","momentJStoToFlatpickrFormat","d","Y","K","H","h","useIntl","getLocalizedAltFormat","_locale","longDateFormat","parseDate","momentDate","toDate","altFormat","dateFormat","allowInput","dateString","setValue","parsed","dates","dateTime","dateObj","year","getFullYear","month","getMonth","day","getDate","toLocalDateString","momentDateFormat","momentTimeFormat","altDateFormat","altTimeFormat","enableTime","time_24hr","isFirefox","sidebar","showClearButton","StyledBoolEdit","StyledView","onUpload","deleteTitle","isNotUploadedFile","className","Preview","fileName","caption","maxDimensionX","maxDimensionY","srcUrl","thumbnailUrl","StyledUploadProgress","StyledUploadProgressText","StyledUploadProgressIconAndText","bytes","floor","log","pow","toFixed","colorizeText","StyledDropzone","Dropzone","onDropProp","files","Upload","textResources","isUploading","previewFile","states","setStates","uploading","setUploadingState","Document","delete","StyledHtmlEdit","declareTypograhpy","HtmlEdit","delta","lazyQuill","lazy","Suspense","fallback","handleChange","clipboard","matchVisual","PhoneEdit","str","caretPosition","spaces","previousValue","previousFormatted","libPhoneImport","AsYouType","currentFormatted","spacesPrevious","amountOfSpacesBeforeCaret","requestAnimationFrame","start","setSelectionRange","newValue","parsedNumber","parseNumber","valueNormalized","removeSpaces","formatNumber","currentCaretPosition","selectionStart","repositionCaret","FALLBACK_DEFAULT_COUNTRY","importLibPhoneNumber","displayValue","determineDisplayValue","StyledDurationEdit","StyledDurationEditFocusable","generateDisabledShade","StyledDurationEditShadow","DurationEdit","milliSeconds","hours","minutes","hoursWidth","hoursShadow","minutesWidth","minutesShadow","validity","getDesiredInputInMinutes","minutesValue","hoursValue","calculateMilliseconds","showUnits","charCode","millisecondsToDuration","overflowX","handleOnFocus","onInput","handleHourChange","onKeyPress","preventNonNumeric","step","handleMinutesChange","getPreDecimalPositions","log10","abs","isNumber","isNaN","parseFloat","checkValueRange","isAllowedValue","floatValue","thousandSeparator","toLocaleString","decimalSeparator","suffix","prefix","calculatedMaxValue","calculateMaxValue","numberFormatOptions","isAllowed","decimalScale","isNumericString","onValueChange","stringValue","valueBeforeBlur","StyledLocationEdit","BoolEdit","DateEdit","DateTimeEdit","IntegerEdit","LocationEdit","cantonString","countryString","inputPropsZip","inputPropsCity","locationInput","focused","getRef","onSuggestionsFetchRequested","returnOnSuggestionFetchRequested","getSuggestionValue","returnGetSuggestion","renderSuggestion","onSuggestionsClearRequested","inputProps","onSuggestionSelected","focusInputOnSuggestionClick","shouldRenderSuggestions","showGoogleMaps","MultiRemoteSelect","MultiSelect","NumberEdit","RemoteSelect","SearchFilterEdit","SingleSelect","StringEdit","TextEdit","UrlEdit","TimeEdit","blurValue","console","StyledEditableWrapper","StyledEditableControlCss","StyledEditableControl","regular","baseSpace","GlobalDatePickerStyles","ballEl","onOpenCalled","setOnOpenCalled","onClose","handleClick","handleClose","chevronIcon","ThisMenu","thisEl","setPopperElement","bottom","setBottom","handleClickOutside","getBoundingClientRect","placement","rectBottom","closeOnClick","childrenArr","isGroup","hasOnClick","menuItem","lvl","displayName","StyledIconButtonWrapper","StyledPopperWrapper","StyledMenuItem","interactiveStyling","checkboxValues","indeterminate","aria-checked","controlledIsOpen","isOpenInitial","onToggle","setIsOpen","controlled","toggleOpenState","StyledPanel","PanelGroup","openPanelIndex","cssShared","PanelHeaderFooter","showToggler","collapseButtonText","unfoldButtonText","Body","Footer","Group","Wrapper","renderAs","StyledStatedValueBox","StyledSearchBoxInput","inputValue","setInputValue","debounce","COLORS","StyledSignalListItem","getColor","as","ICONS","SignalListItem","getIcon","Item","errorValues","signalProp","labelAlt","detectSignal","StyledStatedValue","secondaryPosition","htmlFor","declareCursor","StyledLabelWrapper","StyledStatedValueLabel","fontWeight","lineHeight","declareFocus","StyledHtmlFormatter","StyledStatedValueDescription","StyledStatedValueError","StyledStatedValueWrapper","borderColor","basePadding","StyledTableCell","StyledDnD","isDragged","StyledTableHeaderCell","isResizingThisCell","generateShades","isResizingAnyCell","StyledTableFooter","StyledSortingSpan","StyledFullRowProgress","StyledFullRow","StyledTableHead","StyledTableRow","darken","StyledTableBody","StyledTable","StretchingTableContainer","StyledTableWrapper","StyledDraggable","removeAllTextSelections","removeAllRanges","selectionChange","rowIdx","MultiCheckbox","rowSelectionState","rowSelectionChange","allKeys","allRowsSelectionState","getSingleSelectionCell","getMultiSelectionCell","ThContent","tableEl","onColumnWidthChanging","onColumnWidthChanged","handleResize","handleResizeFinsihed","resizeElement","thOnClick","StaticCell","textAlign","InProgressRow","NoDataRow","metaKey","ctrlKey","StyledPagination","StyledPaginationButton","totalPages","total","showPagination","showRefresh","columnId","finalWidth","currentKeys","lastSelected","setLastSelected","shiftSelection","idxLastSelection","idxSelection","useSelection","selectionColumn","getSelectionCell","shade0","shade1","shade2","transparent","metaFields","KEY","MODEL","VERSION","relevantRelationAttributes","typeValueExtractor","childValue","flattenPaths","currentPath","pathId","subPaths","flatten","combinedArrayVales","acc2","isRightAligned","relationFieldTypes","getFlattenEntity","version","toEntity","dirtyField","ignoredPath","t","_set","valueSimplifier","_isObject","getPathDisplayRequest","relationPaths","fieldValue","alreadyLoaded","alreadyInRequest","getDisplayRequest","DropPosition","Top","Bottom","useDnD","draggableElement","onDragEnd","dragEndEvent","bounding","y","clientY","hasJsonStructure","parse","err","fromQueryString","obj","_mapValues","toQueryString","stringifiedValues","lastPosition","currentPosition","currentSize","useResize","resizingElementSelector","resizeCallback","resizeFinishedCallback","setResizingElement","setIsResizing","isResizingInternal","setIsResizingInternal","onMouseMove","element","measureSize","x","clientX","cancelAnimationFrame","isDefined","handleRangeValue","rangeMappings","momentValue","comp","guessType","getFirstElement","getErrorCompact","persistedViews","persistViewInfo","viewInfoSelector","clearPersistedViews","persistedView","SET_SECRET","GO_TO_START","GO_TO_SECRET","setTwoFactorActive","twoFactorActive","setSecret","setUserName","goToStart","setSetupSuccessful","setupSuccessful","requestSecret","activateTwoFactorWithoutSession","activateTwoFactor","verifyCode","loadPrincipal2FAInfo","getUsername","fireResize","usernameSelector","twoFactorConnector","secretSelector","principalsResponse","totpUri","uri","code","codeVerifyResponse","principals","twoFactorKey","inputUsername","setStage","stage","Start","StyledQRCodeWrapper","StyledParagraph","goToSecretVerification","QRCode","Secret","Verification","isSuccessful","StyledTextWrapper","Result","stages","renderContent","TwoFactorConnector","packageName","TwoFactorConnectorApp","module","exports"],"mappings":"mhBAKA,IAAMA,EAAkBC,SAAH,IAGRC,UAAY,IASnBC,EAAoBF,UAAH,IACZG,UAAY,sBACRF,SAAW,O,EAKtB,kBAACC,EAAD,KACE,kBAAC,IAAD,CAAME,KAAK,WAcjB,QAjBkB,SAAC,GAAqB,IAApBC,EAAoB,EAApBA,MAAOC,EAAa,EAAbA,QACzB,OAAO,kBAACP,EAAD,OAIL,kBAAC,QAAD,KACGM,GAEH,kBAAC,UAAD,KAAkBC,M,q/BC5Bf,IAAMC,EAA4B,SAAAC,GAAQ,OAC/CA,EAASC,KAAKC,KAAI,SAAAC,GAAQ,OAAIC,IAAQD,EAASE,OAAO,SAACC,EAAQC,EAAOC,GACpE,cAAWF,GAAX,UAAoBE,EAAMD,EAAMA,UAC/B,Q,WCKYE,G,WAYAC,G,WAUQC,GAxBZC,EAAe,SAAAC,GAAK,OAAIA,EAAMC,MAEpC,SAAUL,IAAV,2EACQ,OADR,UACcM,QAAOH,GADrB,OAQY,OAPXE,EADD,OAGCE,EAAQ,CACZX,MAAO,CAAC,YAAa,QAAS,uBAAwB,yBAA0B,cAAe,gBAC/FY,WAAY,CAACC,OAAQJ,EAAKI,OAAQC,QAAQ,IALvC,UAQkBC,QAAKC,kBAZX,kBAY2CL,EAAO,CAACM,OAAQ,OAAQvB,GAR/E,OASL,OADMwB,EARD,iBASCC,QCXkC,CACxCC,KAR2B,qBAS3BC,QAAS,CACPC,UDQ6BJ,KAT1B,uCAYA,SAAUb,EAAV,0EACgB,OADoBJ,EAApC,EAA0BoB,QAAUpB,OAApC,UACsBc,QAAKN,0BAD3B,kCAGH,OAHG,UAGGM,QAAKQ,cAHR,8BAKH,OALG,WAKGR,QAAKQ,oBALR,QAOL,OAPK,WAOCJ,QAAIK,sBAAiC,iBAAkBvB,IAPxD,wCAUQ,SAAUK,IAAV,iEACb,OADa,UACPmB,QAAI,EACRC,QClC0B,sBDkCStB,IACnCsB,QCjC2B,uBDiCSrB,KAHzB,uC,eE5BTsB,EAAkB,ODHK,qBCIFC,0BAAkC,cAGvDC,EAAe,CACnBP,UAAW,ICNb,SACEQ,SDQa,WAA+C,IAA9BtB,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,ICPrC,IAAMyB,EAAQ,CAACC,G,sDCLTC,GAAkB,SAACC,EAAe/B,EAAgBP,GAC7D,IACMuC,EAAmBC,mBAAmBC,OAAOC,SAASC,MACtDC,EAAM,GAAH,OAFsBC,IAEtB,OAAgBP,EAAhB,qBAA0CtC,EAAS8C,UAAnD,sBAA0EP,GAE7EQ,EAAQN,OAAOO,KAAKJ,EAAK5C,EAASiD,MCLV,WAA+B,IAA9BC,EAA8B,uDAArB,IAAKC,EAAgB,uDAAR,IAC/CC,EAAW,CACfF,SACAC,QACAE,KAAOZ,OAAOa,OAAOH,MAAQ,EAAMA,EAAQ,EAC3CI,IAAMd,OAAOa,OAAOJ,OAAS,EAAMA,EAAS,EAC5CM,UAAW,EACXC,WAAY,EACZC,OAAQ,GAGV,OAAOzD,IAAQmD,GAAU,SAACjD,EAAQC,EAAOC,GAAhB,qBAA4BF,GAA5B,WAAuCE,EAAvC,YAA8CD,OAAU,IAC9EuD,KAAK,KDPuCC,CAAiB,IAAK,MAErEnB,OAAOoB,iBAAmB,SAAA1D,GACxB4C,EAAMe,QACNvD,EAAeJ,K,gWEDnB,UAAed,SAAO0E,KAAtB,MAIiBzE,UAAW,KAEPE,WAAY,UAC3B,SAAAwE,GAAK,OAAIC,UACXC,SAA0BF,EAAO,CAC/BG,GAAIH,EAAMI,aACVC,GAAIL,EAAMM,gBAAN,UAA2BC,KAAKP,EAAMxE,MAAO,gBAA7C,aAAiE+E,KAAKP,EAAMxE,MAAO,sBCe7F,SA5BuB,SAAC,GAA8C,IAA7CQ,EAA6C,EAA7CA,SAAUO,EAAmC,EAAnCA,eAAgB+B,EAAmB,EAAnBA,cAKjD,OACE,kBAACkC,GAAD,CACEJ,aAAcpE,EAASyE,qBACvBH,eAAgBtE,EAAS0E,uBACzBC,QARiB,WACnBtC,GAAgBC,EAAe/B,EAAgBP,KAS5CA,EAAS4E,aAAe,kBAAC,KAAD,CAAMC,SAAS,UAAUpF,KAAMO,EAAS4E,cACjE,8BAAO5E,EAAS8E,gB,qrBCZtB,IAAMC,GAAwB1F,UAAH,MAoD3B,MCzDA,GDiBM2F,Y,qBACJ,WAAYhB,GAAO,yBACjB,cAAMA,GACNA,EAAM1D,gBAFW,E,uDAKA2E,EAAWC,EAAWC,GAAU,WACjD,GAAIC,KAAKpB,MAAMqB,WAA4C,IAA/BJ,EAAUzD,UAAU8D,QAAgBF,KAAKpB,MAAMxC,UAAU8D,OAAS,EAAG,CAC/F,IAAMC,EAAoBH,KAAKpB,MAAMxC,UAAUgE,MAAK,SAAAC,GAAM,OAAIA,EAAO3C,YAAc,EAAKkB,MAAMqB,aAC1FE,GACFlD,GAAgB+C,KAAKpB,MAAM1B,cAAe8C,KAAKpB,MAAMzD,eAAgBgF,M,+BAKlE,WACP,OAAO,kBAACR,GAAD,KAEHK,KAAKpB,MAAMxC,UACRzB,KAAI,SAACC,EAAU0F,GAAX,OACH,kBAAC,GAAD,CACErF,IAAKqF,EACL1F,SAAUA,EACVsC,cAAe,EAAK0B,MAAM1B,cAC1B/B,eAAgB,EAAKyD,MAAMzD,yB,EAxBnCyE,CAAiBW,eEdvB,IAAMC,GAAoB,CACxBtF,cTF2B,iBAAO,CAClCgB,KAL4B,wBSO5Bf,eTQ4B,SAAAJ,GAAM,MAAK,CACvCmB,KAd6B,uBAe7BC,QAAS,CACPpB,aSAJ,UAAe0F,cARS,SAAAnF,GACtB,MAAO,CACLc,UAAWd,EAAMsB,SAASR,UAC1Bc,cAAe5B,EAAMoF,MAAMC,iBAC3BV,UAAW3E,EAAMoF,MAAMT,aAIaO,GAAxC,CAA2DZ,I,yaCV3D,IAEMgB,GAAkB,CACtB,kB,GAIgB,kBAACC,GAAD,MADZC,GAAU,SAACC,EAAIL,EAAOM,EAAQC,GAClC,IAAMC,EAAU,GAEVC,EAAQC,gBAAuBC,EAAUtE,EAAO2D,EATpC,aAalB,OAHApE,eAA0B6E,EAAOH,GACjC3E,eAAiB8E,GAEVC,cAbW,YAehBF,EACAC,EACA,CACET,QACAM,SACAM,QAAS,GACTL,aACAM,oBAAqB,CAAC,YAAa,SAtBrB,gBAiFpB,SAzBMC,Y,qBACJ,WAAY5C,GAAO,kBACjB,cAAMA,GAEN,IAAMoC,EAASJ,GAAgBa,QAAO,SAACT,EAAQU,GAI7C,OAHI9C,EAAM8C,KACRV,EAAOU,GAAS9C,EAAM8C,IAEjBV,IACN,IARc,OAUjB,EAAKW,IAAMb,GAAQ,EAAMlC,EAAOoC,GAVf,E,6CAcjB,OAAOhB,KAAK2B,IAAIC,c,EAfdJ,CAAoBjB,e,2wEC1DnB,IAAMsB,IAAkBC,SAAH,MAQfC,GAAc9H,UAAH,KAGE+H,MAsBbC,IAAqBhI,SAAOiI,MAAPjI,CAAH,KAEdC,UAAW,KAGfiI,IAAkBlI,SAAOmI,MAAPnI,CAAH,KAGXC,UAAW,MAOfmI,GAAqBpI,UAAH,KAMZC,UAAW,MAejBoI,GAAkBrI,UAAH,MAYfsI,GAAwBtI,UAAH,MAkBrBuI,IAAevI,SAAOmI,MAAPnI,CAAH,KAING,gBAAiB,QAEvBA,WAAY,qBAIZqI,IAAiBxI,SAAOuI,GAAPvI,CAAH,KAEdG,WAAY,uB,GCjEhB,kBAACoI,GAAD,CAAcE,YAAY,GAAM,kBAAC,KAAD,CAAkB3B,GAAG,mC,GAGrD,kBAAC0B,GAAD,CAAgBC,YAAY,GAAM,kBAAC,KAAD,CAAkB3B,GAAG,4B,GAE1D,kBAACoB,GAAD,KAAiB,kBAAC,KAAD,CAAkBpB,GAAG,8B,GAMtC,kBAACc,GAAD,M,GAEE,kBAACU,GAAD,CAAuBI,IAAKC,KAAaC,IAAI,eAAe/E,OAAO,OAAOC,MAAM,Q,GAChF,kBAACuE,GAAD,CAAiBK,IAAKC,KAAaC,IAAI,eAAe/E,OAAO,OAAOC,MAAM,Q,GAExE,kBAACkE,GAAD,KAAoB,kBAAC,KAAD,CAAkBlB,GAAG,+BAmBnD,SAnEc,SAAC,GAAuD,IAAtD+B,EAAsD,EAAtDA,aAAcC,EAAwC,EAAxCA,gBAAiBC,EAAuB,EAAvBA,kBAAuB,GAClCC,eAAS,GADyB,WAC7DC,EAD6D,KAClDC,EADkD,QAEZF,eAAS,GAFG,WAE7DG,EAF6D,KAEvCC,EAFuC,KAG9DpD,EAAYqD,SAAY,kBAE9BC,gBAAU,WACRP,MACC,IAEH,IAToE,EA0BhE,kBAAC,GAAD,CACErC,iBAAiB,OACjBxF,eAfoB,SAAC,GAAyC,IAAxCqI,EAAwC,EAAxCA,WAAY5I,EAA4B,EAA5BA,SAAU6I,EAAkB,EAAlBA,aAC5CD,GACFF,SAAY,gBAAiB1I,EAAU,CAAC8I,QAAS,MACjDX,EAAgB,MACNS,GAAcC,EACxBJ,GAAwB,GAExBF,GAAa,IASXlD,UAAWA,IALX0D,EAAe,kBACnB,sCAMGP,GAAoB,GAGpBF,GAAS,GATZ,KAgBF,OACE,uCAEE,kBAACnB,GAAD,WAGE,kBAACM,GAAD,QAEGS,GAAgB,kBAACa,EAAD,MACjB,kBAAC,IAAD,CACEC,aA1CW,SAAC,GAAc,IAAbC,EAAa,EAAbA,QACrBd,EAAgBc,IA0CRC,WAAW,Q,gBClEjBtD,GAAoB,CACxBuC,sBACAC,yBAOF,UAAevC,cAJS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCkE,aAAcxH,EAAMyI,QAAQjB,gBAGUtC,GAAxC,EAA2DwD,QAAWC,K,0HC4FtE,UAAeD,SAnGM,SAAC,GAAuC,IAC/CjD,EADSmD,EAAsC,EAAtCA,OAAsC,IAA9BC,YAA8B,MAAvB,KAAuB,EAAjBC,EAAiB,EAAjBA,MAAO7I,EAAU,EAAVA,KA+B3C8I,EAAY,CAChBC,OAAQF,EACRG,aAAc,qBACdC,YAAa,EACbC,QAAS,SACTC,QAlCcR,EAAS,SAAW,SAmClCS,WAAY,CAACC,KAAM,UAAWC,SAAU,KAM1C,OACE,kBAACC,GAAA,EAAD,CAAY9G,SAJO,kBACnB,uDAAoC+G,MAAK,SAAAC,GAAG,OAAIA,EAAG,aAInD,kBAAC,GAAAC,EAAA,IAAD,CACEC,QAAQ,UACRC,SAAS,UACTC,oBAAoB,OACpBrH,MAAOoG,EACPrG,OAAQqG,EACRkB,cAlDQtE,EAkDQ,sCAlDFxF,EAAK+J,cAAc,CAACvE,SAoDlC,kBAAC,GAAAkE,EAAA,KAAD,MACEM,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,SAvDM,CACVC,OAAQ,CACNC,OAAQ,EACRC,WAAY,GAEdC,OAAQ,CACNF,OAAQ,GACRC,WAAY,KAiDNzB,IAEN,kBAAC,GAAAY,EAAA,KAAD,MACEM,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,SArDS,CACbC,OAAQ,CACNI,QAAS,GAEXD,OAAQ,CACNC,QAAS,KAiDH3B,EANN,CAOEM,WAAY,CAACC,KAAM,UAAWC,SAAU,OAE1C,kBAAC,GAAAI,EAAA,KAAD,MACEM,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,GAAG,IACHC,SAtDS,CACbC,OAAQ,CACNC,OAAQ,EACRC,WAAY,GAEdC,OAAQ,CACNF,QAAS,GACTC,YAAa,KAgDPzB,S,+VCjFL,IAAM4B,GAAkBhM,UAAH,MACxBiM,WAIgB,mBAAqB,EAArB,EAAEC,QACH/L,gBAAiB,UAEhC,mBAAuC,IAAvC,EAAEgM,eAA0C,iCAGnCC,GAAyBpM,UAAH,KAChBC,WAAY,IAGVA,WAAY,I,uBCmCjC,SAhDiB,SAAXoM,EAAY,GAIZ,QAHJC,EAGI,EAHJA,KAGI,IAFJC,oBAEI,MAFW,GAEX,EADJC,EACI,EADJA,YAEMC,EAAaD,EAAYF,EAAKI,UACpC,IAAKD,EACH,OAAO,KAGT,IAAME,EAAYF,EAAW9E,UACvBiF,EAA2BH,EAAWI,yBACtCC,EAAS,UAAGR,EAAKS,gBAAR,aAAG,EAAerM,KAAI,SAAAsM,GAAK,OAAK,kBAACX,EAAD,CAC7CrL,IAAKgM,EAAMC,KACXX,KAAMU,EACNR,YAAaA,EACbD,aAAY,UAAKA,EAAL,YAAqBS,EAAMC,WAGzC,OACE,kBAACjB,GAAD,QAAqBM,EAArB,CAA2BH,eAAe,UAAAG,EAAKS,gBAAL,eAAe9G,SAAU,EAAGiH,UAAA,yBAA2BZ,EAAKW,QACpG,kBAACN,EAAD,MAAWL,KAAMA,EAAMC,aAAcA,GAAkBE,EAAW9H,SACjEmI,aAAA,EAAAA,EAAW7G,QAAS,GACnB,kBAAC2G,EAAD,MAA0BN,KAAMA,EAAMC,aAAcA,GAAkBE,EAAW9H,OAC9EmI,K,qkBC5BJ,IAAMK,GAAwB,SAACC,EAAmBb,GAApB,yBACvBa,EAAoB,IAAH,OAAOA,GAAsB,GADvB,YAC6Bb,EAD7B,eAUxBc,GAA6B,SAA7BA,EAA8BC,EAAOF,EAAmBG,GACnE,OAAKD,GAA0B,IAAjBA,EAAMrH,OAIAqH,EACjB9F,QAAO,SAACgG,EAAKlB,GAAS,IACdW,EAAQX,EAARW,KAEDQ,EAAcnB,EAAKS,UAAYT,EAAKS,SAAS9G,OAAS,EACtD8G,EAAWM,EAA2Bf,EAAKS,UAAY,GAAlB,UACtCK,GADsC,OAClBA,EAAoB,IAAH,OAAOH,GAASA,GAAQM,GAE5DvM,EAAMmM,GAAsBC,EAAmBH,GACrD,mBACKO,GACAT,GACCU,EAAc,OAAEzM,EAAMuM,GAAY,MAEvC,IAjBI,ICNLG,GAAW,SAAC,GAKZ,IAJJJ,EAII,EAJJA,MACAK,EAGI,EAHJA,aACAnB,EAEI,EAFJA,YAGA,GADI,EADJoB,gBAEsBD,EACpB,OAAO,KAGT,IAAKL,GAA0B,IAAjBA,EAAMrH,OAClB,OAAO,KAGT,IAEM6G,ED2BuB,SAAlBe,EAAmBP,EAAOK,EAAcnB,GAAqD,IAAxCN,EAAwC,uDAAhC,EAAG4B,EAA6B,wDAClGC,EAAgB,SAAAzB,GAAI,aAAKqB,GAC1BrB,EAAK0B,oBACL,UAAA1B,EAAKS,gBAAL,eAAe9G,QAAS,GACxB6H,GAECG,EAAuB,SAAC3B,EAAM4B,GAAP,OAA4BP,EACrDO,EAAiB/H,MAAK,SAAAgI,GAAI,OACxB7B,EAAK6B,IAAS7B,EAAK6B,GAAMC,cAAcC,SAASV,aAAlC,EAAkCA,EAAcS,uBAEhEE,GAEJ,OAAOhB,EACJ5M,KAAI,SAAA4L,GACH,IADW,GACQE,EAAYF,EAAKI,WAAa,IAC1CwB,iBACDF,EAAoBC,EAAqB3B,OAHpC,MAEe,GAFf,GAKLiC,EAAeC,QAAQR,GAEvBjB,EAAWc,EAAgBvB,EAAKS,UAAY,GAAIY,EAAcnB,EAAaN,EAAQ,EAAGqC,GAE5F,gBACKjC,GADL,IAEE0B,oBACAjB,WACAb,aAGHuC,OAAOV,GC1DUF,CAAgBP,EAAOK,EAAcnB,GAE3B9L,KAAI,SAAA4L,GAAI,OACpC,kBAAC,GAAD,CACEtL,IAAKsL,EAAKW,KACVX,KAAMA,EACNE,YAAaA,EACbD,aAAcD,EAAKW,UAIvB,OACE,kBAACb,GAAD,KACGU,IAmBP,MCnDA,GDmDexG,SAAWoH,I,ohEElD1B,IAAMgB,GAAYvO,WAAY,aACxBwO,GAAiBxO,WAAY,kBAEtByO,GAAY5O,UAAH,KAKlB6O,MAaSC,IARkB9O,WAAH,KAEjBG,WAAY,QACNA,gBAAiB,QACfF,YAAa,KAChBA,YAAa,MAGMD,UAAH,KAKHG,WAAY,oBAY5B4O,IAAwB/O,SAAOgP,KAAPhP,CAAH,KACnBC,UAAW,GAOb0O,IAIAM,IAAkBjP,SAAOgP,KAAPhP,CAAH,MAElB,qBAAEkP,OAAqB,GAAM,KAIb,qBAAEvN,OAAqB+M,GAAY,iBAClD,qBAAE/M,OAAqB+M,GAAYC,KAC7BxO,gBAAiB,SAGd,qBAAEwB,OAAqB+M,GAAYC,MAE1C,qBAAEhN,OAAqB+M,GAAYC,MAenCQ,GAAyBnP,UAAH,KAEfC,YAAa,KAGpBmP,GAAoBpP,UAAH,KAGjBC,WAAY,IAAQA,WAAY,IAAUA,WAAY,IAC/DoP,MAGSC,GAA2BtP,UAAH,MAMxBuP,IAAmBvP,SAAOwP,KAAPxP,CAAH,KACdC,UAAW,GAOb0O,I,uwCCvGb,IAAMA,GAAiBxO,WAAY,kBAEtBsP,IAAiBzP,SAAO0P,MAAP1P,CAAH,KAChBG,WAAY,QAIVA,WAAY,kBAKNA,gBAAiB,QACvBwO,IAQAgB,IAAiB3P,SAAO0P,MAAP1P,CAAH,KAEhBG,WAAY,QAGNF,YAAa,GAIjBE,WAAY,mBASZyP,GAAwB5P,WAAH,KAEjBC,YAAa,GACVA,YAAa,GAErB0P,IAKCE,GAA2B7P,WAAH,KAEpBC,YAAa,GAGjBE,WAAY,mBAIZ6L,GAAkBhM,WAAH,KACjBG,WAAY,QACNA,gBAAiB,QACfF,YAAa,KAChBA,YAAa,MAIvB,qBAAEqF,QAAuB,mBAAqB,kBAE9CuK,IAMOC,GAAwB9P,WAAH,KAChBC,YAAa,MAGlB8P,GAA4B/P,UAAH,MACzB,qBAAEiK,OAAqB,QAAU,UCpC9C,SAxCkB,SAAAtF,GAAS,IAClB2H,EAAmF3H,EAAnF2H,KAAMrC,EAA6EtF,EAA7EsF,OAAQ+F,EAAqErL,EAArEqL,YAAa5C,EAAwDzI,EAAxDyI,kBAAmBb,EAAqC5H,EAArC4H,aAAc0D,EAAuBtL,EAAvBsL,oBAC5D7P,EAAekM,EAAflM,KAAMwD,EAAS0I,EAAT1I,MAEPsM,EAA2B,WAC/BD,EAAoB,OAAE9C,GAAsBC,EAAmBb,GAAgBtC,KAGjF,OACE,kBAAC,GACM+F,EAAc,CAAC1K,QAAS4K,GAA4B,GAEzD,8BACG9P,GAAQ,kBAAC0P,GAAD,KAAuB,kBAAC,KAAD,CAAM1P,KAAMA,KAC3CwD,GAEFoM,GACC,kBAACH,GAAD,KACE,kBAAC,KAAD,CACEzP,KAAM6J,EAAS,aAAe,eAC9B3E,QAAS4K,OCvBd,IAAMC,GAA+B,SAAC9O,EAAD,OAAS2O,EAAT,EAASA,YAAa5C,EAAtB,EAAsBA,kBAAmBb,EAAzC,EAAyCA,aAAzC,OAA2DyD,GAClG9K,KAAK7D,EAAM+O,YAAYC,gBAAiBlD,GAAsBC,EAAmBb,IAAe,QACjG+B,GCCE/H,GAAoB,CACxB0J,2BAOF,UAAezJ,cAJS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCsF,OAAQkG,GAA6B9O,EAAOsD,MAGN4B,GAAxC,EAA2DwD,QAAWuG,KCKtE,SAf4B,SAAC,GAAD,IAAErG,EAAF,EAAEA,OAAQ+F,EAAV,EAAUA,YAAajD,EAAvB,EAAuBA,SAAvB,OAC1B,kBAACgD,GAAD,CACE9F,QAAS+F,GAAe/F,GAEvB8C,ICCL,UAAevG,cAJS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCsF,OAAQkG,GAA6B9O,EAAOsD,MAG9C,EAAwCoF,QAAWwG,K,OCQ3C,kBAAC,KAAD,CAAMnQ,KAAK,kBAenB,SA3B4B,SAAC,GAGvB,IAFJkF,EAEI,EAFJA,QACAgH,EACI,EADJA,KAEMkE,EAA+C,WAA3BlE,EAAK0B,kBAAiC,yCAAK1B,EAAKlG,OAAV,KAAwB,GAExF,OACE,kBAACwJ,GAAD,KACE,kBAACH,GAAD,CAAgBgB,yBAAuB,EAAMnL,QAASA,EAASoL,GAAE,aAAQpE,EAAKlG,SAC3EkG,EAAK1I,MAAO4M,GAEf,kBAACb,GAAD,CAAgBe,GAAE,aAAQpE,EAAKlG,QAAUuK,OAAO,SAASC,IAAI,cAA7D,M,OCCA,kBAAC,KAAD,CAAMxQ,KAAK,kBAajB,SAzBoB,SAAC,GAAD,IAClBkF,EADkB,EAClBA,QACAgH,EAFkB,EAElBA,KAFkB,OAIlB,kBAACsD,GAAD,KACE,kBAACH,GAAD,CACEgB,yBAAuB,EACvBnL,QAASA,EACToL,GAAE,oBAAepE,EAAKW,OACrBX,EAAK1I,OAER,kBAAC+L,GAAD,CAAgBe,GAAE,oBAAepE,EAAKW,MAAQ0D,OAAO,SAASC,IAAI,cAAlE,MCCJ,IAAMC,GAAO,CACXC,QAAS,UACTC,SAAU,WACVC,OAAQ,SACRC,SAAU,YAGNC,GAAoB,SAAC,GAAmD,IAAlD5L,EAAkD,EAAlDA,QAAS6L,EAAyC,EAAzCA,iBAAkB/D,EAAuB,EAAvBA,kBAE/C4C,GAAemB,QAD+B,IAAtB/D,EAG9B,MAAO,CACL,KAAQ,CACNzF,UAAW2I,GACXzD,yBAA0B0D,GAC1BrC,iBAAkB,CAAC,SACnBvJ,MAAO,CACLyI,oBACA4C,gBAGJ,kBAAmB,CACjBrI,UAAWyJ,GACXvE,yBAA0B0D,GAC1B5L,MAAO,CACLW,UACA8H,oBACA4C,eAEF9B,iBAAkB,CAAC,QAAS,WAE9B,OAAU,CACRvG,UAAW0J,GACXxE,yBAA0B0D,GAC1B5L,MAAO,CACLW,UACA8H,oBACA4C,eAEF9B,iBAAkB,CAAC,YA4MzB,SAvMmB,SAAC,GAad,MAZJoD,EAYI,EAZJA,gBACAC,EAWI,EAXJA,iBACAC,EAUI,EAVJA,eACAC,EASI,EATJA,iBACAC,EAQI,EARJA,SACApM,EAOI,EAPJA,QACAqM,EAMI,EANJA,cACAC,EAKI,EALJA,iBACAtQ,EAII,EAJJA,KACAuQ,EAGI,EAHJA,gBACAC,EAEI,EAFJA,aACA7B,EACI,EADJA,oBAEM8B,GAAUC,YAAO,MACjBC,GAAeD,YAAO,MAFxB,GAGwBhJ,cAAS,IAHjC,WAGGyF,EAHH,KAGWyD,EAHX,KAIEf,EAAmB3C,QAAQC,GAC3B0D,GAAYhB,GAAoB,CAACN,GAAKC,QAASD,GAAKE,UAAU1C,SAASsD,GAEvES,GAAU,WACbvB,GAAKC,QAAU,CAACxD,MAAOgE,EAAiBlE,kBAAmB,KAD9C,MAEbyD,GAAKE,SAAW,CAACzD,MAAOiE,EAAkBnE,kBAAmB,aAFhD,MAGbyD,GAAKG,OAAS,CAAC1D,MAAOkE,IAHT,MAIbX,GAAKI,SAAW,CAAC3D,MAAOmE,IAJX,GAOVY,GAAiBC,cAAQ,kBAC7BpB,GAAkB,CAAC5L,UAAS6L,mBAAkB/D,kBAAmBgF,EAAWvB,GAAKC,SAAS1D,sBAC5F,CAAC9H,EAAS6L,IACJoB,GAAkBD,cAAQ,kBAC9BpB,GAAkB,CAAC5L,UAAS6L,mBAAkB/D,kBAAmBgF,EAAWvB,GAAKE,UAAU3D,sBAC7F,CAAC9H,EAAS6L,IACJqB,GAAgBF,cAAQ,kBAC5BpB,GAAkB,CAAC5L,UAAS6L,uBAC9B,CAAC7L,EAAS6L,IACJsB,GAAkBH,cAAQ,kBAC9BpB,GAAkB,CAAC5L,UAAS6L,uBAC9B,CAAC7L,EAAS6L,KAEV7H,gBAAU,WACJoI,IACGC,GACHC,EAAiBf,GAAKC,SAExBiB,EAAQW,QAAQnR,SAChBwQ,EAAQW,QAAQC,WAEjB,CAACjB,IAEJ,IAAMkB,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QA0ChC+L,EAAgB,SAAAC,GACpBlB,EAAiBkB,GANbf,EAAQW,SACVX,EAAQW,QAAQC,SASpB,OACE,kBAAC/D,GAAD,CAAWmE,IAAKd,EAAce,UAnCd,SAAAC,GAXa,IAAAjS,EACvBkS,EACAC,EAUQ,cAAVF,EAAEjS,KAAiC,YAAViS,EAAEjS,MAC7BiS,EAAEG,iBAbyBpS,EAcJiS,EAAEjS,IAbrBkS,EAAoBjB,EAAaS,QAAQW,iBAAiB,2CAC1DF,EAAa,KAAID,GAAmBI,WAAU,SAAAC,GAAE,OAAIC,SAASC,cAAcC,YAAYH,QAE3E,GAGhBL,GADmBC,GADO,cAARnS,EAAsB,EAAIkS,EAAkBjN,OAAS,IAC1BiN,EAAkBjN,QAClC0M,UAuCqBzF,UAAQ,aAC1D,kBAAC4B,GAAD,KACoB,SAAjBgD,GACE,oCACD,kBAAC/C,GAAD,CACEpN,QAAQ,EACR2D,QAAS,WACPuM,EAAgB,cAChBgB,EAAchC,GAAKI,WAErB7Q,KAAM,gBACN8O,QAAQ,IAEV,kBAACD,GAAD,CACEtN,OAAQgQ,IAAkBd,GAAKC,QAC/BxL,QAAS,kBAAMuN,EAAchC,GAAKC,UAClClN,MAAOgP,EAAI,qCAEb,kBAAC3D,GAAD,CACEtN,OAAQgQ,IAAkBd,GAAKE,SAC/BzL,QAAS,kBAAMuN,EAAchC,GAAKE,WAClCnN,MAAOgP,EAAI,uCAGG,eAAjBd,GACE,oCACD,kBAAC/C,GAAD,CACEpN,QAAQ,EACR2D,QAAS,WACPuM,EAAgB,QAChBgB,EAAchC,GAAKC,UAErB1Q,KAAM,eACN8O,QAAQ,IAEV,kBAACD,GAAD,CACEtN,OAAQgQ,IAAkBd,GAAKG,OAC/B1L,QAAS,kBAAMuN,EAAchC,GAAKG,SAClCpN,MAAOgP,EAAI,oCAEb,kBAAC3D,GAAD,CACEtN,OAAQgQ,IAAkBd,GAAKI,SAC/B3L,QAAS,kBAAMuN,EAAchC,GAAKI,WAClCrN,MAAOgP,EAAI,wCAIjB,kBAACzD,GAAD,KACE,kBAACwE,GAAA,EAAD,CACEC,eAAgB,EAChBC,SAAU3B,EACVa,IAAKhB,EACL+B,YAAalB,EAAI,gDACjBxH,aAAYwH,EAAI,mDAGpB,kBAACxD,GAAD,KACG+C,GAAY,kBAAC7C,GAAD,KACX,kBAACC,GAAD,CACEnP,KAAK,sBACL6B,KAAK,SACLqD,QAzFc,WAAM,MACO8M,EAAWT,IAAkB,GAAzDrE,EADqB,EACrBA,MAAOF,EADc,EACdA,kBACd,GAAIE,QAAsC,IAAtBF,EAAmC,CACrD,IAAMgD,EAAc/C,GAA2BC,EAAOF,GAAmB,GACzE6C,EAAoBG,KAsFd/P,MAAOuS,EAAI,uCAEb,kBAACrD,GAAD,CACEnP,KAAK,oBACL6B,KAAK,SACLqD,QAvFgB,WAAM,MACK8M,EAAWT,IAAkB,GAAzDrE,EADuB,EACvBA,MAAOF,EADgB,EAChBA,kBACd,GAAIE,QAAsC,IAAtBF,EAAmC,CACrD,IAAMgD,EAAc/C,GAA2BC,EAAOF,GAAmB,GACzE6C,EAAoBG,KAoFd/P,MAAOuS,EAAI,0CAIdjB,IAAkBd,GAAKC,SACrB,kBAAC,GAAD,CAAUxD,MAAOgE,EAAiB3D,aAAcc,EAAQjC,YAAa6F,IACvEV,IAAkBd,GAAKE,UACrB,kBAAC,GAAD,CAAUzD,MAAOiE,EAAkB5D,aAAcc,EAAQjC,YAAa+F,IACxEZ,IAAkBd,GAAKG,QACrB,kBAAC,GAAD,CAAU1D,MAAOkE,EAAgB7D,aAAcc,EAAQjC,YAAagG,IACtEb,IAAkBd,GAAKI,UACnB,kBAAC,GAAD,CAAU3D,MAAOmE,EAAkB9D,aAAcc,EAChDjC,YAAaiG,EAAiB7E,eAAe,OC1O3D,IAAMrH,GAAoB,CACxBqL,uBACAC,sBACA5B,2BAaF,MCpBA,IDoBezJ,cAVS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC4M,iBAAkBlQ,EAAM0S,WAAWxC,iBACnCD,gBAAiBjQ,EAAM0S,WAAWzC,gBAClCE,eAAgBnQ,EAAM0S,WAAWvC,eACjCC,iBAAkBpQ,EAAM0S,WAAWtC,iBACnCC,SAAUrQ,EAAM0S,WAAWrC,SAC3BC,cAAetQ,EAAM0S,WAAWpC,cAChCG,aAAczQ,EAAM0S,WAAWjC,gBAGOvL,GAAxC,EAA2DwD,QAAWiK,K,gBEXzDC,GAAe,SAAAC,GAAS,MAAK,CACxCjS,KAX2B,0BAY3BC,QAAS,CACPgS,e,+zBCVG,IAAMC,GAAyBnU,UAAH,KAGnBG,WAAY,SACfF,YAAa,IAEtBoP,MAIS+E,GAAsBpU,UAAH,MAKnBqU,GAAerU,UAAH,MAQZsU,GAAuBtU,UAAH,KAGrBC,YAAa,KAGZsU,GAAqBvU,UAAH,MAMf,gBAAEG,EAAF,EAAEA,MAAF,OAAaqU,SAAWtP,KAAK/E,EAAO,gBAAiB,MACxD,qBAAEsU,UAA2B,EAAI,KClC9C,SALkB,CAChBC,OAAQ,SACRC,QAAS,W,kDCFEC,GACF,UADEA,GAEE,c,qkBCGR,IAAMC,GAAgB,SAAAC,GAAK,OAAIA,EAAMC,MAAK,SAACC,EAAGC,GACnD,OAAID,EAAEE,MAAQD,EAAEC,IACPF,EAAEG,IAAMF,EAAEE,IAEZH,EAAEE,IAAMD,EAAEC,QAGbE,GAAU,MAAM,SAAAC,GACpB,OAAOA,EACJ7N,QAAO,WAAiB8N,GAAQ,IAAvBC,EAAuB,EAAvBA,MAAOT,EAAgB,EAAhBA,MACTU,EAAsC,iBAAnBD,EAAMD,EAAIJ,KAAoBK,EAAMD,EAAIJ,KAAO,EAAI,EAW5E,MAVY,CACVJ,MAAO,GAAF,YACAA,GADA,UAECQ,GAFD,IAEMH,IAAKK,MAEhBD,MAAO,SACFA,GADA,UAEFD,EAAIJ,IAAMM,OAId,CAACD,MAAO,GAAIT,MAAO,KAAKA,SAGzBW,GAAyB,MAAM,SAACC,EAAYC,EAAYnQ,EAAU6P,GAAgB,MAChFO,EAAc,UAAGP,EAAYlP,MAAK,SAAA8O,GAAC,OAAIA,EAAEnO,KAAO6O,YAAlC,aAAG,EAA4CT,IAC7DW,EAAcR,EAAYlP,MAAK,SAAA8O,GAAC,OAAIA,EAAEnO,KAAO4O,KACnD,OAAON,GAAQC,EACZ7N,QAAO,SAACsN,EAAOQ,GACd,IAAMQ,EAAcR,EAAIxO,KAAO6O,EAE/B,OADsBL,EAAIxO,KAAO4O,EAGxBZ,EAGT,eACKA,GADL,KAEMtP,IAAauQ,uBAAgCD,EAC7C,CAAC,SAAID,GAAL,IAAkBX,IAAKU,EAAgBT,KAAM,KAC7C,IAJN,CAKEG,GALF,KAMM9P,IAAauQ,0BAAmCD,EAChD,CAAC,SAAID,GAAL,IAAkBX,IAAKU,EAAgBT,KAAM,KAC7C,OAEL,Q,0ICnDA,IAAM/F,GAAoBpP,UAAH,M,GCStB,kBAAC,KAAD,CAAkB8G,GAAG,sC,GAGrB,kBAAC,KAAD,CAAkBA,GAAG,uCAW7B,SAlBa,SAAC,GAAD,IAAEkP,EAAF,EAAEA,uBAAwBC,EAA1B,EAA0BA,qBAA1B,OACX,kBAAC,GAAD,KACE,kBAACC,GAAA,EAAD,CAAUC,YAAa,CAAC/V,KAAM,eAC5B,kBAAC,KAAD,CAAUkF,QAAS0Q,GAAnB,IAGA,kBAAC,KAAD,CAAU1Q,QAAS2Q,GAAnB,OCPN,IAAM1P,GAAoB,CACxByP,uBP0BoC,iBAAO,CAC3C/T,KA9B4C,6COI5CgU,qBP6BkC,iBAAO,CACzChU,KAjCoC,sCOMtC,UAAeuE,aAAQ,KAAMD,GAA7B,EAAgDwD,QAAWqM,KCXpD,I,4uBCGP,IAEa9B,GAAuBtU,UAAH,KAEXqW,aACV,gBAAExS,EAAF,EAAEA,OAAF,OAAcA,EAAS,GAAH,OAAMA,EAAN,MAAmB,SALjC,OAOL5D,YAAa,IACVE,WAAY,UAcfmW,GAAuBtW,UAAH,KACVG,WAAY,YAEvB,gBAAE0D,EAAF,EAAEA,OAAF,gBAAiBA,EAAjB,QAzBM,OA4BL5D,YAAa,IACdA,YAAa,IACTE,WAAY,U,oHC9BrB,IAAMoW,GAA8BvW,UAAH,MAEpC,qBAAEwW,YAA8B,oBAChCnH,MCaJ,SAbgC,SAAC,GAAc,IACtCoH,EADsC,EAAbxP,QACzBwP,KACP,OACE,kBAACF,GAAD,CAA6BC,YAAU,GACrC,kBAACE,GAAA,EAAD,CAAgBzU,KAAK,OAAOlB,MAAO0V,M,+lBCFzC,IAYME,IAAqB5M,SAZW,SAAC,GAA6C,IACtEjD,EAD0B8P,EAA4C,EAA5CA,UAAWC,EAAiC,EAAjCA,YAAa9J,EAAoB,EAApBA,SAAUzL,EAAU,EAAVA,KAGxE,OACE,kBAACwV,GAAA,EAAD,CACE1L,cAJQtE,EAIQ,yDAJFxF,EAAK+J,cAAc,CAACvE,QAKlC4J,GAAE,aAAQmG,EAAR,YAAuBD,IACxB7J,MAkDP,SApCmC,SAAC,GAAkD,IAAjDjG,EAAiD,EAAjDA,GAAIG,EAA6C,EAA7CA,QAAS8P,EAAoC,EAApCA,mBAAoBC,EAAgB,EAAhBA,WAC7DC,EAA0ChQ,EAA1CgQ,aAAcC,EAA4BjQ,EAA5BiQ,WAAYC,EAAgBlQ,EAAhBkQ,MAAOC,EAASnQ,EAATmQ,MAMxC,OAAO,kBAACb,GAAD,KACL,kBAAC,KAAD,CACEzP,GAAIA,EACJsQ,MAAOA,EACPF,WAAYA,EACZG,SAAUH,EACVI,cAAe,CAACL,GAChBE,MAAOA,EACPI,aAAa,EACbC,WAbmB,SAAC,GAAS,IAAR1Q,EAAQ,EAARA,GACvBiQ,EAAmBU,WAAWP,EAAYpQ,GAAI,IAa5C4Q,eAAe,SACfC,mBAAmB,MACnBC,eAAe,OACfC,UAAQ,EACRC,4BAA0B,EAC1Bd,WAAYA,EACZD,mBAAkB,SAAMA,GAAN,IAA0BJ,wBAC5CoB,UAAU,MC/ChB,IAAMxR,GAAoB,CACxByQ,WAAY,SAAApU,GAAM,OAAIoV,2BAAoCpV,KAO5D,UAAe4D,cAJS,SAAAnF,GAAK,MAAK,CAChC0V,mBAAoB1V,EAAMoF,MAAMsQ,sBAGMxQ,GAAxC,EAA2DwD,QAAWkO,K,OCF7D,8BAGF,IAAMvX,GAAM,CACjBwX,UAAWC,GACXlB,aAAcmB,ICbVC,GAAiB,SAAC,GAAkB,IAAjBvR,EAAiB,EAAjBA,GAAIG,EAAa,EAAbA,QAC3B,OAAKA,EDCP,SAAgBhF,EAAM6E,EAAIG,GACxB,OAAIvG,GAAIuB,GACCqE,kBAAoB5F,GAAIuB,GAAO,CAAC6E,KAAIG,aAG7CqR,cAAuB,qCAAsCrW,EAAM6E,GACnE,ICFOnG,CADQsG,EAARhF,KACe6E,EAAIG,GAJjB,MAOXoR,GAAeE,UAAY,CACzBzR,GAAI0R,sBACJvR,QAASuR,uBAGX,YCGA,SAdgB,SAAC,GAAD,IAAE1R,EAAF,EAAEA,GAAIlD,EAAN,EAAMA,MAAOC,EAAb,EAAaA,OAAQoD,EAArB,EAAqBA,QAAYtC,EAAjC,iDACd,kBAAC,GAAD,QAA0BA,EAA1B,CAAiCd,OAAQA,IACvC,kBAAC4U,GAAA,MAAD,KAAgB7U,GAChB,kBAAC,GAAD,CAAgBkD,GAAIA,EAAIG,QAASA,MCqCrC,SAzCyB,SAAC,GAQpB,IAPJyR,EAOI,EAPJA,QACAC,EAMI,EANJA,WACAC,EAKI,EALJA,YACAC,EAII,EAJJA,YACAC,EAGI,EAHJA,YACAC,EAEI,EAFJA,WACAC,EACI,EADJA,OAEOlS,EAAoC4R,EAApC5R,GAAI7E,EAAgCyW,EAAhCzW,KAAM2B,EAA0B8U,EAA1B9U,MAAOC,EAAmB6U,EAAnB7U,OAAQoD,EAAWyR,EAAXzR,QAChC,OACE,kBAACqN,GAAD,CAAsBtT,IAAG,UAAKiB,EAAL,YAAa6E,GAAMA,GAAE,kBAAaA,IACzD,kBAAC,GAAD,CACEA,GAAIA,EACJlD,MAAOA,EACPC,OAAQA,EACRoD,QAASA,EACTgS,WAAS,EACTJ,YAAaA,EACbC,YAAaA,EACbC,WAAYA,EACZC,OAAQA,IAEV,kBAACzE,GAAD,CACE2E,YAAaN,EACbnE,UAAWkE,MCzBnB,SAFoB,SAAAhU,GAAK,OAAI,kBAAC2R,GAAyB3R,IC0DvD,SArDwB,SAAC,GASnB,IARJmU,EAQI,EARJA,YACAC,EAOI,EAPJA,WACAC,EAMI,EANJA,OACA9E,EAKI,EALJA,UACAiF,EAII,EAJJA,YACAP,EAGI,EAHJA,YACAQ,EAEI,EAFJA,SACAC,EACI,EADJA,cAEOC,EAAqBF,EAArBE,kBACAX,EAA+BQ,EAA/BR,WAAYY,EAAmBJ,EAAnBI,gBAEnB,OACE,kBAAClF,GAAD,CACEyE,YAAaA,EACbC,WAAYA,EACZC,OAAQA,GAEP9E,EAAUxT,KAAI,SAAAgY,GAAW,IACjB5R,EAAoB4R,EAApB5R,GAAIjD,EAAgB6U,EAAhB7U,OAAQ5B,EAAQyW,EAARzW,KACnB,OAAIA,IAAS2S,GACJ,kBAAC,GAAD,MACL5T,IAAG,UAAKiB,EAAL,YAAa6E,GAChBjD,OAAQA,GACJwV,EAAcC,KAIf,kBAAC,GAAD,MACLtY,IAAG,UAAKiB,EAAL,YAAa6E,GAChBA,GAAE,kBAAaA,GACf4R,QAASA,EACTC,WAAYA,GAAcY,IAAoBzS,GAC1CuS,EAAc,CAACpX,KAAMuX,WAAmB1S,OALvC,CAML8R,YAAaA,EAAY9R,W,4kBCyB3B,kBAAC,GAAD,MA+BR,SAlFkB,SAAC,GAA0E,IAA9D2S,EAA8D,EAAzEvF,UAA4BwF,EAA6C,EAA7CA,kBAAmBC,EAA0B,EAA1BA,qBAA0B,GAEzD3Q,cAASyQ,GAFgD,WAEpFvF,EAFoF,KAEzE0F,EAFyE,MAG3FtQ,gBAAU,WACRsQ,EAAaH,KACZ,CAACA,IAEJ,IAAMI,EAAU,KAAIC,MZzBW,GYyBcC,QAEvChH,GAAMf,YAAO,MAEbgI,GAAyBC,kBAAY,SAAAnT,GAAM,MACzCoT,EAAW,UAAGhG,EAAU/N,MAAK,SAAAgU,GAAC,OAAIA,EAAErT,KAAOA,YAAhC,aAAG,EAAkCjD,OACtD6V,EAAkB5S,EAAIoT,KACrB,CAAChG,IAEEkG,GAA0BH,kBAAY,SAACnT,EAAD,GAAkB,IAAZjD,EAAY,EAAZA,OAChD+V,GAAa,SAAA1F,GAAS,YAAQA,EAAUxT,KAAI,SAAAyZ,GAAC,OAAIA,EAAErT,KAAOA,EAAT,SAExCqT,GAFwC,IAG3CtW,WAEFsW,WACH,IAvBwF,EA6BvFE,gBAnBa,SAAAvT,GAAE,OAAIiM,EAAIL,QAAQ4H,cAAZ,mBAAsCxT,MAmB9BsT,EAAyBJ,GAHtDpB,EA1ByF,EA0BzFA,YACA2B,EA3ByF,EA2BzFA,eACApB,EA5ByF,EA4BzFA,YA5ByF,EA4C7DpD,aAbA,SAACyE,EAAmBlB,EAAmB9T,GAAa,IACrEkQ,EAAc8E,EAAlB1T,GACM2T,EAAgCnB,EAAtCrX,KAAwB0T,EAAc2D,EAAlBxS,GAC3B,GAAI2T,IAAiBjB,UAAkB,CACrC,IAAMkB,EhBQoC,SAAChF,EAAYC,EAAYb,GACvE,IAAMe,EAAcf,EAAM3O,MAAK,SAAA8O,GAAC,OAAIA,EAAEnO,KAAO4O,KAC7C,OAAON,GAAQ,GAAD,YACTP,GAAcC,GAAOrG,QAAO,qBAAE3H,KAAe4O,MADpC,IAAC,MAETG,GAFQ,IAEKX,IAAKS,EAAYR,KAAM,OgBZbwF,CAAiCjF,EAAYC,EAAYzB,GAClF0F,EAAac,GACbf,EAAqBe,QAChB,GAAIhF,IAAeC,EAAY,CACpC,IAAM+E,EhBAwB,SAAChF,EAAYC,EAAYnQ,EAAUsP,GAAnC,OAA6C,KAAK,CACpFD,GACAY,GAAuBC,EAAYC,EAAYnQ,IAFgC,CAEpBsP,GgBF9B8F,CAAqBlF,EAAYC,EAAYnQ,EAAU0O,GAChF0F,EAAac,GACbf,EAAqBe,MAG+CxG,GAAjE2G,EA5CoF,EA4CpFA,UAAWzB,EA5CyE,EA4CzEA,SACXE,EAAsDF,EAAtDE,kBAAmBkB,EAAmCpB,EAAnCoB,kBAAmBM,EAAgB1B,EAAhB0B,aAElCpF,GAAc8E,GAAqB,IAAvC1T,GAEP,OACI,kBAACqN,GAAD,MAAwBpB,IAAKA,GAASwH,GAAtC,GAEE,kBAACnG,GAAD,KACGyF,EAAQnZ,KAAI,SAAAqa,GAAU,MACqBF,EAAU,CAAC5Y,KAAMuX,UAAkB1S,GAAIiU,IAA1EjC,EADc,EACdA,YAAaC,EADC,EACDA,WAAYC,EADX,EACWA,OAC1BlE,EhBJyB,SAACY,EAAY4D,EAAmB9T,EAAUuV,EAAQjG,GAAU,MACxDwE,GAAqB,GAArDmB,EADwF,EAC9FxY,KAAwB0T,EADsE,EAC1E7O,GACrBkU,EAAerF,IAAeD,GAAc+E,IAAiBjB,WAE7DyB,EAAqB,SADPnG,EAAM3O,MAAK,SAAA8O,GAAC,OAAIA,EAAEnO,KAAO4O,MACrB,IAAoBzT,KAAM2S,KAE9CsG,EAAcpG,EACfrG,QAAO,gBAAE0M,EAAF,EAAEA,OAAQjG,EAAV,EAAUA,IAAKpO,EAAf,EAAeA,GAAf,QAAwBqU,GAC3BjG,IAAQ6F,QACgB,IAAfpF,IAA+BqF,GACvClU,IAAO4O,MAEZhV,KAAI,SAAA4U,GAAG,gBAASA,GAAT,IAAcrT,KAAM2S,QAC3BpN,QAAO,SAACgG,EAAKxM,GACZ,IAAMoa,EAAkBpa,EAAI8F,KAAO6O,GAAc8E,IAAiBjB,aAAsBwB,EACxF,qBACKxN,GADL,KAEMhI,IAAauQ,uBAAgCqF,EAC7C,CAACH,GACD,IAJN,CAKGja,EAAI8F,KAAO4O,GAAcsF,EAA1B,GAAC,MAA6Cha,GAA9C,IAAmDiB,KAAM2S,KAAkC5T,GAL7F,KAMMwE,IAAauQ,0BAAmCqF,EAChD,CAACH,GACD,OAEL,IAML,OAJIR,IAAiBjB,WAAoB7D,IAAeoF,IACtDG,EAAc,GAAH,YAAOA,GAAP,CAAoBD,KAG1BC,EgB3BiBG,CAA4B3F,EAAY4D,EAAmBwB,EAAcC,EAAQ7G,GAE/F,OACE,kBAAC,GAAD,CACElT,IAAK+Z,EACLjC,YAAaA,EACbC,WAAYA,EACZC,OAAQA,EACR9E,UAAWY,EACXqE,YAAaA,EACbP,YAAaA,EACbQ,SAAUA,EACVC,cAAewB,UC/E/B,IAAMtU,GAAoB,CACxBoT,qBrBWkC,SAAAzF,GAAS,MAAK,CAChDjS,KAjBoC,mCAkBpCC,QAAS,CACPgS,eqBbFwF,kBrBiB+B,SAAC5S,EAAIjD,GAAL,MAAiB,CAChD5B,KAvBiC,gCAwBjCC,QAAS,CACP4E,KACAjD,aqBdJ,UAAe2C,cAJS,SAAAnF,GAAK,MAAK,CAChC6S,UAAW7S,EAAMia,UAAUpH,aAGW3N,GAAxC,EAA2DwD,QAAWwR,KCXtE,IAAM/Y,GAAkB,OtBHK,0BsBIFC,0BAAkC,cAGvDC,GAAe,CACnBwR,UAAW,ICLb,SDQe,WAA+C,IAA9B7S,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,8oBEVrC,IAAMma,GAAsBxb,UAAH,KAGfC,WAAY,GACPE,WAAY,SAI9BuE,MAKS+W,GAAWzb,SAAH,KAELC,YAAa,IACXA,YAAa,IAI3Byb,OAKSC,GAAiB3b,YAAH,KAETC,YAAa,I,4kBCCrB,kBAAC,KAAD,CAAkB6G,GAAG,qBAY/B,SArCwB,SAAC,GAA6B,IAA5B8U,EAA4B,EAA5BA,iBAAkBC,EAAU,EAAVA,KAAU,GAClB7S,cAAS4S,GAAoB,IADX,WAC7C1H,EAD6C,KAClC0F,EADkC,KAUpD,OACE,6BACE,kBAAC6B,GAAD,KAAWvH,EAAUxT,KAAI,SAAA4U,GAAG,OAC1B,kBAACmD,GAAA,MAAD,CAAezX,IAAKsU,EAAIxO,IACtB,kBAAC6U,GAAD,CACE1Z,KAAK,WACL6Z,SAAUxG,EAAI6F,OACdY,SAAU,kBAdLjV,EAckBwO,EAAIxO,QAbnC8S,GAAa,SAAA9E,GAAK,OAAIA,EAAMtN,QAAO,SAACgG,EAAK8H,GAAN,qBAC9B9H,GAD8B,IAAC,MAE9B8H,GAF6B,IAExB6F,OAAQ7F,EAAIxO,KAAOA,GAAMwO,EAAI6F,OAAS7F,EAAI6F,aAClD,OAJU,IAAArU,GAeLA,GAAIwO,EAAIxO,KAEV,kBAAC2R,GAAA,SAAD,CAAkBuD,IAAK1G,EAAIxO,IAAKwO,EAAI1R,YAGxC,kBAAC4X,GAAD,KACE,kBAACxM,GAAA,EAAD,CAAQ/M,KAAK,SAASqD,QAAS,kBAAMuW,EAAK3H,IAAY+H,KAAK,UAA3D,O,qkBCvBD,IAmBDC,GAAwB,SAAA5G,GAAG,OAAqB,OAAjBA,EAAI9P,UAoBnC2W,GAAsB,SAAAjI,GAC1B,IAAMkI,EAAwBlI,EAAUzF,OAAOyN,IACzCG,EAAsBnI,EAAUzF,QAAO,SAAA6G,GAAG,OAAK4G,GAAsB5G,MAC3E,OAAO8G,EACJ5U,QAAO,SAACgG,EAAK8H,GAAQ,MAtBgB,SAAApB,GACxC,IAEMoI,EAFU,KAAIxC,MlB9BW,GkB8BcC,QAETvS,QAAO,SAACgG,EAAK0H,GAAN,UAAC,MACvC1H,GADsC,UAExC0H,EAAMhB,EAAUzF,QAAO,SAAAwG,GAAC,OAAIA,EAAEC,MAAQA,KAAKjP,WAC1C,IAEEsW,EAASC,OAAOzC,KAAKuC,GAAqB9U,QAC9C,SAACiV,EAAKzb,GACJ,IAAMkU,EAAMwH,SAAS1b,EAAK,IAC1B,OAAOsb,EAAoBpH,GAAOuH,EAAIE,cAAgB,CAACzH,MAAKyH,cAAeL,EAAoBpH,IAAQuH,IAEzG,CAACvH,KAAM,EAAGyH,cAAeC,OAAOC,YAElC,OAAuB,IAAhBN,EAAOrH,IAAa,CAACA,IAAK,EAAGyH,cAAe,GAAKJ,EAQvBO,CAAkCtP,GAAxD0H,EADa,EACbA,IAAKyH,EADQ,EACRA,cACZ,qBACKnP,GADL,UAEM8H,GAFN,IAEWJ,MAAKC,IAAKwH,QAEpBN,IAQMU,GAAmB,SAAA7I,GAAS,OAAIW,GAAcsH,GAAoBjI,EAC5ExT,KAAI,SAAA4U,GAAG,gBAASA,GA1DmB,SAAA9P,GACpC,IAAKA,EACH,MAAO,CAAC0P,IAAK,EAAGC,IAAK,GAGvB,IAAM6H,EAAQxX,EAASwX,MAAM,KACvB9H,EAAMwH,SAASM,EAAM,GAAI,IAAM,EAC/B7H,EAAMuH,SAASM,EAAM,GAAI,IAC/B,MAAO,CAAC9H,IAAK+H,KAAKC,IAAI,EAAGhI,GAAMC,OAkDNgI,CAAuB7H,EAAI9P,iB,qlBCvD7B1C,I,YAWRsa,I,YAUAzD,I,YAYAD,I,YAYA1D,I,YAqBPqH,I,YAaOpH,I,YASPqH,IA1FGC,GAAoB,SAAAlc,GAAK,OAAIA,EAAMia,WAEjC,SAAUxY,KAAV,iEACb,OADa,UACPR,QAAI,EACRV,QAAKwb,KACL7a,Q3Bd0B,2B2BcS6a,KACnC7a,Q3BbkC,mC2BaSoX,KAC3CpX,Q3Bb+B,gC2BaSmX,KACxC8D,Q3Bb0C,2C2BaQxH,KAClDwH,Q3BbkC,mC2BaQvH,MAP/B,wCAWR,SAAUmH,KAAV,2EAIY,OAHXK,EAAU,CACd3b,OAAQ,OAFL,UAIkBF,QAAKC,gBAAkB,mBAAoB4b,GAJ7D,OAML,OAFMjd,EAJD,OAKC0T,EAAY1T,EAASkd,KAAKC,UAL3B,UAMC3b,QAAIqF,GAAqB0V,GAAiB7I,KAN3C,gCAOEA,GAPF,wCAUA,SAAUyF,GAAV,8EAML,OAN+CzF,EAA1C,EAAgChS,QAAUgS,UACzCwG,EAAmBxG,EAAUxT,KAAI,SAAA4U,GAAG,gBAASA,GAAT,IAAc9P,UDRnB0P,ECQoDI,EAAIJ,IDRnDC,ECQwDG,EAAIH,IDRlE,UAAiBD,EAAM,EAAvB,YAA4BC,MAA5B,IAACD,EAAKC,KCSpC/E,EAAcsK,EAAiBlT,QAAO,SAACgG,EAAK8H,GAAN,UAAC,MACxC9H,GADuC,oBAEtC8H,EAAIxO,GAFkC,aAElBwO,EAAI9P,aAC1B,IALC,UAMC5D,QAAK0b,GAAwBlN,GAN9B,OAQL,OARK,UAQCpO,QAAIqF,GAAqBqT,IAR1B,gCASEA,GATF,wCAYA,SAAUhB,GAAV,sFACe,OADf,IAA6BxX,QAAU4E,EAAvC,EAAuCA,GAAIjD,EAA3C,EAA2CA,OAA3C,UACqBtC,QAAOgc,IAD5B,OAML,OANK,SACErJ,EADF,EACEA,UACDwG,EAAmBxG,EAAUxT,KAAI,SAAA4U,GAAG,gBAASA,GAAT,IAAczR,OAAQyR,EAAIxO,KAAOA,EAAKjD,EAASyR,EAAIzR,YACvFuM,EAHD,iBAICtJ,EAJD,WAIejD,GAJf,UAMCjC,QAAK0b,GAAwBlN,GAN9B,OAQL,OARK,WAQCpO,QAAIqF,GAAqBqT,IAR1B,iCASEA,GATF,yCAYA,SAAU1E,KAAV,2EACe,OADf,UACqBzU,QAAOgc,IAD5B,OAEiB,OAFjB,SACErJ,EADF,EACEA,UADF,UAEuBtS,QAAKgc,OAF5B,OAGL,OADMC,EAFD,iBAGC7b,QAAI8b,UACR,6BACA,0CACA,MACA,YAAa,IAAXrZ,EAAW,EAAXA,MAMA,OAAO,kBAAC,GAAD,CAAiBmX,iBAAkB1H,EAAW2H,KALxC,SAAAhC,GACXpV,IACAoZ,EAAc7b,IAAI6X,SAKtB,IAfG,OAkBL,OAlBK,WAkBCjY,QAAKyb,GAAqBQ,GAlB3B,yCAqBP,SAAUR,GAAoBQ,GAA9B,yEACoB,OADpB,UAC0BE,QAAKF,GAD/B,OAOE,OANM3J,EADR,OAGQ9D,EAAc8D,EAAU1M,QAAO,SAACgG,EAAK8H,GAAN,UAAC,MACjC9H,GADgC,oBAE/B8H,EAAIxO,GAF2B,WAEbwO,EAAI6F,OAAS,SAAW,WAC5C,IANN,UAOQvZ,QAAK0b,GAAwBlN,GAPrC,OASE,OATF,UASQpO,QAAIqF,GAAqB6M,IATjC,gCAUSA,GAVT,wCAaO,SAAU+B,KAAV,iEACL,OADK,UACC3T,QAAI,EACRV,QAAKC,0BAA4B,aACjCD,QAAKC,0BAA4B,eACjCD,QAAKC,0BAA4B,cAJ9B,OAML,OANK,UAMCD,QAAKwb,IANN,wCASP,SAAUE,GAAuBlN,GAAjC,iEACE,OADF,UACQxO,QAAKC,oBAAsBuO,EAAa,gCADhD,wCCjGA,UACEkL,UAAW0C,IAGN,IAAMlb,GAAQ,CACnBmb,I,+NCCF,IAEMtX,GAAkB,CACtB,c,GAIgB,kBAACuX,GAAD,MADZrX,GAAU,SAACC,EAAIL,GAAmC,IAA5BM,EAA4B,uDAAnB,GAAIC,EAAe,uCAChDC,EAAU,GAEVC,EAAQC,gBAAuBC,GAAUtE,GAAO2D,EATpC,aAUlBuR,gBAAyB9Q,EAAOH,EAAOiQ,YACvC,IAAMmH,GAAuBpX,EAAOiQ,WAGpC,OAFA8G,eAAwB5W,EAAOiX,GAExBhX,cAdW,YAgBhBF,EACAC,EACA,CACET,QACAM,SACAM,QAAS,GACTL,aACAM,oBAAqB,CAAC,YAAa,SAAU,cAvB/B,gBAyDd8W,GAAe,SAAAzZ,GACnB,IAAMoC,EAASJ,GAAgBa,QAAO,SAACT,EAAQU,GAI7C,OAHI9C,EAAM8C,KACRV,EAAOU,GAAS9C,EAAM8C,IAEjBV,IACN,IAEH,OAAOF,GAAQ,YAAalC,EAAOoC,GAAQY,WAG7CyW,GAAa7F,U,mWAAb,EACExB,mBAAoByB,YACjB7R,GAAgBa,QAAO,SAAC+Q,EAAW9Q,GAEpC,OADA8Q,EAAU9Q,GAAS+Q,SACZD,IACN,KAGL,Y,ynBCjFO,IAAM8F,GAAgBre,UAAH,MAUbse,GAAoBte,UAAH,MAIjBmU,GAAyBnU,UAAH,KAGbG,WAAY,mBCZ5Bob,GAAY,SAAC,GAAuC,IAC5CzU,EADMyX,EAAsC,EAAtCA,MAAOC,EAA+B,EAA/BA,QAASxH,EAAsB,EAAtBA,WAAY1V,EAAU,EAAVA,KAG9C,OACE,kBAAC+c,GAAD,KACE,kBAACC,GAAD,KACE,kBAACG,GAAA,EAAD,CACEC,YAAa,CAACC,SANV7X,EAMuB,yBANjBxF,EAAK+J,cAAc,CAACvE,QAMwBzG,MAAO,SAC7Due,WAAW,gBAGf,kBAAC,GAAD,KACE,kBAAC,GAAD,CACE5H,WAAYA,EACZD,oBAAoBA,SAAmByH,EAASD,QAc1D,SAAejY,SAAWiV,IAAW,kBAAM,KC9B3C,IAAMhV,GAAoB,CACxByQ,WAAY,SAAApU,GAAM,OAAIoV,2BAAoCpV,KAG5D,UAAe4D,aAAQ,KAAMD,GAA7B,EAAgDwD,QAAWwR,K,gdCRpD,ICKDsD,GAAmB,GCczB,MCjBA,GFKyB,SAAC3X,EAAOT,EAAOqY,EAAyB9d,GAAxC,OAAgD,SAAA2D,GACvE,GAAI3D,GAAO6d,GAAiB7d,GAAM,CAChC,IAAM2L,EAAYkS,GAAiB7d,GACnC,OAAO,kBAAC,EAAc2D,GAGxB,IGbiCoa,EAAc,IHazCpS,GGb2BoS,EHaJ,kBAC3B,IAAIC,SAAQ,SAAAC,GACVH,IAA0BhU,MAAK,SAAAoU,GAC7B,IAAMC,EAAQD,EAAQ,QAElBC,EAAM/X,UACR3E,mBAA2ByE,EAAOiY,EAAM/X,UAGtC+X,EAAMrc,OACRqc,EAAMrc,MAAMsc,SAAQ,SAAAC,GAClBC,gBAAoBpY,EAAOmY,MAI3BF,EAAMI,iBACRJ,EAAMI,gBAAgBH,SAAQ,SAAAI,ID7BX,SAACtY,EAC5BT,EAD2B,GAGS,IADnCzF,EACmC,EADnCA,IAAKye,EAC8B,EAD9BA,cAC8B,IADfC,iBACe,SADIC,EACJ,EADIA,aACxCC,EAAoC,uDAA3BtH,cACT,GAAIkE,OAAOqD,UAAUC,eAAele,KAAK6E,EAAOzF,IAAQ2e,EAAc,CACpE,IAAM/c,EAAS6c,EAAchZ,EAAMzF,IAAQ2e,GAC3CzY,EAAM6Y,SAASnd,QACQ,IAAd8c,GACTE,EAAO,mCAAD,OAAoC5e,EAApC,uBCsBEgf,CACE9Y,EACAT,EACA+Y,MAKNP,EAAQE,EAAMc,kBGrCpB,6MAEY,GAFZ,oBAIU,CACNtT,UAAWuT,EAAevT,YAL9B,0DAQsB,WAClB5G,KAAKoa,SAAU,EACc,OAAzBpa,KAAK1E,MAAMsL,WACboS,IAAejU,MAAK,SAAA6B,GAClBuT,EAAevT,UAAYA,EACvB,EAAKwT,SACP,EAAKC,SAAS,CAACzT,mBAdzB,6CAqBI5G,KAAKoa,SAAU,IArBnB,+BAwBW,IACAxT,EAAa5G,KAAK1E,MAAlBsL,UAEP,OAAkB,OAAdA,EACK,kBAACA,EAAc5G,KAAKpB,OAGtB,SA/BX,GAAoC2B,eAApC,kBACqB,MADrB,GH8CA,OAJItF,IACF6d,GAAiB7d,GAAO2L,GAGnB,kBAACA,EAAchI,K,8DI3ClB0b,GAAoB,CAAC,eAAgB,kBAAmB,iBAE9D,SAASC,GAAS1a,EAAW2a,GAC3B,IAAMC,EAAOC,gBAAc7a,EAAW2a,GAChCG,EAAQC,KAAQC,KAAMJ,EAAMH,KAAoB,SAAAQ,GAAC,OAA8B,IAA1BrE,OAAOzC,KAAK8G,GAAG5a,UAC1E,OAAwC,IAAjCuW,OAAOsE,QAAQJ,GAAOza,OAG/B,UAAe8a,WACb,SAAApc,GAAK,OACH,kBAAC,EAAAqc,kBAAA,SAAD,MACG,YAAa,IAAX9Z,EAAW,EAAXA,MACKyF,EAAYwS,GAAgBjY,EAAO,IAAI,kBAAO,mEACpD,OAAO,kBAACyF,EAAchI,QAI5B2b,ICXF,SARc,SAAA3b,GACZ,IAAMuC,GAAQ+Z,gBACRtU,GAAY2F,cAAQ,WACxB,OAAO6M,GAAgBjY,EAAO,IAAI,kBAAO,yDAAoB,UAC5D,IACH,OAAO,kBAACyF,EAAchI,I,OCNE,kBAAC8T,GAAA,MAAD,iBAK1B,MCNA,GDCiB,SAAA9T,GAAK,W,kKEOtB,UAL+B3E,SAAO0P,MAAP1P,CAAH,KAExBkhB,MCmFJ,SAnFyB5a,gBAAiB,SAAC3B,EAAOoO,GAAQ,IACjDoO,EAA8Cxc,EAA9Cwc,KAAM/gB,EAAwCuE,EAAxCvE,KAAMghB,EAAkCzc,EAAlCyc,IAAKxd,EAA6Be,EAA7Bf,MAAOyd,EAAsB1c,EAAtB0c,SAAUtU,EAAYpI,EAAZoI,SACzC,OACE,kBAAC,GAAD,MACEgG,IAAKA,GACDoO,EACAxc,EAHN,CAIEyc,IAAKA,GAAOE,cACZpU,UAASvI,EAAM,WACftE,MAAOuD,IAENxD,GAAQ,kBAAC,KAAD,CACPA,KAAMA,KAENihB,GAAYzd,EAAQ,8BAAOA,GAAgBmJ,GAAY,Q,qqDCfxD,IAAMwU,GAAwBvhB,UAAH,KAKZG,WAAY,UAErBqhB,GAAexhB,UAAH,MAUZyhB,GAAezhB,UAAH,MAOZ0hB,GAAuB1hB,UAAH,MAKX,gBAAE2hB,EAAF,EAAEA,OAAQxhB,EAAV,EAAUA,MAAV,MAAgC,eAAXwhB,EAA0BxhB,EAAMyhB,OAAOC,QAAU1hB,EAAMyhB,OAAOlT,YACrF3G,MAKP+Z,GAAe9hB,UAAH,MAMZ+hB,GAAgC/hB,WAAH,MAI7BgiB,IAAahiB,SAAOwP,KAAPxP,CAAH,KACNC,YAAa,KAGjBgiB,GAAejiB,WAAH,KAMHG,WAAY,oBAIFH,SAAOkiB,KAAPliB,CAAH,KAEhBC,YAAa,KAAQA,WAAY,ICjD9C,SAbiC,SAAC,GAAD,IAC/BkiB,EAD+B,EAC/BA,uBACA7c,EAF+B,EAE/BA,QACA8c,EAH+B,EAG/BA,SAH+B,OAI3BD,EAAuBlc,OAAS,GACjC,kBAACgc,GAAD,CAAc3c,QAASA,EAASyN,IAAKqP,KCD1C,UAAe5b,cAJS,SAAAnF,GAAK,MAAK,CAChC8gB,uBAAwB9gB,EAAMyc,aAAauE,OAAOF,0BAGZ,KAAxC,EAA8CpY,QAAWuY,KCAzD,IAAMC,GAAkB,CACtB,CACEtV,KAAM,SACNwQ,QAAS,CACP+E,OAAQ,CAAC,EAAG,KAGhB,CACEvV,KAAM,kBACNwQ,QAAS,CACPgF,QAAS,MA+Cf,SA1CiC,WAAM,OACJzZ,eAAS,GADL,WAC9B0Z,EAD8B,KACrBC,EADqB,KAG/BC,GAAmB5Q,YAAO,MAC1B6Q,GAAgB7Q,YAAO,MACvB8Q,GAAgB9Q,YAAO,MAEvB+Q,EAAkB,SAAA9P,GAClB4P,EAAcnQ,UAAYmQ,EAAcnQ,QAAQsQ,SAAS/P,EAAEtC,SAC1DiS,EAAiBlQ,UAAYkQ,EAAiBlQ,QAAQsQ,SAAS/P,EAAEtC,SACjEmS,EAAcpQ,UAAYoQ,EAAcpQ,QAAQsQ,SAAS/P,EAAEtC,SAC9DgS,GAAc,KAIlBrZ,gBAAU,WAER,OADAkK,SAASyP,iBAAiB,YAAaF,GAChC,WACLvP,SAAS0P,oBAAoB,YAAaH,MAE3C,CAACH,EAAkBC,IApBe,OAsBRM,QAAUP,EAAiBlQ,QAASmQ,EAAcnQ,QAAS,CAAC0Q,UAAWb,KAA7Fc,EAtB8B,EAsB9BA,OAAQC,EAtBsB,EAsBtBA,WAEf,OAAO,oCACL,kBAACvB,GAAD,CAA+B1hB,MAAM,iBACnC,kBAAC,GAAD,CAAYiF,QAAS,kBAAMqd,GAAeD,IAAUtiB,KAAK,OAAO2S,IAAK6P,IACrE,0BAAM7P,IAAK+P,GAAe,kBAACS,GAAD,CAAmCje,QAAS,kBAAMqd,GAAeD,QAE5Fc,kBACC,kBAAC1B,GAAD,MACE/O,IAAK8P,EACLY,MAAOJ,EAAOK,QACVJ,EAAWI,QAEdhB,GAAW,kBAAC5E,EAAA,qBAAD,CAAiC/G,oBAAoBA,cAEnEvD,SAASkK,Q,4VC1DR,IAAMiG,GAAgC3jB,UAAH,KAC3BC,WAAY,KACXA,WAAY,KAGf2jB,GAAqB5jB,UAAH,KACfC,WAAY,KAGf4jB,GAAa7jB,UAAH,KACPC,WAAY,I,GCAtB,kBAAC4jB,GAAD,CAAYnb,IAAKX,KAAWlE,OAAO,QAAQC,MAAM,MAAM8E,IAAI,e,GAQvD,kBAAC,KAAD,CAAkB9B,GAAG,gC,GAChB,6B,GAML,kBAAC,KAAD,CAAkBA,GAAG,6B,GAChB,6B,GAML,kBAAC,KAAD,CAAkBA,GAAG,6B,GAKrB,kBAAC,KAAD,CAAkBA,GAAG,oC,GAAwD,6B,GAC7E,kBAAC,KAAD,CAAkBA,GAAG,qC,GAGzB,kBAAC6c,GAAD,KACE,kBAAC,KAAD,CAAkB7c,GAAG,4BAY7B,SAjDmB,SAAC,GAAsC,IAArCgd,EAAqC,EAArCA,YAAaC,EAAwB,EAAxBA,aAAcziB,EAAU,EAAVA,KACxCsR,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEtC,OACE,kBAAC2R,GAAA,QAAD,QAEE,yBAAKuL,wBAAyB,CAACC,OAAQrR,EAAI,iCAC3C,kBAAC6F,GAAA,KAAD,KACE,kBAAC/I,GAAA,EAAD,CACEpM,KAAMsP,EAAI,+BACVsR,SAAO,EACPvT,OAAO,UAHT,IADF,GAQE,kBAACjB,GAAA,EAAD,CACEpM,KAAM,UAAYsP,EAAI,4BACtBsR,SAAO,EACPvT,OAAO,UAHT,IARF,GAeE,kBAACjB,GAAA,EAAD,CACEpM,KAAM,OAASsP,EAAI,4BACnBsR,SAAO,EACPvT,OAAO,UAHT,KAQF,kBAACiT,GAAD,KACE,kBAACnL,GAAA,KAAD,cACmEqL,EADnE,YAEoEC,IA7BxE,KCFJ,UAAevd,cALS,SAAAnF,GAAK,MAAK,CAChCyiB,YAAaziB,EAAM+O,YAAY+T,eAAeL,YAC9CC,aAAc1iB,EAAM+O,YAAY+T,eAAeJ,gBAGT,KAAxC,EAA8Cha,QAAWqa,K,6ICOzD,IAAMC,GAAwBrkB,WAAH,KAIvBgiB,KACa/hB,UAAW,I,GAsDxB,kBAACshB,GAAD,M,GAGI,kBAAC,GAAD,CAAkB7Q,GAAG,qBAAoB,kBAAC,KAAD,CAAkB5J,GAAG,4B,GAiBrB,kBAAC,KAAD,CAAkBA,GAAG,qC,GAE1D,kBAAC,KAAD,CAAkBA,GAAG,yC,GAEM,kBAAC,KAAD,CAAkBA,GAAG,6B,GAa9C,kBAAC,KAAD,CAAkBA,GAAG,0B,GAQrB,kBAAC,KAAD,CAAkBA,GAAG,8B,GAGyB,kBAAC,GAAD,M,GAE9C,kBAAC,KAAD,CAAkBA,GAAG,sC,GAG1B,kBAAC,GAAD,MA2BT,SAlIe,SAAC,GAaV,IAiCQA,EA7CZwd,EAYI,EAZJA,SACAC,EAWI,EAXJA,oBACAC,EAUI,EAVJA,cACAC,EASI,EATJA,kBACAC,EAQI,EARJA,mBACAC,EAOI,EAPJA,SACAhD,EAMI,EANJA,OACAmC,EAKI,EALJA,YACAc,EAII,EAJJA,mBACAC,EAGI,EAHJA,qBACAC,EAEI,EAFJA,KACAxjB,EACI,EADJA,KAoCA,OAAO,oCACL,kBAACogB,GAAD,CAAsBC,OAAQA,IADzB,GAGL,kBAACH,GAAD,KACE,kBAACC,GAAD,QAEE,kBAACsD,GAAA,EAAD,CAAYnhB,MAAO2gB,EAAoB3gB,MAAOohB,OAxCrB,WACA,IAAzBR,EAAcve,QAChBwe,MAwCMD,EAAc9jB,KAAI,SAAAukB,GAAE,OAClB,kBAAC,KAAD,CACEjkB,IAAG,iBAAYikB,EAAGne,IAClBoe,SAAUD,EAAGne,KAAOyd,EAAoBzd,GACxCxB,QAAS,WACPof,EAAmBO,EAAGne,MAGvBme,EAAGrhB,WAKZ,kBAACmhB,GAAA,EAAD,CAAYnhB,MAAO0gB,GACjB,kBAAC,KAAD,CAAUhf,QAlDS,WACzBsf,EACE,sBACA,oCACA,MACA,kBAAM,kBAAC,IAAD,CAAmBN,SAAUA,EAAUa,QAAS,WACpDN,EAAqB,uBACrBC,EAAK,UAAW,6CAEhB,KAyCE,IACA,kBAAC,KAAD,CAAUxf,QAtCa,WAC7Bsf,EACE,sBACA,4CACA,MACA,kBAAM,kBAAC,KAAD,CACJQ,UAAW,WACTP,EAAqB,6BAGzB,KA4BI,IAGA,kBAAC,KAAD,CAAUvf,QAASqf,GAAnB,KAEF,kBAACN,GAAD,KACE,kBAACnO,GAAA,EAAD,CAAUC,YAAa,CACrB/V,KAAM,kBACNC,OAjCEyG,EAiCS,2BAjCHxF,EAAK+J,cAAc,CAACvE,UAmC3Bgd,GAAe,kBAAC,KAAD,CAAUxe,QAAS,WACjClC,OAAOO,KAAP,kBACamgB,EAAYuB,QAAQ,IAAK,IADtC,sBAEE,YAHY,IAQhB,kBAAC,KAAD,CAAU/f,QAAS,WACjBlC,OAAOO,KACL,iBACA,YAHJ,IAQA,kBAAC,KAAD,CAAU2B,QAAS,WACjBsf,EAAmB,QAAS,KAAM,MAAM,wBAAqB,KAD/D,KArBJ,QC/FR,IAAMre,GAAoB,CACxBoe,eACAF,wBACAC,yBACAE,mBAAoB9G,UACpB+G,qBAAsB/G,gBACtBgH,KAAMhH,aAWR,UAAetX,cARS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC2f,SAAUjjB,EAAMyI,QAAQwa,SACxBC,oBAAqBljB,EAAMyI,QAAQya,oBACnCC,cAAenjB,EAAMyI,QAAQ0a,cAC7B7C,OAAQtgB,EAAM+O,YAAY+T,eAAexC,OACzCmC,YAAaziB,EAAM+O,YAAY+T,eAAeL,eAGRvd,GAAxC,EAA2DwD,QAAWub,K,wjBCpBtE,IAAMC,GAAqB,WACzB,IAAMC,EAA6C,IAAxChS,SAASiS,gBAAgBC,aACpClS,SAASiS,gBAAgBhC,MAAMkC,YAAY,OAA3C,UAAsDH,EAAtD,QAGFD,KAEAniB,OAAO6f,iBAAiB,UAAU,kBAAMsC,QACxCniB,OAAO6f,iBAAiB,qBAAqB,kBAAMsC,QAE5C,IAAMlH,GAAgBre,UAAH,KAKJG,WAAY,UAQrBylB,GAAgB5lB,UAAH,KAEJG,WAAY,mBAIrB0lB,IAAa7lB,SAAO8lB,KAAP9lB,CAAH,MAIV+lB,GAAmB,CAC9BC,eAAgB,CACdxgB,SAAU,WACVygB,QAAS,IACTniB,MAAO,OACPD,OAAQ,OACRG,KAAM,OACNE,IAAK,OAGLgiB,OAAQ,GAEVC,kBAAmB,CACjBC,WAAY,WAEdC,WAAY,CACV7gB,SAAU,QACV3B,OAAQ,OACRC,MAAO,MACPwiB,SAAU,SAEZC,OAAQ,CACNH,WAAY,OACZ3D,QAAS,aACT+D,SAAU,SACVtb,SAAU,UAEZub,aAAc,CACZC,KAAM,WAERC,WAAY,CACVxc,MAAO,UACPtG,OAAQ,QAEV+iB,OAAQ,CACNjI,QAAS,gBAEXkI,UAAW,CACTT,WAAY,uB,4kBC5BN,kBAAC,KAAD,CAAkBtf,GAAG,qB,GACrB,kBAAC,KAAD,CAAkBA,GAAG,yB,GAiBzB,kBAACggB,GAAA,EAAD,M,GAGE,kBAAC,GAAD,M,GAmBM,kBAAC,MAAD,CAAUC,OAAK,EAACC,KAAK,oBAAoBtW,GAAG,e,GAC5C,kBAAC,MAAD,CAAOqW,OAAO,EAAME,KAAK,aAAatf,UAAWuf,K,GACjD,kBAAC,MAAD,CAAOD,KAAK,KAAKtf,UAAWwf,K,GAC5B,kBAAC,MAAD,CAAOF,KAAK,KAAKtf,UAAWyf,K,GAC5B,kBAAC,MAAD,CAAOH,KAAK,QAAQtf,UAAW0f,K,GAMlB,kBAACzB,GAAD,CAAe9e,GAAG,aACjC,kBAACwgB,GAAA,EAAD,CAAWjnB,MAAO,kBAAC,KAAD,CAAkByG,GAAI,sCAC7BxG,QAAS,kBAAC,KAAD,CAAkBwG,GAAI,2CAqBtD,UAAeygB,UApGD,SAAC,GAUT,IATJC,EASI,EATJA,qBACAC,EAQI,EARJA,YACA/V,EAOI,EAPJA,SACAgW,EAMI,EANJA,UACAC,EAKI,EALJA,QACAC,EAII,EAJJA,cACAC,EAGI,EAHJA,2BACA1nB,EAEI,EAFJA,MACA2nB,EACI,EADJA,aACI,GAC0B9e,cAAS,MADnC,WACGwV,EADH,KACYuJ,EADZ,MAGJze,gBAAU,WACR0e,IACAR,IACAI,IACAC,MACC,IAEH,IAAMG,EAAoB,WACxB,IAAMC,GAAiBC,SAAqB,SACvCR,GAAa,CAACS,SAAUT,IADc,IAEzCU,oBAAqB,SAAC9nB,EAAS+nB,GAC7BV,EACE,GACArnB,EAFK,OAKL,kBAAM+nB,GAAgB,MACtB,kBAAMA,GAAgB,UAI5BN,EAAWE,IASb,OAAO,kBAACK,EAAA,EAAD,CAAUC,SAAU,CAAa,OAAZ/J,IAC1B,kBAAC,MAAD,CAAQA,QAASA,GAAW,IAA5B,GAEE,kBAACV,EAAA,gBAAD,CAA4B/G,oBAAoBA,aAChD,kBAAC,GAAD,CAAejQ,GAAG,mBAAlB,GAEGghB,GAAgB,kBAACjC,GAAD,CACf5b,OAAQyH,EACR8W,cAdW,SAAAnnB,GACbA,EAAM4I,SAAWyH,GACnB+V,EAAYpmB,EAAM4I,SAadwe,iBAAiB,EACjBC,iBAAkB,kBAAC,GAAD,CAAcze,OAAQyH,EAAUxH,KAAK,KAAKC,MAAOhK,EAAMyhB,OAAO+G,QAChFtF,OAAQ0C,GACR6C,WAAY,YACZC,iBAAkB,mBAClB,kBAAC,GAAD,CAAYvjB,QAAS,WACnBmiB,GAAY,GACZqB,+BAIFhB,GAAgB,kBAAClC,GAAD,CAAe9e,GAAG,aAChC,kBAAC,MAAD,KACE,kBAAC,MAAD,CAAOigB,OAAK,EAACE,KAAK,IACX8B,OAAQ,gBAAExK,EAAF,EAAEA,MAAF,OAAa,kBAAC,MAAD,CAAU7N,GAAE,UAAK6N,EAAMhb,IAAI8hB,QAAQ,MAAO,IAA9B,mBAF1C,eAQE,kBAAC,MAAD,CAAO0D,OAAQ,gBAAExK,EAAF,EAAEA,MAAF,OAAa,kBAAC,MAAD,CAAU7N,GAAE,UAAK6N,EAAMhb,IAAI8hB,QAAQ,MAAO,IAA9B,sBAK3CyC,GAAD,SCxFV,IAAMvhB,GAAoB,CACxBqhB,oBACAD,QAAS7J,YACT0J,2BACAC,kBACAI,kCASF,UAAerhB,cANS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC+iB,UAAWrmB,EAAMoF,MAAMihB,UACvBhW,SAAUrQ,EAAM0S,WAAWrC,SAC3BoW,aAAczmB,EAAM2nB,MAAMlB,gBAGYvhB,GAAxC,EAA2DwD,QAAWkf,K,OCRhE,kBAACC,EAAA,GAAD,CAAQC,OAAO,GACb,yC,GAIe,kBAAC,GAAD,M,GAAW,kBAAC,GAAD,MAYlC,SAxBmB,SAAC,GAA+B,IAA9BC,EAA8B,EAA9BA,eAAgBC,EAAc,EAAdA,SAKnC,OAJA/f,gBAAU,WACR8f,MACC,IAGD,gCAIE,kBAACd,EAAA,EAAD,CAAUC,SAAU,MAAcja,IAAb+a,GAAyBC,YAAY,iBACxD,6BACID,EAAD,UCdX,IAAM9iB,GAAoB,CACxB6iB,eAAgBJ,mBAChBrB,QAAS7J,aAOX,UAAetX,cAJS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC0kB,SAAUhoB,EAAM2nB,MAAMK,YAGgB9iB,GAAxC,EAA2DwD,QAAWwf,M,sICWhE5S,GAAqB5M,SAlBW,SAAC,GAMjC,IACQjD,EANZ8P,EAKI,EALJA,UAEA7J,GAGI,EAJJ8J,YAII,EAHJ9J,UACAyc,EAEI,EAFJA,SACAloB,EACI,EADJA,KAIA,OACE,kBAAC,IAAD,CACE8J,cAJQtE,EAIQ,yDAJFxF,EAAK+J,cAAc,CAACvE,QAKlC4J,GAAE,UAAK8Y,EAAWA,EAAW,IAAM,IAAjC,OAAsC5S,IACvC7J,MAOM0c,EAAa,SAAC,GAAD,IACxBvS,EADwB,EACxBA,WACAN,EAFwB,EAExBA,UACA7J,EAHwB,EAGxBA,SAHwB,OAKxB,kBAAC,IAAD,CACE2D,GAAE,aAAQwG,EAAR,YAAsBN,GACxBjG,OAAO,SACPuT,SAAS,GACRnX,IAIQ2c,EAAW,SAAC,GAInB,IAHJxS,EAGI,EAHJA,WACAyS,EAEI,EAFJA,WACA5c,EACI,EADJA,SAEM6c,GAAcD,aAAA,EAAAA,EAAY1jB,SAAU,YAAc0jB,EAAWrlB,KAAK,KAAO,IAE/E,OACE,kBAAC,IAAD,CACEoM,GAAI,CACFmZ,SAAU,MAAF,OAAQ3S,EAAR,SACR4S,OAAQ,IAAF,OAAMF,IAEdjZ,OAAO,UAEN5D,IAWMgd,EAAmB,SAAC,GAI3B,IAHJ7S,EAGI,EAHJA,WACAyS,EAEI,EAFJA,WACA5c,EACI,EADJA,SAEA,OAA2B,KAAvB4c,aAAA,EAAAA,EAAY1jB,QAEZ,kBAACwjB,EAAD,CAAYvS,WAAYA,EAAYN,UAAW+S,EAAW,IACvD5c,GAKL,kBAAC2c,EAAD,CAAUxS,WAAYA,EAAYyS,WAAYA,GAC3C5c,IAWP,iBAAgByR,EAASD,GA6CvB,MAAO,CACLkL,aACAC,WACAK,mBACApT,qBACAqT,yBAjD+B,SAACC,EAAc5oB,GAC9C,GAAI4oB,EACFzL,EAAQ0L,KAAK,CACXL,SAAU,GAAF,OAAKtL,EAAMhb,IAAX,YAAkB0mB,EAAlB,WACR5oB,cAEG,CACL,IAAM8oB,GAAgBC,OAAO7L,EAAMhb,KAEnCib,EAAQ0L,KAAK,CACXL,SAAUM,EAAgB,UAC1B9oB,YAuCJgpB,yBAlC+B,SAACC,EAAYC,GAC5C,IAAMJ,GAAgBC,OAAO7L,EAAMhb,KAC7BumB,EAASU,kBAA8B,CAC3CD,YACAE,iBAAkBH,EAAWI,aAE/BlM,EAAQ0L,KAAK,CACXL,SAAUM,EAAgB,WAAaG,EAAWK,MAClDtpB,MAAO,CACLipB,aACAC,aAEFT,YAuBFrS,WAnBiB,SAACP,EAAYlW,GAAyB,IAApB4pB,IAAoB,yDACjDf,EAAW,MAAH,OAAS3S,EAAT,YAAuBlW,GACrC,GAAI4pB,EAAU,CACZ,IAAMrnB,EAAMib,EAAQqM,WAAW,CAAChB,aAChCzmB,OAAOO,KAAKJ,EAAK,eAEjBib,EAAQ0L,KAAK,CACXL,iB,6CCpID,IAAMO,EAAS,SAAC7mB,GAGrB,IAHyC,IAAfunB,EAAe,uDAAN,EAC/BC,EAAgBxnB,EAAI8hB,QAAQ,MAAO,IAE9B2F,EAAI,EAAGA,EAAIF,EAAQE,IAC1BD,EAAgBA,EAAcE,UAAU,EAAGF,EAAcG,YAAY,MAGvE,OAAOH,I,8CCPT,QAAevO,OAAO2O,OAAO,CAC3BC,OAAQ,SACRC,OAAQ,SACRC,aAAc,eACdC,WAAY,gB,qECFDC,EAAW,SAAAC,GAAa,QAAMA,GAAiBjP,OAAOkP,OAAOC,KAAgBC,QAAQH,IAAkB,GAEvGI,EAAiB,SAACC,EAAMC,GAAP,OAAoBD,IAASC,GAAUA,EAAO9lB,OAAS,GAAK8lB,EAAO1d,SAASyd,K,iOCJpGtpB,EAAkB,GAIlBE,EAAe,GAGN,SAASspB,IAAsC,IAA9B3qB,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,E,mCCT/B4qB,EAAgB,wBAChBC,EAAqB,6BACrBC,EAAiB,yBAEjBC,EAAe,SAAC9B,EAAYC,EAAW8B,GAAxB,MAAoC,CAC9DpqB,KAAMgqB,EACN/pB,QAAS,CACPooB,aACAC,YACA8B,YAISC,EAAgB,SAAChC,EAAYC,EAAW/pB,GAAxB,MAAsC,CACjEyB,KAAMkqB,EACNjqB,QAAS,CACPooB,aACAC,YACA/pB,c,oBClBJ,QAAegc,OAAO2O,OAAO,CAC3BoB,OAAQ,SACRC,OAAQ,SACRnB,OAAQ,SACRoB,QAAS,UACTC,OAAQ,W,otBCaOC,G,WA4BAC,G,WAwBAC,G,WAqDAC,GAhHF,WAAWxC,EAAYC,EAAW8B,EAAQU,GAA1C,yEAIN,OAHDC,EAAW1C,EAAW2C,oBACtBC,EAAYF,EAAWL,EAAoBC,EAFpC,UAIAhrB,QAAKsrB,EAAW5C,EAAYC,EAAW8B,EAAQU,GAJ/C,+EAOR,SAAUJ,EAAkBrC,EAAYC,EAAW8B,EAAQU,GAA3D,uEACY,OADZ,UACkBnrB,QAAKC,gBAAkByoB,EAAW6C,SAAU,CACjErrB,OAAQ,OACR4b,KAAM,EAAF,GACFtX,OAAQmkB,EAAUrT,WAClBqT,YACA8B,UACGU,GAJD,IAKFA,OAAQ,CACN3G,YAAY,GAEdgH,eAAgB9C,EAAWI,aAE7B2C,mBAAoB,CAAC,qBACrBC,QAAS,CACP,0BAA0B,KAfzB,YACC9sB,EADD,QAmBQkd,OAAkC,IAA1Bld,EAASkd,KAAKyH,QAnB9B,gBAoBH,OApBG,UAoBGnjB,QAAI8b,YAAqB,CAC7B7b,KAAM,QACN5B,MAAO,gCACPqd,KAAMld,EAASkd,KAAKrd,OAAS,wCAvB5B,uCA4BA,SAAUusB,EAAiBtC,EAAYC,EAAW8B,EAAQU,GAA1D,2EAGL,OAFMQ,GAAWC,SACXntB,EAAQiqB,EAAWmD,aAAe,kDAFnC,UAGCzrB,QAAI8b,iBAA0ByP,EAAUltB,IAHzC,OAIY,OAJZ,UAIkBuB,QAAKirB,EAAevC,EAAYC,EAAW8B,EAAQU,GAJrE,OAKL,OADMvsB,EAJD,iBAKCwB,QAAI8b,uBAAgCyP,IALrC,uCAQA/sB,GARA,IASHktB,aAAc,IACRltB,GAAYA,EAAS2kB,QACrB,CAAC,CACCljB,KAAM,sBACNC,QAAS,CACPmqB,SACAtqB,SAAU,CAAC,CAACmV,WAAYqT,EAAUrT,gBAGtC,OAlBH,wCAwBA,SAAU2V,EAAcvC,EAAYC,EAAW8B,EAAQU,GAAvD,2EAEc,OAFd,mBAEoBnrB,QAAKC,gBAAkByoB,EAAW6C,SAAU,CACjErrB,OAAQ,OACR4b,KAAM,EAAF,GACFtX,OAAQmkB,EAAUrT,WAClBqT,YACA8B,UACGU,GAJD,IAKFK,eAAgB9C,EAAWI,aAE7B2C,mBAAoB,CAAC,qBACrBC,QAAS,CACP,0BAA0B,KAb3B,YAEG9sB,EAFH,QAgBUkd,MAAoC,sBAA5Bld,EAASkd,KAAKiQ,UAhBhC,gBAiBD,OAjBC,UAiBK3rB,QACJ8b,YAAqB,CACnB7b,KAAM,QACN5B,MAAO,2CACPqd,KAAMkQ,oBAA2BptB,EAASkd,KAAKmQ,WArBlD,mCAwBQrtB,EAASkd,MAAQld,EAASkd,KAAKqP,QAAUvsB,EAASkd,KAAKqP,OAAOe,aAxBtE,iBA0BoB,OADfA,EAAcC,mBAAwBvtB,EAASkd,KAAKqP,OAAOe,aAzBhE,WA0B0BlsB,QAAKC,qBAAuBisB,EAAa,CAClEhsB,OAAQ,OACR4b,KAAM,EAAF,GACFtX,OAAQmkB,EAAUrT,WAClBqT,YACA8B,UACGU,GAJD,IAKFK,eAAgB9C,EAAWI,eAjC9B,QAoCD,OAVMsD,EA1BL,kBAoCKpsB,QAAKmsB,2BAAiCC,EAAatQ,KAAMld,EAASkd,KAAKqP,OAAOkB,UApCnF,gCAsCD,OAtCC,WAsCKrsB,QAAKkrB,EAAatsB,GAAoC,IAA1BA,EAASkd,KAAKyH,QAAmB,UAAY,WAtC9E,iCAyCI3kB,EAASkd,MAzCb,qCA2CG,gBAAiB7b,qCA3CpB,iBA4CD,OA5CC,WA4CKG,QAAIksB,aACR,gCACA,qCAFQ,OA5CT,sDAqDA,SAAUpB,EAAYtsB,EAAUyB,GAAhC,+EAYL,OAXM5B,EAAQG,EAASkd,KAAKrd,OAAS,0CAC/BC,EAAUE,EAASkd,KAAKpd,QACxBU,EAAMR,EAASkd,KAAKyQ,gBAAd,UAAmCC,KAAnC,OAAwD5tB,EAASkd,KAAKyQ,sBAAoB7f,EAChGxN,EAASN,EAASkd,KAAK5c,OACvB4c,EAAO,SAAC,GAAD,IAAE3G,EAAF,EAAEA,mBAAoBsX,EAAtB,EAAsBA,WAAtB,OACX,kBAACC,EAAA,EAAD,CACExQ,aAAc,CAAC9c,MAAKV,UAASQ,UAC7BiW,mBAAoBA,EACpBsX,WAAYA,KATX,UAYCrsB,QAAI8b,YAAqB,CAAC7b,OAAM5B,QAAOC,UAASod,OAAM1c,SAZvD,uC,0HCvHDuF,GAAoB,CACxByQ,WAAY,SAAApU,GAAM,OAAIoV,2BAAoCpV,KAG5D,UAAe4D,cAAQ,KAAMD,I,gmBCFAiW,OAAO2O,OAAO,CACzCoD,QAAS,UACTC,SAAU,aALZ,IAoCaC,GAAoB,SAACC,EAAoBptB,GACpD,IAAMsR,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEhC6nB,EAAgB,SAAA1hB,GAAI,OACvByhB,EAAmBzhB,IAAS,IAAIvM,KAAI,SAAAkuB,GAAK,MACxC,CACE7hB,SAAU,CAAC,OAEP0e,cAAe,QACfoD,SAAUD,EAAMC,SAChBlP,aAAciP,EAAMjP,aACpB7Y,GAAI8nB,EAAM9nB,GACVlD,MAAOgrB,EAAMhrB,OAASgrB,EAAME,YAC5B7H,KAAM2H,EAAM9nB,IACR8nB,EAAMG,aAAe,CAACA,aAAcH,EAAMG,cAAgB,IAC1DH,EAAMhB,WAAa,CAACA,WAAYgB,EAAMhB,YAAc,KAG5DnC,cAAe,YACfuD,QAAQ,EACRloB,GAAI8nB,EAAM9nB,GACVlD,MAAOgrB,EAAMhrB,OAASgrB,EAAME,YAC5BG,SAAUL,EAAM1J,SAChB6G,OAAQ,QAId,MAAO,CACLN,cAAe,OACf7nB,MAAO,KACPsrB,QAAS,uBACTD,UAAU,EACVliB,SAAU,CACR,CACE0e,cAAe,SACf3kB,GAAI,kBACJlD,MAAOgP,EAAI,wCACXuc,WAAY,eACZpiB,SAAU4hB,EA1EI,oBA4EhB,CACElD,cAAe,SACf3kB,GAAI,oBACJlD,MAAOgP,EAAI,0CACXuc,WAAY,eACZpiB,SAAU4hB,EAhFM,yB,IAsFwBnW,UAAgB,CAC9D4W,eAAgB5W,UAAgB,CAC9B6W,KAAM7W,WACNpS,OAAQoS,aAEV8W,gBAAiB9W,UACjB+W,UAAW/W,UACXsW,YAAatW,UAAgB,CAC3BvL,KAAMuL,0B,qdC/FH,IAAMgX,GAAuBxvB,UAAH,MAQpByvB,GAAsBzvB,UAAH,KAGfC,WAAY,GACPE,WAAY,SAKbuE,M,4kBCuDX,kBAAC,IAAD,CAAkBoC,GAAG,kCAe/B,UAAeiD,SA5Ee,SAAC,GAA2D,IAA1D2kB,EAA0D,EAA1DA,mBAAoBgB,EAAsC,EAAtCA,QAASC,EAA6B,EAA7BA,SAAUC,EAAmB,EAAnBA,QAAStuB,EAAU,EAAVA,KACxEuuB,EAAwBnB,EAAmBU,gBAAkBV,EAAmBU,eAAehpB,OADb,GAExD4C,cAAS,CACvC8mB,OAAO,EACPC,qBAAsBF,IAJgE,WAEjFG,EAFiF,KAEvEC,EAFuE,KAMlFC,GAAcle,cACpBke,EAAYxd,QAAUsd,EAEtB,IAAMG,GAAsB7d,cAAQ,kBAAM8d,GAAoBV,KAAU,CAACA,IA2BzE,OACE,kBAACF,GAAD,KACE,kBAACW,EAAD,CACEP,QAASA,EACTP,KAAMZ,GAAkBC,EAAoBptB,GAC5C+uB,WAAS,EACTtU,SA/BuB,SAAC,GAAoB,IAAnB2P,EAAmB,EAAnBA,OAAQoE,EAAW,EAAXA,MACrCG,EAAY,SACPC,EAAYxd,SADN,IAETgZ,SACAoE,YA4BEhE,KAAK,WAEN+D,GACI,kBAACM,EAAD,CACDP,QAASA,EACTP,KAAMX,EAAmBU,eAAeC,KAAKA,KAC7CgB,WAAS,EACTtU,SA/B2B,SAAC,GAAoB,IAAnB2P,EAAmB,EAAnBA,OAAQoE,EAAW,EAAXA,MAC3CG,EAAY,SACPC,EAAYxd,SADN,IAET0c,eAAgB1D,EAChBqE,oBAAqBD,MA4BjBhE,KAAK,WAGT,kBAAC2D,GAAD,KACE,kBAACzgB,EAAA,EAAD,CACEoS,IAAI,UACJ8D,UAAW8K,EAASD,sBAAwBC,EAASF,MACrDxqB,QA/BkB,WACxB,IFhB2BomB,EACvB4E,EEeEC,EAAgB,SF/BM,SAAC7B,EAAoBhD,GACnD,IAAM8E,EAAc,SAAAvjB,GAAI,cAEnBA,GAAQyhB,EAAmBzhB,IAAS,IAAIzF,QAAO,SAAC1G,EAAQ8tB,GAAT,UAAC,MAC3C9tB,GAD0C,UACjC8tB,EAAM9nB,GAAK4kB,EAAOkD,EAAM9nB,QACpC,MAIP,gBACK0pB,EAlBe,oBAmBfA,EAlBiB,sBEuCfC,CAAiB/B,GFjBKhD,EEiB+BsE,EAAStE,OFhB/D4E,EAAY,SAAAzP,GAChB,OAAOA,EAAE7f,IAAM6f,EAAE7f,IAAM6f,GAGlBjgB,KAAQ8qB,GAAQ,SAAC5qB,EAAQC,EAAOC,GAAhB,UAAC,MAEjBF,GAFgB,UAGlBE,EAAM8Y,MAAM4W,QAAQ3vB,GAASA,EAAML,IAAI4vB,GAAaA,EAAUvvB,OAEhE,OEMkB,IAEjBquB,eAAgBY,EAASZ,iBAG3BO,EAASY,IA0BHtU,KAAK,UAJP,S,qmBCpDS0U,I,YAkCAC,IAxCF,YAAWC,EAAkBtG,EAAW8B,EAAQU,EAAQ+D,GAAxD,yEACS,OADT,UACelvB,QAAKgc,MADpB,OAEW,OADlBC,EADO,iBAEiBjc,QAAK+uB,GAAuBE,EAAkBtG,EAAW1M,EAAeiT,GAFzF,OAGb,OADMC,EAFO,iBAGPnvB,QAAKgvB,GAAqBC,EAAkBhT,EAAekT,EAAiBxG,GAHrE,wCAMR,SAAUoG,GAAsBE,EAAkBtG,EAAW1M,EAAeiT,GAA5E,iFAS8B,OAR7BrT,EAAU,CACduT,YAAa,IACXC,MAAO1G,EAAUrT,YACM,OAAnBqT,EAAUuB,KAAgB,CAAC/R,KAAMwQ,EAAU2G,IAAI5sB,KAAK,MAAQ,KAI9D6sB,EARD,iBAQsBN,EAAiBO,SARvC,uBASoCxvB,QAAKC,gBAAkBsvB,EAAU1T,GATrE,OAcmB,OAdnB,SASQiR,EATR,EASEhR,KACDiS,EAAW,SAAA0B,GAAU,OAAIxT,EAAc7b,IAAI,CAC/CqvB,aACA3C,wBAZG,UAcyB9sB,QAAK4rB,KAd9B,OAgBL,OAFMuD,EAdD,kBAgBC/uB,QAAI8b,UACRiT,EACArC,EAAmBI,YAAY7hB,KAC/B,MACA,kBACE,kBAAC,GAAD,CACE2iB,QAASkB,EAAOlB,QAChBF,QAASoB,EAAOpB,QAChBC,SAAUA,EACVjB,mBAAoBA,OAGxB,IA5BG,iCA+BEqC,GA/BF,yCAkCA,SAAUH,GAAoBtG,EAAYzM,EAAekT,EAAiBxG,GAA1E,qFAKC,OALD,UAKOxM,QAAKF,GALZ,OAuBH,OAvBG,aAGDwT,WAAajC,EAHZ,EAGYA,eAAgBE,EAH5B,EAG4BA,gBAAiBgC,EAH7C,EAG6CA,kBAC9C5C,EAJC,EAIDA,mBAGFpE,EAAW6C,SAAW,qBAChBoE,EAAuB7C,EAAmBU,eAC5CoC,aAAA,IACEC,QAAS/C,EAAmBU,eAAehpB,OAAO6G,MAC/CmiB,IAEL,KACErC,EAAS,CACb2E,qBAAsB,CACpBN,SAAU9G,EAAW8G,SACrB9B,kBACAgC,qBAEFK,SAAUJ,GApBT,WAuBG3vB,QAAK+qB,EAAmBrC,EAAYC,EAAW,KAAMwC,GAvBxD,QAwBH,OAxBG,WAwBG/qB,QAAI8b,gBAAyBiT,IAxBhC,gE,4CCbUa,I,YAoDAC,I,YAIAC,I,YAiBAC,IAxGF,YAAWzH,EAAYC,EAAW8B,EAAQU,EAAQ+D,GAAlD,2EACTxG,EAAWK,MADF,qBAEPL,EAAW0H,WAFJ,qBAGLlB,EAAOmB,gBAAiBnB,EAAOmB,cAAcD,WAHxC,gBAIP,OAJO,UAIDpwB,QAAKiwB,GAAyB,CAACvH,aAAYC,YAAWuG,WAJrD,6BAMP,OANO,UAMDlvB,QAAK0W,cAAwB,kEAN5B,mCASLwY,EAAOoB,aATF,iBAUA,OAVA,WAUMtwB,QAAKgwB,GAAyB,CAACtH,aAAYwG,SAAQvG,cAVzD,iDAYP,OAZO,WAYD3oB,QAAK0W,cAAwB,4DAZ5B,qCAgBLzV,EAAUiuB,GAAUA,EAAOmB,eAAiBnB,EAAOmB,cAAc3H,EAAWxjB,KAhBvE,iBAkBF,OAlBE,WAkBIlF,QAAKkwB,GAA0B,CAACxH,aAAYC,YAAW8B,SAAQU,SAAQ+D,SAAQjuB,YAlBnF,iDAoBT,OApBS,WAoBHjB,QAAK0W,cAAD,+CAAiEgS,EAAWxjB,KApB7E,yCAyBf,IAAMqrB,GACA,KADAA,GAEI,SAFJA,GAGI,SAGH,SAAUP,GAAV,0FACiB,OADkBtH,EAAnC,EAAmCA,WAAYC,EAA/C,EAA+CA,UAAWuG,EAA1D,EAA0DA,OAA1D,UACuBlvB,QAAKgc,MAD5B,OAIL,OAHMC,EADD,OAGCuU,EAAkBtB,EAAOoB,aAH1B,UAIClwB,QAAI8b,UAAA,iBACEwM,EAAWK,OADb,yBAEUL,EAAWK,MAFrB,UAGR,MACA,YAAa,IAAXlmB,EAAW,EAAXA,MAgBA,OAAO,kBAAC2tB,EAAD,CACLzH,MAAOL,EAAWK,MAClB0H,QAASvB,EAAOuB,QAChB5H,iBAAkBH,EAAWI,WAC7BH,UAAWA,EACXxT,mBAAoB+Z,EAAO/Z,oBAAsB,GACjDqO,UArBgB,SAAC,GAA4B,IAA3B9kB,EAA2B,EAA3BA,QAASotB,EAAkB,EAAlBA,aAC3BjpB,IACAoZ,EAAc7b,IAAI,CAACqC,OAAQ8tB,GAAiB7xB,UAASotB,kBAoBrD4E,QAjBc,SAAC,GAAc,IAAbhyB,EAAa,EAAbA,QAChBmE,IACAoZ,EAAc7b,IAAI,CAACqC,OAAQ8tB,GAAqB7xB,aAgBhDiyB,SAbe,WACf9tB,IACAoZ,EAAc7b,IAAI,CAACqC,OAAQ8tB,WAc/B,IAnCG,OAqCY,OArCZ,UAqCkBpU,QAAKF,GArCvB,WAqCCrd,EArCD,QAsCQ6D,SAAW8tB,GAtCnB,0CAuCI,MAvCJ,WA0CChN,EAAU3kB,EAAS6D,SAAW8tB,GACX,OAArB3xB,EAASF,QA3CR,iBA+CH,OAHM2B,EAAOkjB,EAAU,UAAY,UAC7B9kB,EAAQG,EAASF,SAAW,0CA7C/B,WA+CG0B,QAAI8b,YAAqB,CAAC7b,OAAM5B,WA/CnC,iCAiDE,CAAC8kB,QAASA,EAASuI,aAAcltB,EAASktB,eAjD5C,yCAoDA,SAAUmE,GAAV,8EACL,OADwCvH,EAAnC,EAAmCA,WAAYC,EAA/C,EAA+CA,UAAWuG,EAA1D,EAA0DA,OAA1D,UACClvB,QAAKkvB,EAAOmB,cAAcD,WAAY1H,EAAYC,GADnD,wCAIA,SAAUuH,GAAV,4FACiB,OADmBxH,EAApC,EAAoCA,WAAYC,EAAhD,EAAgDA,UAAWuG,EAA3D,EAA2DA,OAAQzE,EAAnE,EAAmEA,OAAQU,EAA3E,EAA2EA,OAAQlqB,EAAnF,EAAmFA,QAAnF,UACuBjB,QAAKgc,MAD5B,OAYL,OAXMC,EADD,OAECuH,EAAY,SAAC,GAA4B,IAA3B9kB,EAA2B,EAA3BA,QAASotB,EAAkB,EAAlBA,aAC3B7P,EAAc7b,IAAI,CAACqC,OAAQ8tB,GAAiB7xB,UAASotB,kBAEjD4E,EAAU,SAAC,GAAc,IAAbhyB,EAAa,EAAbA,QAChBud,EAAc7b,IAAI,CAACqC,OAAQ8tB,GAAqB7xB,aAE5CiyB,EAAW,WACf1U,EAAc7b,IAAI,CAACqC,OAAQ8tB,MATxB,UAYCvwB,QAAKiB,EAASynB,EAAYC,EAAW8B,EAAQU,EAAQ+D,EAAQ1L,EAAWkN,EAASC,GAZlF,OAcE,OAdF,WAcQ3wB,QAAKmwB,GAAclU,GAd3B,kFAiBA,SAAUkU,GAAalU,GAAvB,6EACY,OADZ,UACkBE,QAAKF,GADvB,WACCrd,EADD,QAEQ6D,SAAW8tB,GAFnB,yCAGI,MAHJ,UAMChN,EAAU3kB,EAAS6D,SAAW8tB,IAEhC3xB,EAASF,QARR,iBAYH,OAHM2B,EAAOkjB,EAAU,UAAY,UAC7B9kB,EAA6B,YAArBG,EAASF,QAAwB,0CAA4CE,EAASF,QAVjG,WAYG0B,QAAI8b,YAAqB,CAAC7b,OAAM5B,WAZnC,iCAeE,CAAC8kB,QAASA,EAASuI,aAAcltB,EAASktB,eAf5C,yC,4nBCnFU8E,I,YAmCAC,I,YAQAC,I,YAUAC,I,YAqBAC,I,YAOAC,I,YAWAC,I,YA+BAC,I,YAsBAC,I,qiCArKV,IAAMC,GAAa,SAAAvqB,GAAG,OAAI,IAAIsW,SAAQ,SAACC,EAASiU,GACrD,IAAMC,EAAI3f,SAAS4f,cAAc,UACjCD,EAAEzqB,IAAMA,EACRyqB,EAAEE,OAASpU,EACXkU,EAAEG,QAAUJ,EACZ1f,SAAS+f,KAAKC,YAAYL,OAGfM,GAAU,SAAA/qB,GAAG,OAAI,IAAIsW,SAAQ,SAACC,EAASiU,GAClD,IAAMK,EAAO/f,SAASkgB,qBAAqB,QAAQ,GAC7CC,EAAOngB,SAAS4f,cAAc,QACpCO,EAAK/iB,IAAM,aACX+iB,EAAK1xB,KAAO,WACZ0xB,EAAKrwB,KAAOoF,EACZirB,EAAKC,MAAQ,MACbD,EAAKN,OAASpU,EACd0U,EAAKL,QAAUJ,EACfK,EAAKC,YAAYG,OAGZ,SAAUnB,GAAiBqB,GAA3B,+EAEkB,OADjBC,EAAa1wB,OAAO2wB,iBAAmB,MADxC,UAEwBnyB,QAAKC,yBAF7B,OAECsiB,EAFD,YAGgB0P,GAHhB,8DAGMG,EAHN,SAIQC,KAAK5lB,SAASylB,GAJtB,iBAKD,OALC,WAKKlyB,QAAKoyB,EAAOnxB,QAAR,UAAoBmxB,EAAOtrB,IAA3B,cAAoCyb,EAAeJ,eAL5D,sHAAAmQ,IAAA,0EAUA,IAAML,GAAU,CACrB,CAACnrB,IAAK,oCAAqC7F,QAASowB,GAAYgB,KAAM,CAAC,QACvE,CAACvrB,IAAK,2DAA4D7F,QAASowB,GAAYgB,KAAM,CAAC,QAC9F,CAACvrB,IAAK,2CAA4C7F,QAASowB,GAAYgB,KAAM,CAAC,QAC9E,CACEvrB,IAAK,8DACL7F,QAASowB,GACTgB,KAAM,CAAC,kBAET,CACEvrB,IAAK,6DACL7F,QAASowB,GACTgB,KAAM,CAAC,gBAAiB,eAAgB,QAE1C,CAACvrB,IAAK,oBAAqB7F,QAASowB,GAAYgB,KAAM,CAAC,QACvD,CAACvrB,IAAK,mDAAoD7F,QAASowB,GAAYgB,KAAM,CAAC,QACtF,CAACvrB,IAAK,8BAA+B7F,QAAS4wB,GAASQ,KAAM,CAAC,QAC9D,CAACvrB,IAAK,uBAAwB7F,QAAS4wB,GAASQ,KAAM,CAAC,QACvD,CAACvrB,IAAK,2CAA4C7F,QAAS4wB,GAASQ,KAAM,CAAC,SAGhEE,GAAyB,SAAAvW,GAAO,OAAI,SAAAwW,GAC/CxW,EAAQ5b,IAAIoyB,KAGP,SAAU3B,GAAiB4B,GAA3B,yEAEW,OAFX,UAEiBtW,QAAKsW,GAFtB,OAIH,OAFM5sB,EAFH,OAGG7E,EAAS8qB,iBAAyBjmB,GAHrC,UAIGzF,QAAIY,GAJP,8DAQA,SAAU8vB,KAAV,2EACgB,OADhB,UACsB9wB,QAAK,CAACwB,OAAOsE,IAAKtE,OAAOsE,IAAI4sB,kBADnD,YACCC,EADD,QAEYC,qBAFZ,iBAGyB,OAHzB,UAG+B5yB,QAAKgc,MAHpC,OAIc,OADXyW,EAHH,iBAIoBzyB,QAAKuyB,GAAwBE,GAJjD,OAKH,OADMI,EAJH,kBAKG7yB,QAAK,CAAC2yB,EAAcA,EAAaC,sBAAuBC,GAL3D,QAMH,OANG,WAMGC,QAAMjC,GAAkB4B,GAN3B,yCAUA,SAAU1B,GAAmB7U,GAA7B,yEACCxd,EAAUwd,EAAaxd,QAAQ+kB,QAAQ,UAAW,KADnD,KAKGvH,EAAa5R,MALhB,OAME,UANF,OASE,SATF,6BAODtJ,EAAS+xB,YAAwB,CAAC1yB,KAAM,QAAS5B,MAAOC,IAPvD,kCAUDsC,EAAS+xB,YAAwB,CAAC1yB,KAAM,OAAQ5B,MAAOC,IAVtD,iCAaK,IAAIs0B,MAAJ,0CAA6C9W,EAAa5R,QAb/D,WAgBDtJ,EAhBC,iBAiBH,OAjBG,WAiBGZ,QAAIY,GAjBP,yCAqBA,SAAUgwB,GAAkBiC,GAA5B,uEAEkB,OAFlB,UAEwB9W,QAAK8W,GAF7B,OAGH,OADM/W,EAFH,iBAGGlc,QAAK+wB,GAAoB7U,GAH5B,8DAOA,SAAU+U,KAAV,6EACO,OADP,UACajxB,QAAK,CAACwB,OAAOsE,IAAKtE,OAAOsE,IAAIotB,SAD1C,OAEY,OADXC,EADD,iBAEkBnzB,QAAK,CAACmzB,EAAKA,EAAIC,cAFjC,YAECC,EAFD,QAGQT,qBAHR,iBAI0B,OAJ1B,UAIgC5yB,QAAKgc,MAJrC,OAKc,OADXiX,EAJH,kBAKoBjzB,QAAKuyB,GAAwBU,GALjD,QAMH,OADMJ,EALH,kBAMG7yB,QAAK,CAACqzB,EAAUA,EAAST,sBAAuBC,GANnD,QAOH,OAPG,WAOGC,QAAM9B,GAAmBiC,GAP5B,yCAWA,SAAU/B,KAAV,qEACsC,IAAvC1vB,OAAO8xB,4BADN,gBAEH,OAFG,UAEGtzB,QAAK4wB,GAAkBqB,IAF1B,OAGH,OAHG,UAGGjyB,QAAKwB,OAAO+xB,uBAHf,OAKL,OALK,UAKCvzB,QAAK8wB,IALN,OAML,OANK,UAMC9wB,QAAKixB,IANN,wCASA,I,GAAMuC,GAAe,SAAA/zB,GAAK,OAAIA,EAAMg0B,MAE9BC,GAAqB,SAAAj0B,GAAK,OAAIA,EAAMk0B,YACpCC,GAAuB,SAAAn0B,GAAK,OAAIA,EAAMo0B,cAMtCC,GAAiB,SAACnL,EAAWoL,GAAZ,UAAC,MAC1B,IAAIvyB,OAAOwyB,MAAMC,MAAMC,aADE,IAE5B5e,WAAYqT,EAAUrT,WACtB6e,WAAYxL,EAAU/oB,MAAMw0B,MAC5BC,cAR8BC,EAQCP,EAAUQ,QARKD,GAAgBA,EAAajwB,OAAS,EAClFpE,wBAAyBq0B,GACzB,QAF4B,IAAAA,GAWnBE,GAAgB,SAAAT,GAAS,gBACjC,IAAIvyB,OAAOisB,KAAKgH,gBADiB,IAEpClf,MAAO,OACPE,SAAUse,EAAUW,eAAexvB,MAG9B,SAAUisB,GAAaxI,GAAvB,4EACCgM,EAAkB,CACtBrf,WAAYqT,EAAUrT,YAGD,OAAnBqT,EAAUtoB,KALT,gBAMHs0B,EAAgBC,iBAAmBjM,EAAU2G,IAC7CqF,EAAgBE,cAAgB,YAP7B,0BAQyB,UAAnBlM,EAAUtoB,KARhB,iBASe,OATf,UASqBV,QAAO6zB,IAT5B,OASGO,EATH,OAWHY,EAAgBE,cAAgB,mBAChCF,EAAgBG,YAAchB,GAAenL,EAAWoL,GACxDY,EAAgBI,SAAWP,GAAcT,GACzCY,EAAgBjf,cAAgBiT,EAAU/oB,MAAMiN,OAd7C,8BAgBG,IAAImmB,MAAJ,sCAAyCrK,EAAUtoB,OAhBtD,iCAmBEs0B,GAnBF,yCAsBA,SAAUvD,KAAV,yEACQ,OADR,UACczxB,QAAO+zB,IADrB,OAEU,OADTD,EADD,iBAEgB9zB,QAAOi0B,IAFvB,UAECoB,EAFD,QAIDvB,IAAQuB,EAJP,sBAKG,IAAIhC,MAAM,iFALb,WAQDS,EARC,0CASI,QATJ,YAYDuB,EAZC,oBAaiB,WAAhBA,EAAO9K,KAbR,0CAcM,UAdN,WAewB,WAAhB8K,EAAO9K,KAff,0CAgBM,UAhBN,cAkBK,IAAI8I,MAAJ,4DAA+DgC,EAAO9K,OAlB3E,cAsBC,IAAI8I,MAAM,yFAtBX,yCAyBQ,YAAWtK,EAAYC,EAAW8B,EAAQU,EAAQ+D,GAAlD,qFACb,OADa,UACPlvB,QAAKkxB,IADE,WAGPjC,EAAmB,IAAIztB,OAAOwyB,MAAMC,MAAMxuB,QAAQ4pB,MAAM4F,uBAAuBvM,EAAWrD,KAAMqD,EAAWxjB,KAChGgwB,YAAYxM,EAAWyM,WACpCC,KAAe1M,EAAWI,YALjB,gBAQX,OAFMuM,EAAqBza,OAAOsE,QAAQwJ,EAAWI,YAClDhqB,KAAI,2BAAEM,EAAF,KAAOD,EAAP,YAAkBa,QAAK,CAACivB,EAAkBA,EAAiBlL,aAAc3kB,EAAKD,MAP1E,UAQLuB,QAAI20B,GARC,WAWPC,EAAiB,IAAI9zB,OAAOwyB,MAAMuB,QAAQC,6BAA6B,CAC3ElgB,WAAYqT,EAAUrT,WACtBG,SAAUkT,EAAUrT,cAEPmgB,OAETC,EAAQ,IAAIl0B,OAAOwyB,MAAMuB,QAAQI,4BAA4B,CACjErgB,WAAYqT,EAAUrT,aAGlBsgB,EAAM,IAAIp0B,OAAOwyB,MAAMuB,QAAQM,eAAeC,4BAA4BR,EAAgBI,GACzE,OAAnB/M,EAAUtoB,MAA0C,IAAzBsoB,EAAU2G,IAAIjrB,SAC3CuxB,EAAIG,UAAY,iBAAO,CAAC7wB,GAAIyjB,EAAU2G,IAAI,MAvB/B,KA2BC3G,EAAUrT,WA3BX,KA4BJoT,EAAWnT,MA5BP,sBA4BiB,OA5BjB,WA4BuBvV,QAAKoxB,IA5B5B,4BAiCW,OAjCX,UA0BP4E,EA1BO,CA2BX1gB,WA3BW,KA4BXC,MA5BW,MA+BPvU,EAASQ,OAAOy0B,oBAAoBC,wBAAwBjH,EAAkB+G,EAAWJ,GA/BlF,WAiCiB51B,QAAKmxB,GAAcxI,GAjCpC,QAiCPgM,EAjCO,OAmCb3zB,EAAOm1B,mBAAqB,iBAAyB,OAAnBxN,EAAUtoB,KAAgBsoB,EAAU2G,IAAIjrB,OAAS,GACnFrD,EAAOmwB,aAAe,kBAAMwD,GAE5B3zB,EAAOo1B,UAtCM,yCChMf,uBACGC,EAAYA,OAASC,GADxB,OAEGD,EAAYA,OAASE,IAFxB,OAGGF,EAAYA,OAASG,IAHxB,OAIGH,EAAYA,OAASI,IAJxB,I,gBCNyBC,IAAV,SAAUA,GAAgBC,EAAqBxL,EAAQzC,EAAYC,EAAWuG,GAA9E,qEACTyH,EAAoBC,WAAqD,IAAzCD,EAAoBC,SAASrT,QADpD,yCAEJ,CACLsT,OAAO,EACPC,aAAcH,EAAoBC,SAASl4B,SAAW,uCAJ7C,gCAQN,CACLm4B,OAAO,IATI,wC,gBCOUE,I,YASRC,IATF,SAAUD,GAAeJ,EAAqBxL,EAAQzC,EAAYC,EAAWuG,GAA7E,2EACTyH,EAAoBC,WAAYD,EAAoBC,SAASK,eADpD,gBAEa,OAFb,UAEmBj3B,QAAKg3B,GAAeL,EAAoBC,SAASK,gBAFpE,cAELC,EAFK,yBAGJ,CAACL,OAAQK,IAHL,gCAMN,CAACL,OAAO,IANF,wC,OAkBT,kBAAC,IAAD,CAAkB3xB,GAAG,sB,GACrB,kBAAC,IAAD,CAAkBA,GAAG,yBAVpB,SAAU8xB,GAAct4B,GAAxB,2EACiB,OADjB,UACuBsB,QAAKgc,MAD5B,OAKL,OAJMC,EADD,OAECkb,EAAQ,kBAAMlb,EAAc7b,KAAI,IAChCuwB,EAAW,kBAAM1U,EAAc7b,KAAI,IAHpC,UAKCA,QACJ8b,YACE,wCACAxd,EAFF,MAKEy4B,EACAxG,IAZC,OAeE,OAfF,UAeQxU,QAAKF,GAfb,iF,gBCTkBmb,I,YAgBRC,IAhBF,SAAUD,GAAmBT,EAAqBxL,EAAQzC,EAAYC,EAAWuG,GAAjF,2EACTyH,EAAoBW,kBADX,gBAEQ,OAFR,UAEct3B,QAAKq3B,GAAmBV,EAAoBW,kBAAmBpI,GAF7E,cAELO,EAFK,yBAIJ,CACLoH,MAAsB,OAAfpH,EACPtE,OAAQ,CAAC4E,SAAUN,KANV,gCASN,CACLoH,OAAO,IAVI,wCAcR,IAAMpH,GAAa,SAAAA,GAAU,MAAK,CAACA,eAEnC,SAAU4H,GAAV,EAAqFnI,GAArF,yFACiB,OADYwF,EAA7B,EAA6BA,eAAgB6C,EAA7C,EAA6CA,cAAeC,EAA5D,EAA4DA,UAAWC,EAAvE,EAAuEA,YAAvE,UACuBz3B,QAAKgc,MAD5B,OAOL,OANMC,EADD,OAGC/W,GAAK,IAAIwyB,MAAOC,UAChBC,EAAS,SAAC,GAAD,IAAE9N,EAAF,EAAEA,OAAF,OAAc7N,EAAc7b,IAAIqvB,GAAW3F,KACpD6G,EAAW,kBAAM1U,EAAc7b,IAAIqvB,GAAW,QAC9ClB,EAAsBC,GAAoBU,EAAOpB,SANlD,WAOC1tB,QAAI8b,UAAmBhX,EAAIsyB,EAAWC,GAAa,kBACvD,kBAAClJ,EAAD,CACEd,KAAMiH,EAAejH,KACrBO,QAASkB,EAAOlB,QAChBD,SAAU6J,EACVjH,SAAUA,EACV4G,cAAeA,EACfrN,KAAK,eAdJ,QAkBY,OAlBZ,WAkBkB/N,QAAKF,GAlBvB,QAmBL,OADMrd,EAlBD,kBAmBCwB,QAAI8b,gBAAyBhX,IAnB9B,iCAoBEtG,EAAS6wB,WAAa,CAACJ,MAAOqF,EAAerF,MAAOpwB,MAAOL,EAAS6wB,YAAc,MApBpF,yC,gBCdkBoI,I,YAaRb,IAbF,SAAUa,GAAsBlB,EAAqBxL,EAAQzC,EAAYC,EAAWuG,GAApF,+EAKM,KAJb4I,EAAiD,OAArCpP,EAAWqP,4BAAuErrB,IAArCgc,EAAWqP,sBAHxC,IAK9BrP,EAAWqP,wBAESpP,GAAaA,EAAUqP,MAAQF,GAL1C,gBAMa,OANb,UAMmB93B,QAAKg3B,GAAerO,EAAUqP,OANjD,cAMLd,EANK,yBAOJ,CAACL,OAAQK,IAPL,gCAUN,CAACL,OAAO,IAVF,wC,OAoBT,kBAAC,IAAD,CAAkB3xB,GAAG,0C,GAErB,kBAAC,IAAD,CAAkBA,GAAG,sB,GACrB,kBAAC,IAAD,CAAkBA,GAAG,yBAVpB,SAAU8xB,GAAcgB,GAAxB,2EACiB,OADjB,UACuBh4B,QAAKgc,MAD5B,OAKL,OAJMC,EADD,OAECkb,EAAQ,kBAAMlb,EAAc7b,KAAI,IAChCuwB,EAAW,kBAAM1U,EAAc7b,KAAI,IAHpC,UAKCA,QACJ8b,YAAA,GAEE,kBAAC,IAAD,CAAkBhX,GAAG,iDAAiD4kB,OAAQ,CAACkO,WAFjF,MAKEb,EACAxG,IAZC,OAeE,OAfF,UAeQxU,QAAKF,GAfb,iF,qlBCdUgc,I,YAaQC,IAblB,SAAUD,GAAUvP,EAAYC,EAAW8B,GAA3C,uEACY,OADZ,UACkBzqB,QAAKC,gBAAkByoB,EAAW6C,SAAW,SAAU,CAC5ErrB,OAAQ,OACR4b,KAAM,CACJ6M,YACA8B,YALC,cACC7rB,EADD,yBAQEA,EAASkd,MARX,wCAWA,IAAMqc,GAAc,iBAAM,CAACN,GAAuBnB,GAAiBK,GAAgBK,KAE3E,SAAUc,GAAIxP,EAAYC,EAAW8B,EAAQyE,GAA7C,wFACT2H,GAAQ,EACRC,EAAe,KACf3L,EAAS,IAEezC,EAAW6C,SAL1B,gBAMT,OANS,UAMHvrB,QAAKi4B,GAAWvP,EAAYC,EAAW8B,GANpC,+CAOT,GAPS,QAQI,OAHXkM,EALO,gBAQU32B,QAAKm4B,IARf,QAQPC,EARO,OAUThP,EAAI,EAVK,WAYLyN,IAASuB,EAAShP,GAZb,iBAca,OADlBnoB,EAAUm3B,EAAShP,GAbd,WAcmBppB,QAAKiB,EAAS01B,EAAqBxL,EAAQzC,EAAYC,EAAWuG,GAdrF,QAcLmJ,EAdK,OAgBXxB,EAAQwB,EAAgBxB,MACxB1L,EAAS,SAAIA,GAAWkN,EAAgBlN,QACpCkN,EAAgBvB,eAClBA,EAAeuB,EAAgBvB,cAGjC1N,IAtBW,iDAyBN,CAACyN,QAAOC,eAAc3L,WAzBhB,yCCnBf,Y,gBCMyBjqB,I,YAMRo3B,IANF,SAAUp3B,GAAMguB,GAAhB,iEACb,OADa,UACPxuB,QAAI,EACRkb,QAAUnW,EAAuB6yB,GAAcpJ,KAFpC,wCAMR,SAAUoJ,GAAapJ,EAAvB,4FAGiC,OAHD5uB,EAAhC,EAAgCA,QAC9BooB,EAAiCpoB,EAAjCooB,WAAYC,EAAqBroB,EAArBqoB,UAAW8B,EAAUnqB,EAAVmqB,OADzB,UAGuCzqB,QAAKu4B,GAAS7P,EAAYC,EAAW8B,EAAQyE,GAHpF,mBAGE2H,EAHF,EAGEA,MAAOC,EAHT,EAGSA,aAAc3L,EAHvB,EAGuBA,OAEvB0L,EALA,iBAOc,OADX2B,EAAgBC,GAAe/P,EAAWgQ,YAN7C,WAOoB14B,QAAKw4B,EAAe9P,EAAYC,EAAW8B,EAAQU,EAAQ+D,GAP/E,aAOGtwB,EAPH,UASaA,EAASktB,aATtB,iBAUD,OAVC,WAUKprB,QAAI9B,EAASktB,aAAahtB,KAAI,SAAA65B,GAAW,OAAIv4B,QAAI0rB,iBAAyB6M,QAV/E,YAaC/5B,IAAYA,EAAS2kB,QAbtB,iBAcD,OAdC,WAcKnjB,QAAIqF,EAAsBijB,EAAYC,EAAW/pB,IAdtD,oCAgBMk4B,EAhBN,iBAiBH,OAjBG,WAiBG12B,QAAI8b,YAAqB,CAAC7b,KAAM,OAAQ5B,MAAOq4B,KAjBlD,yC,sFCdM8B,GAAmB,SAACC,EAAD,OAAiBC,EAAjB,EAAiBA,aAAcC,EAA/B,EAA+BA,aAA/B,QAC5BC,GAAUH,EAAeC,IAAiBG,GAAQJ,EAAeE,KAExDG,GAAgB,SAACL,EAAD,EAA8Cn5B,GAAS,IAAtCo5B,EAAsC,EAAtCA,aAAcC,EAAwB,EAAxBA,aAC1D,OAAIC,GAAUH,EAAeC,GACpBp5B,EAAK+J,cAAc,CAACvE,GAAI,8CAA+C,CAAC4zB,iBAG7EG,GAAQJ,EAAeE,GAClBr5B,EAAK+J,cAAc,CAACvE,GAAI,4CAA6C,CAAC6zB,iBAGxE,MAGHC,GAAY,SAACH,EAAeC,GAAhB,OAAiCA,GAAgBD,EAAgBC,GAC7EG,GAAU,SAACJ,EAAeE,GAAhB,OAAiCA,GAAgBF,EAAgBE,G,qkBC0CjF,UAAe5wB,SA/BK,SAAApF,GAAS,IACpB2lB,EAAuB3lB,EAAvB2lB,WAAYhlB,EAAWX,EAAXW,QACby1B,EAAoBzQ,EAAW0Q,eAAiBxe,OAAOzC,KAAKuQ,EAAW0Q,eAAe/0B,OAAS,EAE/FrC,EAAQm3B,EAAmBzQ,EAAW0Q,cAAcp3B,MAAQ0mB,EAAW1mB,MACvEq3B,EAAiBF,EACnB,WACEz1B,EAAQglB,EAAW0Q,gBAErB,KACEE,EAAWH,EAAmBzQ,EAAW0Q,cAAcl0B,GAAKwjB,EAAWxjB,GAC7E,OAAO,kBAACie,GAAA,EAAD,CACL5O,YAAa,CAAC8F,KAAM,UACpBrY,MAAOA,EACPsJ,UAAA,iBAAmBguB,GACnB51B,QAAS21B,EACT76B,KAAMkqB,EAAWlqB,MAEfkqB,EAAWvd,SAASrM,KAAI,SAACy6B,EAAiB90B,GAAlB,OAtCJ,SAApB+0B,EAAoB30B,GAAS,IAC1BnB,EAA4CmB,EAA5CnB,QAASglB,EAAmC7jB,EAAnC6jB,WAAYmQ,EAAuBh0B,EAAvBg0B,cAAen5B,EAAQmF,EAARnF,KACrC+5B,EAAiBb,GAAiBC,EAAenQ,GACjDpF,GAAmC,IAAxBoF,EAAW2E,WAAsBoM,EAC5Ch7B,EAAQy6B,GAAcL,EAAenQ,EAAYhpB,GACjDg6B,EAA6C,iBAA7BhR,EAAWmB,cACjC,OAAO,kBAACpf,GAAA,EAAD,SACCivB,IAAkBpW,GAAY,CAAC5f,QAAS,kBAAMA,EAAQglB,KADvD,CAELpF,SAAUA,EACV7kB,MAAOA,EACPW,IAAG,mBAAcspB,EAAWxjB,MAE5B,8BAAOwjB,EAAW1mB,OAEa,iBAA7B0mB,EAAWmB,eACRnB,EAAWvd,SAASrM,KAAI,SAAAsM,GAAK,OAAIouB,EAAkB,SAAI30B,GAAL,IAAY6jB,WAAYtd,SAuB3BouB,CAAkB,SAAIz2B,GAAL,IAAY2lB,WAAY6Q,YCtC1F,IAqBDI,GAAW,SAAAjR,GAAU,OAAIA,EAAW1mB,OAAS43B,GAAelR,GAAcA,EAAW1mB,MAAQ,IAE7F63B,GAAW,SAAChB,EAAenQ,EAAYhpB,GAA5B,OAAqCw5B,GAAcL,EAAenQ,EAAYhpB,KACxFk6B,GAAelR,GAAiC,GAAnBA,EAAW1mB,QAEzC43B,GAAiB,SAAAlR,GAAU,QAA8B,OAAxBA,EAAWoR,UAA6C,SAAxBpR,EAAWoR,WAUlF,UAAe3xB,SApCa,SAAC,GAAD,IAC1BugB,EAD0B,EAC1BA,WACAhlB,EAF0B,EAE1BA,QACAm1B,EAH0B,EAG1BA,cACAvV,EAJ0B,EAI1BA,SACA5jB,EAL0B,EAK1BA,KAL0B,OAMtB,kBAAC0N,EAAA,EAAD,CACFqS,SAAoC,SAA1BiJ,EAAWqR,WACrBzuB,UAAA,iBAAmBod,EAAWxjB,IAC9BmV,KAAgC,SAA1BqO,EAAWqR,WAAwB,OAAS,SAClDC,kBAA6C,SAA1BtR,EAAWqR,WAC9Br2B,QAAS,SAAA2N,GACP3N,EAAQglB,GACRrX,EAAE4oB,mBAEJz7B,KAAMkqB,EAAWlqB,KACjBwD,MAAO23B,GAASjR,GAChBjqB,MAAOo7B,GAAShB,EAAenQ,EAAYhpB,GAC3C4jB,UAAkC,IAAxBoF,EAAW2E,WAAsBuL,GAAiBC,EAAenQ,IAAepF,OChB9F,IAAM4W,GAAe,SAAC,GAA8F,IAA7FxR,EAA6F,EAA7FA,WAAYhlB,EAAiF,EAAjFA,QAASilB,EAAwE,EAAxEA,UAAW8B,EAA6D,EAA7DA,OAAQP,EAAqD,EAArDA,KAAM2I,EAA+C,EAA/CA,SAAUvP,EAAqC,EAArCA,SAAU6W,EAA2B,EAA3BA,sBACvF,GAAIA,GAAyBA,EAAsBzR,EAAWxjB,IAC5D,OAAOi1B,EAAsBzR,EAAWxjB,IAAIwjB,GAG9C,KAAKuB,OAAeC,EAAMxB,EAAWyB,QACnC,OAAO,KAGT,IAAMiQ,EAAa1R,EAAWmB,gBAAkBE,kBAA8BsQ,GAAcC,GAE5F,OACE,kBAACF,EAAD,CACE1R,WAAYA,EACZhlB,QAAS,SAAAglB,GACPhlB,EAAQsb,KAAM0J,EAAY,CAAC,UAAWC,EAAW8B,EAAQoI,IAE3DgG,cAAelQ,EAAUqP,MACzB1U,SAAUA,KA6EhB,SAnBe,SAAAvgB,GACb,OAAIA,EAAM2lB,WAAWmB,gBAAkBE,gBAC9BhnB,EAAM2lB,WAAWvd,SAASrM,KAAI,SAAAsM,GAAK,OACxC,kBAAC8uB,GAAD,MAAc96B,IAAG,iBAAY2D,EAAM2lB,WAAWxjB,GAA7B,YAAmCkG,EAAMlG,KAAUnC,EAApE,CAA2E2lB,WAAYtd,QAKpF,kBAAC8uB,GAAiBn3B,ICxF3B,IAAM4B,GAAoB,CACxBjB,QAAS8mB,GAGX,UAAe5lB,cAAQ,KAAMD,GAA7B,CAAgD41B,ICHhD,UACE3Q,aACA2Q,UACAC,WCHF,SAAgBl1B,EAAO4pB,GACrBruB,mBAA2ByE,EAAO,CAACG,QAAS2kB,IAC5C9kB,EAAMm1B,eAAevC,IAAIwC,oBAA0Bx5B,GAAOguB,EAAQyL,gBDElEl1B,UACAm1B,yBEXsC,SAACtlB,EAAYlW,GAAb,MAAsB,CAC5DkW,aACAjV,KAAM,KACNivB,IAAK,CAAClwB,GACN44B,MAAO,M,0kCCAF,IAAM6C,EAAqBz8B,SAAH,KAGlB08B,EAAyB18B,SAAH,KAUtBE,EAAoBF,SAAH,IACfC,UAAY,MAKd08B,EAAc38B,SAAH,KAIX48B,EAAc58B,SAAH,KAQX68B,EAAiB78B,SAAH,K,snBCjC3B,IAAM88B,EAAiB,+BA6BvB,QA1B0B,CACxBC,SAAU,CACR96B,KAAM,OACN+6B,QAAS,SAAAj8B,GAGP,MAAO,CAACimB,KAFUjmB,EAAQk8B,IAAOl8B,GAAOm8B,MAAMC,OAAOL,GAAkB,KAE9CpsB,GADT3P,EAAQk8B,IAAOl8B,GAAOm8B,MAAME,IAAI,EAAG,KAAKD,OAAOL,GAAkB,KAC3CO,cAAc,IAEtDC,UAAW,SAAAv8B,GACT,OAAIA,GAASA,EAAMimB,KACViW,QAAWl8B,EAAMimB,KAAM8V,GAAgBS,QAAQJ,OAZ3C,cAcTp8B,GAASA,EAAM2P,GACVusB,QAAWl8B,EAAM2P,GAAIosB,GAAgBS,QAAQJ,OAfzC,cAiBN,MAETK,aAAc,SAAC/f,EAASggB,GAAV,cAA6BhgB,GAA7B,IAAsCigB,iBAAkB,CAACC,QAASF,MAChFG,eAAgB,SAACngB,EAASogB,GAAV,cAA2BpgB,GAA3B,IAAoCigB,iBAAkB,CAACI,QAASD,OAElFE,KAAM,CACJP,aAAc,SAAC/f,EAASggB,GAAV,cAA6BhgB,GAA7B,IAAsCigB,iBAAkB,CAACC,QAASF,MAChFG,eAAgB,SAACngB,EAASogB,GAAV,cAA2BpgB,GAA3B,IAAoCigB,iBAAkB,CAACI,QAASD,Q,ukBC+D1E,kBAAC39B,EAAD,KACE,kBAAC,IAAD,CAAME,KAAK,qBAiEvB,QAxIc,SAAAuE,GAAS,IACd5D,EAA0C4D,EAA1C5D,MAAOgG,EAAmCpC,EAAnCoC,OAAQgwB,EAA2BpyB,EAA3BoyB,SAAU90B,EAAiB0C,EAAjB1C,KAAMwb,EAAW9Y,EAAX8Y,QAChCugB,EAAiC,WAAjB,IAAOj9B,IAAsBA,GAASA,EAAMs8B,aAE5DY,GAAc3rB,cAAQ,oBAAC,KACxBvL,GADuB,IAE1BgV,SAAU,SAAAhb,GACRgG,EAAOgV,SAAShb,SAIdm9B,GAAW5rB,cAAQ,iBAAO,CAC9ByJ,SAAU,SAAA8hB,GACR92B,EAAOgV,SAAP,OACKhb,GADL,IAEE2P,GAAImtB,UAKJM,GAAa7rB,cAAQ,iBAAO,CAChCyJ,SAAU,SAAA0hB,GACR12B,EAAOgV,SAAP,OACKhb,GADL,IAEEimB,KAAMyW,UAKNjxB,EAAc4xB,EAAkBn8B,GAsBhCo8B,EAAW7xB,GAAeA,EAAYvK,KAAOuK,EAAYvK,KAAOA,EAEtE,OAAO,kBAAC06B,EAAD,KACL,kBAACF,EAAD,KACIuB,EAME,kBAACpB,EAAD,KACA,kBAACF,EAAD,KACE,kBAAC4B,EAAA,EAAD,OACM35B,EADN,CAEE8Y,QA7BW,SAACA,EAASogB,GAAV,OACrBrxB,GAAeA,EAAYoxB,eACvBpxB,EAAYoxB,eAAengB,EAASogB,GACpCpgB,EA0BemgB,CAAengB,EAAS1c,EAAM2P,IACvC3P,MAAOA,GAASA,EAAMimB,KAAOjmB,EAAMimB,KAAO,KAC1CjgB,OAAQo3B,MANZ,EAYA,kBAACzB,EAAD,KACE,kBAAC4B,EAAA,EAAD,OACM35B,EADN,CAEE8Y,QA7CS,SAACA,EAASggB,GAAV,OACnBjxB,GAAeA,EAAYgxB,aACvBhxB,EAAYgxB,aAAa/f,EAASggB,GAClChgB,EA0Ce+f,CAAa/f,EAAS1c,EAAMimB,MACrCjmB,MAAOA,GAASA,EAAM2P,GAAK3P,EAAM2P,GAAK,KACtC3J,OAAQm3B,OAtBZ,kBAACI,EAAA,EAAD,KACAr8B,KAAMo8B,GACFzd,IAAMjc,EAAO,CAAC,SAFlB,CAGAoC,OAAQk3B,MAwBd,kBAACpB,EAAD,KACE,kBAACrtB,EAAA,EAAD,CAAM0V,SAAU6R,EAAU32B,KAAM49B,EAAgB,eAAiB,eAAgB14B,QAAS,WACpF04B,EACFj3B,EAAOgV,SA7CK,SAAAhb,GAAK,OACvByL,GAAeA,EAAY8wB,UACvB9wB,EAAY8wB,UAAUv8B,GACtBA,GAASA,EAAMimB,KAAOjmB,EAAMimB,KAAOjmB,GAASA,EAAM2P,GAAK3P,EAAM2P,GAAK,KA0ChD6tB,CAAYx9B,IAE5BgG,EAAOgV,SA1CO,SAAAhb,GAAK,OACzByL,GAAeA,EAAYwwB,QACvBxwB,EAAYwwB,QAAQj8B,GACpB,CAACimB,KAAMjmB,EAAO2P,GAAI3P,EAAOs8B,cAAc,GAuCrBmB,CAAcz9B,U,wBC1GxC,SACE09B,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,MAC7EE,eAAgB15B,IAAKw5B,EAAW,0CAA2C,MAC3EG,SAAU35B,IAAKw5B,EAAW,uCAAwC,MAClEI,SAAU55B,IAAKw5B,EAAW,qCAAsC,MAChEK,eAAe,KCRnB,GACEN,WAAY,gBAAEC,EAAF,EAAEA,UAAWrnB,EAAb,EAAaA,SAAUsa,EAAvB,EAAuBA,SAAvB,MAAsC,CAChDqN,OAAQ,SAAAxrB,GACNme,EAASsN,eAAe5nB,EAAUqnB,EAAU53B,GAAI0M,IAElD0rB,WAAYvN,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,mCAC7Cq4B,cAAexN,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,sCAChDs4B,aAAczN,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,0CAC/Cu4B,WAAY1N,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,0CAE/Cw4B,SAAU,kBAAM,ICRlB,GACEb,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BG,SAAU35B,IAAKw5B,EAAW,uCAAwC,MAClEI,SAAU55B,IAAKw5B,EAAW,qCAAsC,S,ikBCHpE,MCAA,IACED,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BE,eAAgB15B,IAAKw5B,EAAW,0CAA2C,MAC3EC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,MAC7EG,SAAU35B,IAAKw5B,EAAW,uCAAwC,MAClEI,SAAU55B,IAAKw5B,EAAW,qCAAsC,MAChEK,eAAe,KCLnB,IAAM/O,GACiB,GADjBA,GAEc,GAFdA,GAGoB,mBAG1B,UACEuP,mBAAoB,gBAAEb,EAAF,EAAEA,UAAF,MAAkB,CACpCc,iBAAkB,CAACd,EAAU53B,IAC7B24B,SAAU,CAACf,EAAU3P,cACrBhY,oBAAoB,IAEtB0nB,WAAY,gBAAEC,EAAF,EAAEA,UAAWrnB,EAAb,EAAaA,SAAUsa,EAAvB,EAAuBA,SAAvB,MAAsC,CAChDlU,QAASvY,IAAKysB,EAAU,CAAC,mBAAoB+M,EAAU53B,GAAI,QAAS,IACpE44B,qBAAsBx6B,IAAKysB,EAAU,CAAC,mBAAoB+M,EAAU53B,GAAI,0BAA0B,GAClG64B,UAAWz6B,IAAKysB,EAAU,CAAC,mBAAoB+M,EAAU53B,GAAI,cAAc,GAC3E84B,aAAc,kBAAMjO,EAASkO,qBAAqBnB,EAAU53B,GAAI43B,EAAU3P,aAAc,CACtF+Q,aAAa,EACb1oB,MAAO4Y,GACPmG,QAAS,CAAC,CAACvH,MAAOoB,GAAiC+P,MAAO,SAC1DC,SAAUtB,EAAUsB,SACpB3oB,SAAUqnB,EAAUrnB,YAEtB4oB,cAAe,SAAAC,GAAU,OAAIvO,EAASkO,qBAAqBnB,EAAU53B,GAAI43B,EAAU3P,aAAc,CAC/FmR,aACA9oB,MAAO4Y,GACP8P,aAAa,EACbE,SAAUtB,EAAUsB,SACpB3oB,SAAUqnB,EAAUrnB,YAEtB8oB,mBAAoB,SAAAp/B,GAAK,OAAI4wB,EAASwO,mBAAmB9oB,EAAUqnB,EAAW39B,IAC9E0+B,SAAUv6B,IAAKysB,EAAS8N,SAAUf,EAAU3P,aAAc,MAC1DqR,YAAa,SAAAt5B,GAAE,OAAI6qB,EAASyO,YAAY1B,EAAU3P,aAAcjoB,IAChEu5B,cAAe1O,EAASrwB,KAAK+J,cAC3B,CAACvE,GAAI,gDAEPw5B,yBAA0B3O,EAASrwB,KAAK+J,cACtC,CAACvE,GAAI,2DAEP2iB,WAAYkI,EAAS5a,oBAAsB4a,EAAS5a,mBAAmB0S,WACnE,gBAAE7S,EAAF,EAAEA,UAAW7J,EAAb,EAAaA,SAAb,OACA,kBAAC4kB,EAAS5a,mBAAmB0S,WAA7B,CACEvS,WAAYwnB,EAAU3P,aACtBnY,UAAWA,GAEV7J,IAEH,KACJwzB,iBAAkB7B,EAAUzU,cACvB/kB,IAAKysB,EAAU,CAAC,cAAe,QAAS+M,EAAUzU,aAAc,qBAAqB,GAC1FuW,iBAAkB,kBAAM7O,EAAS6O,iBAAiB9B,EAAWrnB,EAAUsa,OCnD3E,IAAM3B,GACG,IAGT,UACEuP,mBAAoB,gBAAEb,EAAF,EAAEA,UAAF,MAAkB,CACpCc,iBAAkB,CAACd,EAAU53B,IAC7B24B,SAAU,CAACf,EAAU3P,gBAEvB0P,WAAY,gBAAEC,EAAF,EAAEA,UAAW/M,EAAb,EAAaA,SAAb,MAA4B,CACtClU,QAASvY,IAAKysB,EAAU,CAAC,mBAAoB+M,EAAU53B,GAAI,QAAS,IACpE64B,UAAWz6B,IAAKysB,EAAU,CAAC,mBAAoB+M,EAAU53B,GAAI,cAAc,GAC3E24B,SAAUv6B,IAAKysB,EAAS8N,SAAUf,EAAU3P,aAAc,MAC1DqR,YAAa,SAAAt5B,GAAE,OAAI6qB,EAASyO,YAAY1B,EAAU3P,aAAcjoB,IAChEu5B,cAAe1O,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,gDAChD84B,aAAc,kBAAMjO,EAASkO,qBAAqBnB,EAAU53B,GAAI43B,EAAU3P,aAAc,CACtF+Q,aAAa,EACb1oB,MAAO4Y,GACPyQ,aAAc/B,EAAU+B,mBCpB9B,IACEnB,SAAU,kBAAM,ICclB,IACE,OAAU9rB,EACV,QAAWktB,GACX,QAAWC,GACX,cAAeA,GACf,QAAWC,EACX,SAAYptB,EACZ,OAAUotB,EACV,SCvBF,CACEnC,WAAY,gBAAE9M,EAAF,EAAEA,SAAF,MAAiB,CAC3BkP,WAAYlP,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,yCAC7Cg6B,aAAcnP,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,8CDqBjD,KExBF,CACEw4B,SAAU,kBAAM,IFwBhB,MAAS9rB,EACT,QAAWutB,EACX,SLzBF,CACEC,SAAU,SAACjgC,EAAO29B,GAChB,IAAMuC,EAAkBvC,EAAUuC,gBAClC,SAAUlgC,EAAMkgC,EAAgBC,QAASngC,EAAMkgC,EAAgBE,YAEjEC,SAAU,YAA2B,IAAzB1C,EAAyB,EAAzBA,UAAW/M,EAAc,EAAdA,SACfsP,EAAkBvC,EAAUuC,gBAC5BI,EAAuB1P,EAASN,WAElCiQ,EAAsB,GAC1B,IAAK,IAAMC,KAAUN,EACnB,IAAK,IAAMO,KAAsBH,EAC3BJ,EAAgBM,KAAYC,IAC9BF,EAAsB,OAAIA,GAAP,UAA6BC,EAASF,EAAqBG,MAIpF,OAAOF,GAETG,UAAW,YAA6C,IAA3C/C,EAA2C,EAA3CA,UAAWrnB,EAAgC,EAAhCA,SAAUsa,EAAsB,EAAtBA,SAAU5qB,EAAY,EAAZA,OACpCk6B,EAAkBvC,EAAUuC,iBAAmB,GAQrD,cACKl6B,GADL,IAEEgV,SATe,SAAA2lB,GACf,IAAK,IAAM1gC,KAAOigC,EACZA,EAAgBjgC,SAAgCsN,IAAxBozB,EAAe1gC,IACzC2wB,EAASgQ,iBAAiBtqB,EAAU4pB,EAAgBjgC,GAAM0gC,EAAe1gC,KAO7E4gC,OAAQ,WACNjQ,EAASkQ,WAAWxqB,EAAUqnB,EAAU53B,QAI9Cy4B,mBAAoB,gBAAEb,EAAF,EAAEA,UAAWrnB,EAAb,EAAaA,SAAb,MAA4B,CAC9CyqB,UAAW,CAACpD,EAAU53B,IACtBuqB,WAAY,CACVha,SAAUA,EACV0qB,OAAQrD,EAAUuC,gBAAkBzkB,OAAOkP,OAAOgT,EAAUuC,iBAAmB,IAEjFe,QAAS,CACP3qB,SAAUA,EACV0qB,OAAQrD,EAAUuC,gBACd,CAACvC,EAAUuC,gBAAgBC,KAAMxC,EAAUuC,gBAAgBE,UAC3D,IAENtT,OAAQ,CACNxW,SAAUA,EACV0qB,OAAQ,CAACrD,EAAUuC,gBAAgBC,KAAMxC,EAAUuC,gBAAgBE,aAGvE1C,WAAY,gBAAEC,EAAF,EAAEA,UAAW/M,EAAb,EAAaA,SAAb,MAA4B,CACtCsQ,iBAAkB,SAAC/B,EAAYgC,GAAb,OAChBvQ,EAASwQ,yBAAyBzD,EAAU53B,GAAIo5B,EAAYgC,EAASh9B,IAAKw5B,EAAW,eACvFiB,UAAWz6B,IAAKysB,EAAU,CAAC,YAAa+M,EAAU53B,GAAI,cAAc,GACpEs7B,YAAal9B,IAAKysB,EAAU,CAAC,YAAa+M,EAAU53B,GAAI,eAAgB,MACxEu7B,eAAgB1Q,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,gDKhCnD,KAAQi6B,EACR,YG3BF,CACEtC,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,GAC7EE,eAAgB15B,IAAKw5B,EAAW,0CAA2C,MAC3EG,SAAU35B,IAAKw5B,EAAW,uCAAwC,MAClEI,SAAU55B,IAAKw5B,EAAW,qCAAsC,MAChEK,eAAe,EACfuD,mBAAmB,KHqBrB,QAAW5B,GACX,qBAAsB6B,GACtB,mBAAoBhhC,GACpB,eAAgBiS,EAChB,OAAUmtB,GACV,MIjCF,CACElC,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5B8D,iBAAkBt9B,IAAKw5B,EAAW,+BAAgC,MAClE+D,eAAgBv9B,IAAKw5B,EAAW,iCAAkC,SJ+BpE,gBKlCF,CACEa,mBAAoB,kBAAkB,CACpCjoB,cAAe,CADG,EAAEonB,UACMzN,SAE5BwN,WAAY,gBAAEC,EAAF,EAAEA,UAAW/M,EAAb,EAAaA,SAAb,MAA4B,CACtC+Q,QAAShE,EAAUiE,SACnBllB,QAASvY,IAAKysB,EAASra,cAAeonB,EAAUzN,MAAO,MACvD2O,aAAc,kBAAMjO,EAASiR,kBAAkBlE,EAAUzN,MAAOyN,EAAUmE,QAC1ExC,cAAe1O,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,mDL2BlD,sBAAuBy7B,GACvB,oBAAqBhhC,GACrB,QAAWo/B,GACX,QMtCF,CACElC,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BE,eAAgB15B,IAAKw5B,EAAW,0CAA2C,MAC3EC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,MAC7EG,SAAU35B,IAAKw5B,EAAW,uCAAwC,MAClEI,SAAU55B,IAAKw5B,EAAW,qCAAsC,MAChEK,eAAe,MCFnB,IAeM+D,GAAuB,SAAC,GAAsE,IAArE7gC,EAAqE,EAArEA,KAAM8gC,EAA+D,EAA/DA,MAAOrE,EAAwD,EAAxDA,UAAWrnB,EAA6C,EAA7CA,SAAUtW,EAAmC,EAAnCA,MAAO+jB,EAA4B,EAA5BA,KAAM/d,EAAsB,EAAtBA,OAAQ4qB,EAAc,EAAdA,SAC9EqR,EAAWtE,EAAU7P,UAAY6P,EAAUjT,cAC3ChO,EAPW,SAACxb,EAAMy8B,EAAWrnB,EAAUsa,GAA5B,OACjBsR,GAAoBhhC,IAASghC,GAAoBhhC,GAAMw8B,WACnDwE,GAAoBhhC,GAAMw8B,WAAW,CAACC,YAAWrnB,WAAUsa,aAC3D,GAIY8M,CAAWuE,EAAUtE,EAAWrnB,EAAUsa,GAE1D5qB,EAnBgB,SAAC9E,EAAMy8B,EAAWrnB,EAAUsa,EAAU5qB,GAAtC,OAChBk8B,GAAoBhhC,IAASghC,GAAoBhhC,GAAMw/B,UACnDwB,GAAoBhhC,GAAMw/B,UAAU,CAAC/C,YAAWrnB,WAAUsa,WAAU5qB,WACpEA,EAgBK06B,CAAUuB,EAAUtE,EAAWrnB,EAAUsa,EAAU5qB,GAC5DhG,EAfe,SAACkB,EAAMy8B,EAAWrnB,EAAUsa,EAAUuR,GAAtC,OACfD,GAAoBhhC,IAASghC,GAAoBhhC,GAAMm/B,SACnD6B,GAAoBhhC,GAAMm/B,SAAS,CAAC1C,YAAWrnB,WAAUsa,WAAUuR,iBACnEA,EAYI9B,CAAS4B,EAAUtE,EAAWrnB,EAAUsa,EAAU5wB,GAE1D,IAAM4L,EAAYo2B,EAAQI,EAAQ7E,IAElC,OACE,kBAAC3xB,EAAD,KACE1K,KAAMA,EACN8E,OAAQA,EACRhG,MAAOA,GACH+jB,EAJN,CAKErH,QAASA,GACJslB,GAAS,CACZK,SAAUzR,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,gCAC3Cu8B,OAAQ1R,EAASrwB,KAAK+J,cAAc,CAACvE,GAAI,kCAoBjD,kBAAgB7E,EAAM8gC,GAAP,OAAiB,SAAAp+B,GAAK,OAAI,kBAACm+B,GAAD,KAAsB7gC,KAAMA,EAAM8gC,MAAOA,GAAWp+B,M,gBC3D7F,MCCA,IACE85B,WAAY,gBAAEC,EAAF,EAAEA,UAAW/M,EAAb,EAAaA,SAAb,MAA4B,CACtClI,WAAYkI,EAAS5a,oBAAsB4a,EAAS5a,mBAAmB0S,WACnE,gBAAE7S,EAAF,EAAEA,UAAW7J,EAAb,EAAaA,SAAb,OACA,kBAAC4kB,EAAS5a,mBAAmB0S,WAA7B,CACEvS,WAAYwnB,EAAU3P,aACtBnY,UAAWA,GAEV7J,IAEH,QCLR,IACE,mBFPF,CACE0xB,WAAY,kBAAiB,CAC3B6E,cADU,EAAE3R,SACYrwB,KAAK+J,cAAc,CAACvE,GAAI,6CEMlD,qBAAsBy7B,GACtB,sBAAuBA,GACvB,YCVF,CACE9D,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5B5S,KAAM4S,EAAU5S,KAChBzrB,MAAOq+B,EAAUr+B,QAEnB+gC,SAAU,qBAAE1C,UAAyBjoB,ODMrC,OETF,CACEgoB,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,SFQ/E,YGTF,CACED,WAAY,gBAAEC,EAAF,EAAEA,UAAF,MAAkB,CAC5BC,gBAAiBz5B,IAAKw5B,EAAW,2CAA4C,OCCjF,IAUM6E,GAAwB,SAAC,GAAwD,IAAvDthC,EAAuD,EAAvDA,KAAMy8B,EAAiD,EAAjDA,UAAW39B,EAAsC,EAAtCA,MAAO4wB,EAA+B,EAA/BA,SAAU3wB,EAAqB,EAArBA,IAAKyH,EAAgB,EAAhBA,WAC/D+6B,EAAY9E,EAAU7P,UAAY6P,EAAUjT,cAC5ChO,EAZW,SAAC+lB,EAAW9E,EAAW/M,GAAvB,OACjB8R,GAAqBD,IAAcC,GAAqBD,GAAW/E,WAC/DgF,GAAqBD,GAAW/E,WAAW,CAACC,YAAW/M,aACvD,GASY8M,CAAW+E,EAAW9E,EAAW/M,GAC3C+R,EARS,SAACF,EAAW9E,EAAW/M,EAAU5wB,GAAjC,OACf0iC,GAAqBD,IAAcC,GAAqBD,GAAWpC,SAC/DqC,GAAqBD,GAAWpC,SAAS,CAAC1C,YAAW/M,aACrD5wB,EAKqBqgC,CAASoC,EAAW9E,EAAW/M,EAAU5wB,GAElE,OAAO,kBAAC2V,GAAA,EAAD,CAAgB1V,IAAKA,EAAKiB,KAAMA,EAAMlB,MAAO2iC,EAAkBjmB,QAASA,EAAShV,WAAYA,KAetG,kBAAexG,GAAI,OAAI,SAAA0C,GAAK,OAAI,kBAAC4+B,GAAD,OAA2B5+B,EAA3B,CAAkC1C,KAAMA,O,qkBCjCxE,IAAM0hC,GAAkB,CACtB,OAAUC,GAAqB,YAC/B,UAAaA,GAAqB,QAClC,QAAWA,GAAqB,WAChC,KAAQA,GAAqB,UAC7B,KAAQA,GAAqB,QAC7B,MAASA,GAAqB,UAC9B,QAAWA,GAAqB,WAChC,SAAYA,GAAqB,YACjC,WAAcA,GAAqB,UACnC,kBAAmBA,GAAqB,QACxC,KAAQA,GAAqB,QAC7B,SAAYA,GAAqB,YACjC,QAAWA,GAAqB,UAChC,QAAWC,GAAsB,QACjC,YAAeA,GAAsB,eACrC,SAAYD,GAAqB,YACjC,OAAUA,GAAqB,UAC/B,SAAYA,GAAqB,YACjC,MAASA,GAAqB,UAC9B,kBAAmBA,GAAqB,UACxC,KAAQA,GAAqB,QAC7B,MAASA,GAAqB,YAC9B,WAAcA,GAAqB,UACnC,QAAWA,GAAqB,WAChC,UAAaA,GAAqB,UAClC,SAAYA,GAAqB,UACjC,SAAYA,GAAqB,YACjC,MAASA,GAAqB,UAC9B,KAAQA,GAAqB,WAC7B,UAAaA,GAAqB,UAClC,QAAWA,GAAqB,WAChC,YAAeA,GAAqB,UACpC,qBAAsBA,GAAqB,gBAC3C,mBAAoBA,GAAqB,gBACzC,eAAgBA,GAAqB,YACrC,QAAWA,GAAqB,UAChC,MAASA,GAAqB,SAC9B,SAAYA,GAAqB,UACjC,gBAAiBA,GAAqB,QACtC,gBAAiBA,GAAqB,iBACtC,OAAUA,GAAqB,UAC/B,sBAAuBA,GAAqB,UAC5C,oBAAqBA,GAAqB,iBAC1C,QAAWA,GAAqB,WAChC,OAAUA,GAAqB,UAC/B,KAAQA,GAAqB,QAC7B,YAAaA,GAAqB,QAClC,KAAQA,GAAqB,QAC7B,SAAYA,GAAqB,YACjC,WAAcA,GAAqB,UACnC,OAAUA,GAAqB,YAC/B,IAAOA,GAAqB,OAC5B,KAAQA,GAAqB,UAC7B,QAAWA,GAAqB,YAE5BE,GAAkB,CACtB,OAAUD,GAAsB,YAChC,UAAaA,GAAsB,QACnC,QAAWA,GAAsB,WACjC,KAAQA,GAAsB,QAC9B,KAAQA,GAAsB,UAC9B,QAAWA,GAAsB,WACjC,WAAcA,GAAsB,UACpC,SAAYA,GAAsB,YAClC,kBAAmBA,GAAsB,QACzC,cAAeA,GAAsB,UACrC,KAAQA,GAAsB,QAC9B,SAAYA,GAAsB,YAClC,QAAWA,GAAsB,UACjC,QAAWA,GAAsB,QACjC,YAAeA,GAAsB,eACrC,SAAYA,GAAsB,YAClC,SAAYA,GAAsB,YAClC,OAAUA,GAAsB,UAChC,MAASA,GAAsB,UAC/B,KAAQA,GAAsB,QAC9B,MAASA,GAAsB,YAC/B,UAAaA,GAAsB,UACnC,WAAcA,GAAsB,UACpC,SAAYA,GAAsB,UAClC,MAASA,GAAsB,UAC/B,KAAQA,GAAsB,WAC9B,UAAaA,GAAsB,UACnC,YAAeA,GAAsB,UACrC,qBAAsBA,GAAsB,gBAC5C,mBAAoBA,GAAsB,gBAC1C,eAAgBA,GAAsB,YACtC,QAAWA,GAAsB,WACjC,QAAWA,GAAsB,UACjC,MAASA,GAAsB,SAC/B,SAAYA,GAAsB,UAClC,gBAAiBA,GAAsB,QACvC,OAAUA,GAAsB,UAChC,gBAAiBA,GAAsB,iBACvC,OAAUA,GAAsB,UAChC,sBAAuBA,GAAsB,UAC7C,oBAAqBA,GAAsB,iBAC3C,QAAWA,GAAsB,WACjC,OAAUA,GAAsB,UAChC,KAAQA,GAAsB,QAC9B,YAAaA,GAAsB,QACnC,KAAQA,GAAsB,QAC9B,SAAYA,GAAsB,YAClC,WAAcA,GAAsB,UACpC,OAAUA,GAAsB,YAChC,IAAOA,GAAsB,OAC7B,KAAQA,GAAsB,UAC9B,QAAWA,GAAsB,YA2BnC,UACEE,SAAUJ,GACV5M,SAAU+M,GACVzO,KA3BkB,SACfyO,IADY,IAEfE,OAAQH,GAAsB,oBAC9BrwB,SAAUqwB,GAAsB,oBAChCI,MAAOJ,GAAsB,sBAwB7B/Z,OArBoB,SACjB6Z,IADc,IAEjBltB,KAAMmtB,GAAqB,UAC3BM,UAAWN,GAAqB,QAAQ,GACxC7F,KAAM6F,GAAqB,QAAQ,GACnCO,SAAUP,GAAqB,YAAY,GAC3CQ,SAAUR,GAAqB,YAAY,GAC3C7G,SAAU6G,GAAqB,YAAY,GAC3CS,YAAaT,GAAqB,UAAU,GAC5CU,QAASV,GAAqB,UAAU,GACxCW,KAAMX,GAAqB,WAAW,GACtC7C,QAAS6C,GAAqB,WAAW,GACzChD,QAASgD,GAAqB,UAAU,GACxCY,QAASZ,GAAqB,WAAW,GACzCa,KAAMb,GAAqB,QAAQ,M,OC/HpB,+BAHjB,MCFA,IAAgBc,QDEhB,SAAgBC,EAAa1iC,GAC3B,OAAK2iC,GAASD,IAAiBC,GAASD,GAAa1iC,GAK9C2iC,GAASD,GAAa1iC,IAJ3BqW,QAAA,qEAAgFqsB,EAAhF,cAAiG1iC,EAAjG,MACO,wBCLcghC,yB,qtBCClB,IAKD4B,EAAiB,SAAAC,GACrB,IAAMC,EAAc,EAAH,GAAOD,GAExB,cADOC,EAAW,OACXA,GAsBHC,EAAmB,SAAAF,GAAU,OACjCA,EAAU,QA+DZ,SACEG,eApFqB,SAAAH,GAAU,OAC/BtoB,OAAOzC,KAAK8qB,EAAeC,IAAa7+B,QAAU,GAoFlD4+B,iBACAK,mBA7EyB,SAAAJ,GACzB,IAAMjX,EAASmX,EAAiBF,GAChC,OAAOlkC,IAAQitB,EAAM,uBAA8B,SAAC/sB,EAAQC,GAAT,oBAAuBD,GAAvB,IAAkCC,MAAQ,KA4E7FokC,mBAnFyB,SAAAL,GACzB,IAAMjX,EAASmX,EAAiBF,GAChC,SAAUjX,GAAUA,EAAM,uBAAgCrR,OAAOzC,KAAK8T,EAAM,uBAA8B5nB,QAAU,IAkFpHm/B,uBA1E6B,SAAAN,GAC7B,IAAMjX,EAASmX,EAAiBF,GAChC,SAAUjX,GAAUA,EAAM,qBAA8BA,EAAM,oBAA2B5nB,QAAU,IAyEnGo/B,iBA9DuB,SAAAP,GACvB,IAAMjX,EAASmX,EAAiBF,GAChC,SAAUjX,GAAUA,EAAM,eAAwBrR,OAAOzC,KAAK8T,EAAM,eAAsB5nB,QAAU,IA6DpGq/B,mBAnEyB,SAAAR,GAAU,OACnCtoB,OAAOzC,KAAK8qB,EAAeC,IAAa,IAmExCS,8BA7CoC,SAAAT,GACpC,IAAMU,EAAsBR,EAAiBF,GAAYU,oBAEzD,OAAO5kC,IAAQ4kC,GAAqB,SAAC1kC,EAAQ2kC,GAAuB,IAC3DzkC,EAA4CykC,EAA5CzkC,IAAKiwB,EAAuCwU,EAAvCxU,MAAOpwB,EAAgC4kC,EAAhC5kC,MAAO6kC,EAAyBD,EAAzBC,sBAEpBC,EAAI,IAAI7kC,GAgBd,OAfA8kC,IAAQ/kC,GAAO,SAAC6qB,EAAQma,GACtBD,IAAQla,GAAQ,SAACmC,EAAQiY,GACvBH,EAAEzb,KAAF,MAAAyb,EAAC,IAAU9X,EAAOntB,KAAI,SAAAuS,GAAC,gBAAOA,EAAP,aAAa4yB,EAAb,aAA2B5U,EAA3B,aAAqCjwB,EAArC,gBAIvB0kC,GAAyBlpB,OAAOzC,KAAK2rB,GAAuBz/B,QAAU,GACxE0/B,EAAEzb,KAAF,MAAAyb,EAAC,IACC/kC,IACE8kC,GACA,SAAC5kC,EAAQC,GAAT,oBAAuBD,GAAvB,IAAmCC,EAAML,KAAI,SAAAuS,GAAC,gBAAOA,EAAP,aAAage,EAAb,aAAuBjwB,EAAvB,YAC9C,MAIC2kC,IACN,KAuBHI,UApBgB,SAAClY,EAAQe,EAAOmW,GAAhB,cAEXlX,GAFW,UAGbe,EAHa,OAKRf,EAAOe,IAAU,IACjBmW,GAAe,OAevBiB,4BA7DkC,SAACxlC,EAAU4F,GAAX,cA3CH,SA2CG,OAxCF,gBAwCE,OAG3B6/B,IAAMzlC,EAAU,CAAC,kBAAmB,aAAc,MAAO,WAH9B,IAI9B0lC,WAAY9/B,EAAO6qB,QAAUzwB,EAASywB,OAAS7qB,EAAOpF,MAAQR,EAASQ,SA0D3EmlC,iBArDuB,SAAArB,GAEvB,OADeE,EAAiBF,GACnB,gB,qHClDTsB,EAAY,SAAC,GAAD,IAAEr5B,EAAF,EAAEA,SAAF,OAChB,kBAACs5B,EAAA,EAAD,KACGt5B,IAQL,SAAegU,UAAKqlB,G,0LCGpB,QAjB8BpmC,SAAH,IAERC,UAAY,IAC3B,gBACAqmC,EADA,EACAA,eACAnmC,EAFA,EAEAA,MACAomC,EAHA,EAGAA,YAHA,OAIID,EAAiB,IACnB,+BADE,yDAEgDC,EAFhD,uCAGUtmC,UAAY,IAAZA,CAAkB,CAACE,cAEjC,qBAAEqmC,yBAAwD,wBCX9D,IAAMC,EAAkB,SAAC,GAInB,IAHJ15B,EAGI,EAHJA,SACAy5B,EAEI,EAFJA,wBACAD,EACI,EADJA,YAEMxzB,GAAMf,YAAO,MADf,GAEwChJ,cAAS,GAFjD,WAEGs9B,EAFH,KAEmBI,EAFnB,KAIEC,EAAgB,WACpBD,EAAkB3zB,EAAIL,QAAQk0B,cAShC,OANAt9B,gBAAU,WAGR,OAFAq9B,IACAvjC,OAAO6f,iBAAiB,SAAU0jB,GAC3B,kBAAMvjC,OAAO8f,oBAAoB,SAAUyjB,MACjD,IAGD,kBAAC,EAAD,CACE5zB,IAAKA,EACLuzB,eAAgBA,EAChBE,wBAAyBA,EACzBD,YAAaA,GACZx5B,IAWP05B,EAAgBI,aAAe,CAC7BN,YAAa,KAGf,MChCA,GACEO,MACAC,UD8BF,G,8GEnCMC,EAAmB,SAAAriC,GACvB,IAAMsiC,EAAoBtiC,EAAMuiC,cAAgBviC,EAAMuiC,aAAalG,UAC9Dr8B,EAAMuiC,aAAalG,SAASr8B,EAAMgtB,SAASN,WAAY1sB,EAAM+5B,WAElE,OAAO,kBAACyI,EAAA,EAAD,OACDxiC,EADC,CAELyiC,MAAOziC,EAAMgtB,SAASqQ,SAAWr9B,EAAMyiC,MACvCC,MAAO1iC,EAAMgtB,SAAS9D,QAAUlpB,EAAM0iC,MACtCrG,SAAUiG,GAAqBtiC,EAAMq8B,WAEpC16B,iBAAmB3B,EAAMoI,SAAU,CAAC4kB,SAAUhtB,EAAMgtB,aAcnD2V,EAAoB,CAAC,UAAW,eAChCC,EAAa,CAAC,mBAAoB,qBAAsB,iBAExDC,EAAmB,SAACzmC,EAAO8tB,GAAR,OACvB/U,MAAM4W,QAAQ3vB,KAAWwmC,EAAWl5B,SAASwgB,IAEzC4Y,GAA4B,SAAC1mC,EAAO0qB,EAAeoD,EAAU6Y,GACjE,QAAIA,MAIAJ,EAAkBj5B,SAASod,MAI3B+b,EAAiBzmC,EAAO8tB,K,GAsFnB,+B,GAI0B,kBAACpW,EAAA,QAAD,WAAxBkvB,GAAiB,sBAExBC,GAAa,SAAC,GAQd,IAPJC,EAOI,EAPJA,iBACAxwB,EAMI,EANJA,SACAqnB,EAKI,EALJA,UACA39B,EAII,EAJJA,MACA+jB,EAGI,EAHJA,KACA/d,EAEI,EAFJA,OACA4qB,EACI,EADJA,SAEMmW,GAAQx1B,cAAQ,kBACpBsc,YAAciZ,EAAkBnJ,EAAU7P,UAAY6P,EAAUjT,iBAAgB,IAGlF,OAAI+b,EAAiBzmC,EAAO29B,EAAU7P,UAC7B9tB,EACJL,KAAI,SAACmgB,EAAGxa,GAAJ,OAAY,kBAACyhC,EAAD,CACfpJ,UAAWA,EACXrnB,SAAUA,EACVtW,MAAO8f,EACPiE,KAAMA,EACN/d,OAAQA,EACR4qB,SAAUA,EACV3wB,IAAK,cAAgB09B,EAAU53B,GAAKT,OAErCmB,QAAO,SAACugC,EAAMC,EAAM3hC,GAAb,MAAqB,CAAC0hC,EAAM,kBAACJ,GAAD,CAAgB3mC,IAAK,MAAQqF,IAAQ2hC,MAGtE,kBAACF,EAAD,CACLpJ,UAAWA,EACXrnB,SAAUA,EACVtW,MAAOA,EACP+jB,KAAMA,EACN/d,OAAQA,EACR4qB,SAAUA,KC3Kd,SDqDgC,SAACkW,EAAkBpnC,GAAyB,IAAnBwnC,EAAmB,uDAAP,GACnE,IAAI,IAqCEC,EAnCFC,EAYE1nC,EAZF0nC,oBACAC,EAWE3nC,EAXF2nC,YACAthC,EAUErG,EAVFqG,GACA/F,EASEN,EATFM,MACAqmC,EAQE3mC,EARF2mC,MACAiB,EAOE5nC,EAPF4nC,QACAthC,EAMEtG,EANFsG,OACAsgC,EAKE5mC,EALF4mC,MACAiB,EAIE7nC,EAJF6nC,WACAZ,EAGEjnC,EAHFinC,eACArwB,EAEE5W,EAFF4W,SACAyU,EACErrB,EADFqrB,KAIAL,EAGE0c,EAHF1c,cACAoD,EAEEsZ,EAFFtZ,SACAI,EACEkZ,EADFlZ,SAGI8H,EACJ2Q,GACGzY,GACAqZ,IACCpjC,IAAKkjC,EAAa,YAAY,GAG9B1oB,GAAaqX,GAAY7xB,IAAKijC,EAAqB,wBAAwB,IAAmB,WAATrc,EACrFkV,EAAWjgC,UAEF,IAAVA,SACkBuN,IAAjBvN,EAAMkF,QAAwBlF,EAAMkF,OAAS,GAC7CsiC,EAAYd,GAA0B1mC,EAAO0qB,EAAeoD,EAAU6Y,GAEtEzlC,EAAOkmC,EAAoBtZ,UAAYsZ,EAAoB1c,cAG3Dyb,EAAetY,wBAA0B3sB,GAE3CilC,GAAgBA,EAAa3H,qBAC/B2I,EAAoBhB,EAAa3H,mBAAmB,CAACb,UAAWyJ,EAAqB9wB,cAGvF,IAAMioB,EAAW4H,GAAgBA,EAAa5H,UAAY4H,EAAa5H,WAEvE,OACE,kBAAC,sBAA+B4I,EAC9B,kBAAClB,EAAD,CACEE,aAAcA,EACdE,MAAOA,EACPC,MAAOA,EACPrG,SAAUA,EACVl6B,GAAIA,EACJ0hC,UAAWzR,EACXwR,UAAWA,EACXvnC,IAAK8F,EACLlD,MAAOukC,EAAoBvkC,MAC3B8b,UAAWA,EACX+oB,eAAgBR,EAAUQ,eAC1BJ,QAASA,EACT/I,SAAUA,EACVZ,UAAWyJ,GAEX,kBAACP,GAAD,CACEC,iBAAkBU,EAAY,WAAaV,EAC3CxwB,SAAUA,EACVqnB,UAAWyJ,EACXpnC,MAAOA,EACP+jB,KAAM,CAAChe,KAAIiwB,WAAUrX,aACrB3Y,OAAQA,MAKhB,MAAO2hC,GAEP,OADApwB,aAAuB,2BAA4BowB,GACnD,KEhIJ,IAIMC,GAAwB,SAAAhkC,GAAS,IAEnC8B,EAQE9B,EARF8B,MAFmC,EAUjC9B,EAPFikC,KAAOxB,EAH4B,EAG5BA,MAAOiB,EAHqB,EAGrBA,QAAShB,EAHY,EAGZA,MAAOiB,EAHK,EAGLA,WAC9BxhC,EAMEnC,EANFmC,GACAqhC,EAKExjC,EALFwjC,oBACAC,EAIEzjC,EAJFyjC,YACAV,EAGE/iC,EAHF+iC,eACArwB,EAEE1S,EAFF0S,SACAyU,EACEnnB,EADFmnB,KAGI/kB,EAhBuB,SAAAN,GAAK,OAClCma,IAAMna,EAAO,CAAC,OAAQ,UAePoiC,CAAuBpiC,GAEhCqiC,EAAe,CACnBX,sBACArhC,KACAuQ,WACAtW,MAAO0F,EAAM1F,MACbqmC,QACAiB,UACAC,aACAvhC,SACAsgC,QACAe,cACAV,iBACA5b,QAEImc,EAAY,CAChBQ,eAAgB9jC,EAAMrD,KAAK+J,cAAc,CAACvE,GAAI,+CAGhD,OAAO43B,GAA2B/5B,EAAMkjC,iBAAkBiB,EAAcb,IAG1EU,GAAsBpwB,UAAY,CAChCjX,KAAMkX,sBACN1R,GAAI0R,WACJ/R,MAAO+R,UAAgB,CACrBzX,MAAOyX,QACPvL,KAAMuL,WACNuD,SAAUvD,WACTuwB,WACHH,KAAMpwB,UAAgB,CACpB6vB,QAAS7vB,SACT6uB,MAAO7uB,aACLA,YAAkBA,cAAoB,CAACA,SAAgBA,eAEzD4uB,MAAO5uB,SACP8vB,WAAY9vB,WACXuwB,WACHZ,oBAAqB3vB,sBACrB4vB,YAAa5vB,WACbkvB,eAAgBlvB,SAChBqvB,iBAAkBrvB,sBAClBsT,KAAMtT,YAGR,UAAezO,QAAW4+B,I,2BCpE1B,SAAensB,OAAO2O,OAAO,CAC3B6d,UAAW,YACXC,MAAO,QACP7d,OAAQ,SACRG,WAAY,aACZ2d,OAAQ,SACRC,MAAO,QACPC,UAAW,YACX7a,QAAS,Y,qkBCJJ,IAAM8a,GAAa,SAAChyB,EAAUwuB,GAAX,sBACfxuB,EADe,YACHwuB,IAOjByD,GAAkB,CACtB3d,GAAeA,MACfA,GAAeA,SAGX4d,GAAsB,SAAtBA,EAAsBjf,GAG1B,IAFA,IAAMxpB,EAAS,GAENkqB,EAAI,EAAGA,EAAIV,EAAWvd,SAAS9G,OAAQ+kB,IAAK,CAC/CV,EAAWvd,SAASie,GAAGje,UACzBjM,EAAOopB,KAAP,MAAAppB,EAAM,IAASyoC,EAAoBjf,EAAWvd,SAASie,MAGzD,IAAMS,EAAgBnB,EAAWvd,SAASie,GAAGS,cACzC6d,GAAgBj7B,SAASod,KAAwC,IAAtBnB,EAAW0E,QACxDluB,EAAOopB,KAAP,SACKI,EAAWvd,SAASie,IADzB,IAEEiE,SAAU3E,EAAW2E,SACrBua,WAAYlf,EAAWkf,cAK7B,OAAO1oC,GAWH2oC,GAAoB,CACxBpmC,SAAU,SAAAqmC,GAAe,OAAIltB,OAAOkP,OAAOge,EAAgBzI,iBAAiBxyB,QAAO,SAAAoS,GAAC,OAAIA,O,mnBCzCnF,IAAM8oB,GAA6B,SAACvjC,EAAQynB,GACjD,IAAI/sB,EAAS,OVHkB,SUGrB,OVD4B,sBUC0B,KAEhE,OAAK+sB,GAGLA,EAAOzO,SAAQ,SAAAioB,GACTA,EAAMpW,QAAU7qB,EAAO6qB,QAAY7qB,EAAOpF,KAAQqmC,EAAMrmC,MAAQqmC,EAAMrmC,MAAQoF,EAAOpF,IAMvFF,EAAM,OAAN,oBAAoDopB,KAAKmd,IALzDvmC,EAAS,SAAIA,GAAWumC,EAAMxmC,OAC1B2b,OAAOqD,UAAUC,eAAele,KAAKylC,EVVL,2BUWlCvmC,EAAM,OAAN,sBAAwDumC,EAAK,2BAM5DvmC,GAZEA,GAgBE8oC,GAAqB,SAAA/D,GAAS,OAAKA,EAAUxgB,QAAQ,MAAO,OAC5DwkB,GAAyB,SAAAhE,GAAS,OAAKA,EAAUxgB,QAAQ,MAAO,MAMhEykB,GAA4B,SAAA1jC,GACvC,OAAOxF,IAAQwF,GAAQ,SAACoH,EAAKu8B,EAAK/oC,GAAX,UAAC,MAAuBwM,GAAxB,UAA8Bq8B,GAAuB7oC,GAAO+oC,MAAO,KAG/EC,GAAiB,SAACC,EAAeve,EAAQwe,GACpD,IAAMC,EAAc,GAQpB,OANAvE,IAAQla,GAAQ,SAAC3qB,EAAOC,IAClBkpC,GAAaE,KAASrpC,EAAOkpC,EAAcjpC,KAC7CmpC,EAAYjgB,KAAKlpB,MAIdmpC,G,YC9CT,SAAe3tB,OAAO2O,OAAO,CAC3Bkf,aAAc,eACdC,eAAgB,mB,oVCCX,IAAMC,GAAuBvqC,SAAH,KACXG,WAAY,SACdF,WAAa,IAQfA,WAAa,K,0lDCM/B,IAAMuqC,GAAc,SAAA7lC,GAAS,IAEzB8lC,EASE9lC,EATF8lC,iBACArkC,EAQEzB,EARFyB,OACA0lB,EAOEnnB,EAPFmnB,KACA4e,EAME/lC,EANF+lC,kBACApU,EAKE3xB,EALF2xB,eACAjF,EAIE1sB,EAJF0sB,WACAha,EAGE1S,EAHF0S,SACAwwB,EAEEljC,EAFFkjC,iBACA9L,EACEp3B,EADFo3B,sBAGI4O,EAAgB,SAAC7e,EAAMC,GAAP,OACnBD,IAASC,GAA4B,IAAlBA,EAAO9lB,QAAgB8lB,EAAO1d,SAASyd,IAGvD8e,EAAgB,SAAC79B,GAAqC,MAA3B26B,EAA2B,wDACpD5mC,EAAS,GAD2C,KAEtCiM,GAFsC,IAE1D,2BAA8B,KAAnBC,EAAmB,QAC5B,GAAIA,EAAMye,gBAAkBE,GAAeA,OACzC7qB,EAAOopB,KAAK2gB,EAAsB79B,EAAOA,EAAMmiB,WAAYuY,SACtD,IAAIlc,QAASxe,EAAMye,eACxB3qB,EAAOopB,KAAK4gB,EAAa99B,SACpB,GAAIA,EAAMye,gBAAkBE,GAAeA,UAChD7qB,EAAOopB,KAAK6gB,EAAe/9B,EAAO06B,SAC7B,GAAI+C,GAAoBA,EAAiBz9B,EAAMye,eACpD,OAAOuf,EAAsBh+B,IAVyB,8BAa1D,OAAOlM,GAGHiqC,EAAiB,SAACE,EAAUvD,GAChC,IAAMgC,EAAkBuB,EAASl+B,SAAS5G,MAAK,SAAA6G,GAAK,QAAKwe,QAASxe,EAAMye,kBAExE,IAAKie,EACH,OAAO,KAGT,IAAMvB,EAAsB,SACvBuB,GACAzD,IAAMgF,EAAU,CAAC,QAAS,SAAU,WAAY,YAG/CpF,EAAYsC,EAAoBlhB,MAAQkhB,EAAoBrhC,GAC5DshC,EAAcljC,IAAKkB,EAAQ,SAAWy/B,EAAU7oB,MAAM,KAAK1Y,KAAK,kBAwCtE,OAtC0B,SAAC6jC,EAAqBC,GAC9C,IAAKuC,EAAc7e,EAAMqc,EAAoBpc,QAC3C,OAAO,EAGT,GAAIoc,EAAoBnZ,OACtB,OAAO,EAGT,GAAI0b,IAAsBA,EAAkB7E,GAC1C,OAAO,EAGT,GAAyB,WAArBgC,EACF,OAAO,EAqBT,SAREH,GACGpR,EAAerH,UACdmZ,IAAwC,IAAzBA,EAAY8C,UAClB,WAATpf,IAAsBsc,GAAqD,gBAAtCD,EAAoB1c,eACvB,aAAjC0c,EAAoBtZ,UACtBsZ,EAAoBlZ,UAAkD,YAAtCkZ,EAAoB1c,gBAfnC,SAACoa,EAAWxU,GAChC,GAAK7U,OAAOqD,UAAUC,eAAele,KAAKyvB,GAAc,GAAIwU,GAErD,CACL,IAAM9kC,EAAQswB,EAAWwU,GACzB,OAAiB,MAAT9kC,GAA2B,KAAVA,GAAiB+Y,MAAM4W,QAAQ3vB,IAA2B,IAAjBA,EAAMkF,OAHxE,OAAO,EAgBUklC,CAAcvB,GAAmB/D,GAAYxU,IAGhE+Z,CAAkBjD,EAAqBC,GAClC,kBAACN,EAAA,EAAD,CACL9mC,IAAG,gBAAW6kC,GACd6B,eAAgBA,EAChBz6B,KAAM28B,GAAmB/D,GACzB/+B,GAAIuiC,GAAWhyB,EAAUwuB,GACzBxuB,SAAUA,EACV1P,UAAWghC,GACXR,oBAAqBA,EACrBC,YAAaA,EACbP,iBAAkBA,EAClB1K,OAAQ,KACRrR,KAAMA,IAIH,MAGHgf,EAAe,SAAAloC,GACnB,IAAMsU,EAAahS,IAAKP,EAAO,gBACzBiS,EAAY1R,IAAKP,EAAO,cAE9B,OAAO,kBAAC4lC,GAAD,CACLvpC,IAAG,iBAAY4B,EAAOkE,KAEtB,kBAACO,GAAA,SAAD,CACEijB,WAAY1nB,EACZ2nB,UAAWljB,8BAAiC6P,EAAYN,GACxDkV,KAAMA,EACNiQ,sBAAuBA,MAKvB8O,EAAwB,SAACjc,EAAO3sB,EAAMylC,GAAmB,MACzD2D,EAAWT,EAAchc,EAAM7hB,SAAU26B,GAAkB9Y,EAAMK,UAMrE,GAJInV,MAAM4W,QAAQ2a,KAChBA,EAAWA,EAAS58B,OAAOD,WAGxB68B,GAAavxB,MAAM4W,QAAQ2a,IAAiC,IAApBA,EAASplC,OACpD,OAAO,KAGT,IAAMgB,EAAU2nB,EAAMhrB,MAClB,kBAAC0nC,EAAA,WAAD,CAAeC,UAAU,EAAMthC,QAAQ,GACvC,kBAACqhC,EAAA,UAAD,KAAc,kBAAC7yB,EAAA,MAAD,KAAgBmW,EAAMhrB,QACpC,kBAAC0nC,EAAA,QAAD,KAAaD,IAEbA,EAOEG,GALS,WACZC,GAAYA,eAAiBC,EAAOA,WADxB,MAEZD,GAAYA,aAAeC,EAAOA,KAFtB,GAKmBzpC,GAC5BjB,EAAM,mBAAH,OAAsB4tB,EAAM9nB,GAA5B,YAAkC8nB,EAAMO,YAEjD,OAAIqc,EACK,kBAACA,EAAD,CACLxqC,IAAKA,EACLwlC,wBAAyB5X,EAAM4X,yBAC9Bv/B,IAGHqR,eAAA,uBAAyCrW,EAAzC,sBAA2D2sB,EAAM9nB,GAAjE,kBACO,OAILkkC,EAAwB,SAAApc,GAC5B,IAAK+b,EAAc7e,EAAM8C,EAAM7C,QAC7B,OAAO,KAGT,IAAM/qB,EAAM,oBAAH,OAAuB4tB,EAAM9nB,GAA7B,YAAmC8nB,EAAMO,YAGlD,OAAOxnB,EAFW8iC,EAAiB7b,EAAMnD,gBAExBmD,EAAO5tB,IAG1B,OAAO4pC,EAActU,EAAevpB,SAAUupB,EAAerH,WAczD3O,GAAW,SAAC1a,EAAW2a,GAE3B,OAAuB,IADV/D,OAAOzC,KAAK0G,eAAc7a,EAAW2a,IACtCta,QAGd,SAAeK,SAAWkkC,GAAalqB,I,wFC7GtB,kBAAC,KAAD,CACTtf,IAAI,eACJ8F,GAAG,uC,GAUM,kBAAC,KAAD,CACT9F,IAAI,aACJ8F,GAAG,qCAMX,UACE,uBAnHgC,SAAC/F,EAAO4qC,GAAR,OAChC5qC,EAAMkF,OAAS0lC,EACX,CACEA,UAAW,CACX,kBAAC,KAAD,CACE3qC,IAAI,0BACJ8F,GAAG,gDACH4kB,OAAQ,CAACigB,iBAIb,MAyGJ,qBA1FgC,SAAC5qC,EAAO6qC,GAAR,OAChC7qC,EAAMkF,OAAS2lC,EACX,CACEA,UAAW,CACX,kBAAC,KAAD,CACE5qC,IAAI,0BACJ8F,GAAG,gDACH4kB,OAAQ,CAACkgB,iBAIb,MAgFJ,4BAxGgC,SAAC7qC,EAAO89B,GAAR,OAChC99B,EAAQ89B,EACJ,CACEgN,UAAW,CACX,kBAAC,KAAD,CACE7qC,IAAI,0BACJ8F,GAAG,gDACH4kB,OAAQ,CAACmT,gBAIb,MA8FJ,0BA/EgC,SAAC99B,EAAO+9B,GAAR,OAChC/9B,EAAQ+9B,EACJ,CACE+M,UAAW,CACX,kBAAC,KAAD,CACE7qC,IAAI,0BACJ8F,GAAG,gDACH4kB,OAAQ,CAACoT,gBAIb,MAqEJ,gCAnEgC,SAAC/9B,EAAOqW,GAAR,OAChCrW,EAAM+qC,WAAWz9B,SAAS,MAAQtN,EAAM+qC,WAAW9uB,MAAM,KAAK,GAAG/W,OAASmR,EACtE,CACE20B,SAAU,CACV,kBAAC,KAAD,CACE/qC,IAAI,yBACJ8F,GAAG,+CACH4kB,OAAQ,CAACtU,aAIb,MAyDJ,+BAvD+B,SAACrW,EAAOqW,GAAR,OAC/BA,EAAQ,GAAKrW,EAAM+qC,WAAW9uB,MAAM,KAAK,GAAG/W,OAASmR,EACjD,CACE20B,SAAU,CACV,kBAAC,KAAD,CACE/qC,IAAI,yBACJ8F,GAAG,+CACH4kB,OAAQ,CAACtU,aAIb,MA6CJ,gBA3C4B,SAACrW,EAAOirC,GAAR,OAC3BC,OAAOD,GAASE,KAAKnrC,GAUlB,KATA,CACEgrC,SAAU,CACV,kBAAC,KAAD,CACE/qC,IAAI,6BACJ8F,GAAG,mDACH4kB,OAAQ,CAACsgB,gBAqCjB,MA/B4B,SAAAjrC,GAAK,OAChCorC,KAAQprC,GASL,KARA,CACEo8B,OAAQ,CAAC,MA6Bf,IApB0B,SAAAp8B,GAAK,OAC9BqrC,KAAMrrC,IAAYA,EAAMsN,SAAS,cAAgB+9B,KAAMrrC,EAAO,CAACsrC,aAAa,IAQzE,KAPA,CACElP,OAAQ,CAAC,O,qDChGD,kBAAC,KAAD,CACRn8B,IAAI,qBACJ8F,GAAG,6CCbX,UAAgBwlC,kBAAgBC,gBDmBhC,CACEC,MApByB,iCAAG,WAAMzrC,GAAN,iGAAa0rC,EAAb,+BAA+B,GAA/B,SACL,+BADK,cACtBC,EADsB,OAEtBC,EAAqBF,EAAgBG,aAAe7rC,EAAMwd,MAAMkuB,EAAgBG,aAChFC,EAAqBH,EAASI,cAClC/rC,EACC0rC,EAAgBM,eANU,MACD,kBAQpBJ,GAAsBE,EAC1B,KACA,CACEL,MAAO,CAAC,MAXc,2CAAH,uDCAsBQ,eCOnB,CAC5BttB,UAAW,CACT,kBAAC,KAAD,CACE1e,IAAI,yBACJ8F,GAAG,mDDXwDmmC,aCDrC,SAAAlsC,GAAK,QAC/BA,SAEa,KAAVA,GACC+Y,MAAM4W,QAAQ3vB,IAA2B,IAAjBA,EAAMkF,QACb,WAAjB,KAAOlF,IAAoD,IAA9Byb,OAAOzC,KAAKhZ,GAAOkF,U,2jCCEtD,IAEMinC,GAAW,SAAArf,GAAM,OACrBA,GAAUrR,OAAOzC,KAAK8T,GAAQ5nB,OAAS,GAGnCknC,GAAgB,iCAAG,WAAMzhB,EAAQ0hB,GAAd,wFACnBvf,EAAS,GADU,KAEOuf,GAFP,4DAEZ1D,EAFY,QAGf3oC,EAAQ2qB,EAAOge,EAAgBziB,OACjComB,GAAWA,aAAatsC,GAJP,gCAKassC,GAAWA,iBALxB,iDAKRC,EALQ,YAMbC,KAAK7D,EAAiB,CAAC,aAAc4D,IANxB,wBAOTE,EAAiBtoC,IAAKwkC,EAAiB,CAAC,aAAc4D,IACtDG,EAAYJ,GAAWA,gBAAgBC,GAR9B,UASeG,EAAU1sC,EAAOysC,GAThC,SASTE,EATS,UAWb7f,EAASiX,EAAWA,UAAUjX,EAAQ6b,EAAgBziB,KAAMymB,IAX/C,+LAiBhB7f,GAjBgB,gEAAH,wDAoBhB8f,GAAkB,SAACtc,EAAY4Y,EAAene,GAClD,IAAMqe,EAAcH,GAAeC,EAAe5Y,GAC5Cuc,EAAgB9D,GAA0BzY,GAC1CjrB,EAASorB,cAAaoc,EAAezD,GACrC1sB,EAAU,CACduT,YAAa,CAAC6c,WAAW,GACzB/rC,OAAiB,WAATgqB,EAAoB,OAAS,QACrCwB,QAAS,CAAC,qBAAsB,SAChC5P,KAAMtX,EACNinB,mBAAoB,CAnCW,oBAsCjC,OAAOxrB,mBAAA,uBAAmCuE,EAAO6qB,OAA1C,OAAkD7qB,EAAOpF,IAAP,WAAiBoF,EAAOpF,KAAQ,IAAMyc,GAC5F3S,MAAK,SAAAgjC,GAAI,OAAIA,EAAKpwB,QAClB5S,MAAK,SAAA4S,GACJ,OAAIA,EAAKoS,MACA,GA1CoB,oBA6CzBpS,EAAKiQ,UACAmX,EAAWA,4BAA4BpnB,EAAMtX,GAG/CujC,GAA2BvjC,EAAQsX,EAAKmQ,YAYxCkgB,GAAe,iCAAG,WAAM1c,EAAY4Y,EAAemD,EAAkBthB,GAAnD,0FACQqhB,GAAiB9b,EAAY+b,GADrC,UACvBY,EADuB,QAEzBd,GAASc,GAFgB,sBAGrBA,EAHqB,uBAMOL,GAAgBtc,EAAY4Y,EAAene,GANlD,UAMvBmiB,EANuB,QAOzBf,GAASe,GAPgB,uBAQrBA,EARqB,4CAAH,4DCvE5B,SAAezxB,OAAO2O,OAAO,CAC3B+iB,OAAQ,SACRC,OAAQ,W,6BCGAC,I,aAqDeC,I,qkBArDzB,SAAUD,GAAarM,EAAQlrB,GAA/B,2EACQy3B,EAAiBvM,EAAOv6B,QAAO,SAACgG,EAAKohB,GAAU,IAC5C9nB,EAAa8nB,EAAb9nB,GAAI/F,EAAS6tB,EAAT7tB,MACLwtC,EAAarpC,IAAK2R,EAAa,CAAC,QAAS/P,IAC/C,GAAIynC,GAAkC,aAApBA,EAAWtsC,KAAqB,CAChD,IAAM8sB,EAAewf,EAAWxf,aAC1Byf,EAAa10B,MAAM4W,QAAQ3vB,GAASA,EAAQ,CAACA,GAEnD,gBACKyM,GADL,UAEGuhB,EAFH,cAGQvhB,EAAIuhB,IAAiB,IAH7B,IAIOyf,MAIT,OAAOhhC,IAEP,IAEyC,IAAvCgP,OAAOzC,KAAKu0B,GAAgBroC,OApBlC,yCAqBW,MArBX,OAwBS,OAxBT,UAwBerE,SAAKC,mBAAoBysC,GAxBxC,gFA2BO,IACDG,GAA2B,SAAC1tC,EAAO2tC,EAAU3f,GAAlB,MAC9B,CAAC/tB,IAAKD,EAAO4d,QAASzZ,IAAKwpC,EAAU,CAAC3f,EAAchuB,GAFtB,QAI3B4tC,GAAuB,SAAC5tC,EAAOwtC,EAAYG,GAC/C,GAAIH,GAAkC,aAApBA,EAAWtsC,KAAqB,KACzC8sB,EAAgBwf,EAAhBxf,aAEP,OAAIwf,EAAWK,MACN7tC,EAAML,KAAI,SAAAmgB,GAAC,OAAI4tB,GAAyB5tB,EAAG6tB,EAAU3f,MAErD0f,GAAyB1tC,EAAO2tC,EAAU3f,GAIrD,OAAOhuB,GAWM,SAAUstC,GAAqBtM,EAAQlrB,GAAvC,wEACI,OADJ,UACUjV,SAAKwsC,GAAcrM,EAAQlrB,GADrC,cACP63B,EADO,yBAGN3M,EAAOv6B,QAAO,SAACgG,EAAKohB,GAAU,IAC5B9nB,EAAa8nB,EAAb9nB,GAAI/F,EAAS6tB,EAAT7tB,MACLwtC,EAAarpC,IAAK2R,EAAa,CAAC,QAAS/P,IAE/C,gBACK0G,GADL,UAEG1G,EAAK6nC,GAAqB5tC,EAAOwtC,EAAYG,OAE/C,KAXU,wCCtCf,UACEG,iBACArE,eACAnB,cACAyF,oBZhBiC,SAAAxY,GACjC,OAAOiT,GAAoBjT,IYgB3ByY,iBZa8B,SAAA3B,GAAgB,OAC9CA,EACG3+B,QAAO,SAAAylB,GAAC,OAAuB,OAAnBA,EAAEvU,mBAA4CrR,IAAnB4lB,EAAEvU,gBACzCnY,QAAO,SAACwnC,EAAUpgB,GAAX,UAAC,MACJogB,GADG,UAELpgB,EAAM3H,MAAQ2H,EAAM9nB,GAAK8nB,EAAMjP,iBAC9B,KYlBNsvB,aZwB0B,SAAA7B,GAAgB,OAC1C8B,KACE9B,EACG3+B,QAAO,SAAAmgB,GAAK,OAAIA,EAAMnD,gBAAkBE,GAAeA,SACvDnkB,QAAO,SAAC2nC,EAAavgB,GAAd,oBAEDugB,GAFC,IAGA1F,GAAkB7a,EAAMC,UAAY4a,GAAkB7a,EAAMC,UAAUD,GAAS,CAACA,EAAM3H,MAAQ2H,EAAM9nB,QAE5G,MYhCJgjC,6BACAsF,mBXCgC,SAAAhpC,GAChC,OAAOxF,IAAQwF,GAAQ,SAACoH,EAAKu8B,EAAK/oC,GAAX,UAAC,MAAuBwM,GAAxB,UAA8Bo8B,GAAmB5oC,GAAO+oC,MAAO,KWDtFC,kBACAL,8BACAC,sBACAC,0BACAwF,eC3BF,SAAejC,GAAgB,OAAI,SAAA1hB,GACjC,IAAImC,EAAS,GAuBb,OArBAuf,EAAiBhuB,SAAQ,SAAAsqB,GACvB,IAAM3oC,EAAQ2qB,EAAOge,EAAgBziB,MAEjComB,GAAWA,aAAatsC,GAC1Byb,OAAOzC,KAAKszB,GAAWA,gBAAgBjuB,SAAQ,SAAAkwB,GAC7C,GAAI/B,KAAK7D,EAAD,CAAmB,cAAnB,WAAoC4F,EAAiBtyB,MAAM,QAAQ,CACzE,IAAMwwB,EAAiBtoC,IAAKwkC,EAAD,CAAmB,cAAnB,WAAoC4F,EAAiBtyB,MAAM,QAEhF0wB,GAAkBD,EADNJ,GAAWA,eAAeiC,IACVvuC,EAAOysC,GACrCE,IACF7f,EAASiX,EAAWA,UAAUjX,EAAQ6b,EAAgBziB,KAAMymB,QAK9DhE,EAAgB9b,YAAc8b,EAAgB9b,WAAWlO,YAC3DmO,EAASiX,EAAWA,UAAUjX,EAAQ6b,EAAgBziB,KAAMomB,GAAWA,oBAKtExf,IDIPlC,kBACA8f,eACA1f,UACAshB,cACAgB,wBACAN,mBACAwB,iBHuB8B,SAACle,EAAY4Y,EAAene,GAA5B,OAC9B6hB,GAAgBtc,EAAY4Y,EAAene,GACxChhB,MAAK,SAAA+iB,GACJ,GAAIqf,GAASrf,GACX,MAAM,IAAI2hB,KAAgB3hB,OG1BhC4hB,aXQ0B,SAAA5uB,GAAC,OAC3BA,SAES,KAANA,GACC/G,MAAM4W,QAAQ7P,IAAmB,IAAbA,EAAE5a,QACT,WAAb,KAAO4a,IAA4C,IAA1BrE,OAAOzC,KAAK8G,GAAG5a,U,uIazCjCypC,EAA2B,SAAA7J,GAAS,MAAK,CACpD5jC,KAZ2C,yCAa3CC,QAAS,CACP2jC,eAIS8J,EAAsB,SAAC9J,EAAW9jC,GAAZ,IAAsB6tC,EAAtB,8DAAyD,CAC1F3tC,KApBmC,iCAqBnCC,QAAS,CACP2jC,YACA9jC,WACA6tC,2B,ikBCvBG,IA2BDptC,GAAe,WD5BgB,kCCCF,SAACnB,EAAD,WAASa,QAAU2jC,EAAnB,EAAmBA,UAAW9jC,EAA9B,EAA8BA,SAAU6tC,EAAxC,EAAwCA,sBAAxC,cAE5BvuC,GAF4B,IAG/BZ,KAAM,EAAF,KACCY,EAAMZ,MADP,UAEDolC,EAAY,CACXplC,KAAMsB,EACN49B,WAAW,EACXiQ,gCAmBa,MD3BwB,0CCcH,SAACvuC,EAAD,OAAmBwkC,EAAnB,EAAS3jC,QAAU2jC,UAAnB,cAEnCxkC,GAFmC,IAGtCZ,KAAM,EAAF,KACCY,EAAMZ,MADP,UAEDolC,EAAY,CACXlG,WAAW,EACXl/B,KAAM,WAMO,GAKfiC,EAAe,CACnBjC,KAAM,IAGO,SAASurB,IAAsC,IAA9B3qB,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,ECxCrC,IAWMwuC,EAAa,SAACzpC,EAAQU,EAAIgpC,GAAb,MAA0B,CAClD7tC,KAXyB,uBAYzBC,QAAS,CACPkE,SACAU,KACAgpC,a,ikBCdG,IAaDttC,EAAkB,ODdG,wBCCD,SAACnB,EAAD,WAASa,QAAUkE,EAAnB,EAAmBA,OAAQU,EAA3B,EAA2BA,GAAIgpC,EAA/B,EAA+BA,QAA/B,SAAC,KAEpBzuC,GAFmB,IAGtBZ,KAAM,OACDY,EAAMZ,MADP,UAED2F,EAFC,OAGG/E,EAAMZ,KAAK2F,IAHd,UAICU,EAAKgpC,WAURptC,EAAe,CACnBjC,KAAM,IAGO,SAASurB,IAAsC,IAA9B3qB,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,E,2pBCjBnByB,G,WAMRitC,G,WAMAC,GAZF,SAAUltC,IAAV,iEACb,OADa,UACPR,QAAI,EACRkb,QJVkC,kCIUwBwyB,KAF/C,uCAMR,SAAUD,EAA4BhuC,GAAtC,yEACqB,OADrB,UAC2BH,QAAK4vB,sBAAuBzvB,GADvD,OAEY,OADXkuC,EADD,iBAEkBruC,QAAKC,kBAAoBouC,GAF3C,cAECvB,EAFD,yBAGE3sC,EAASrB,KAAI,SAAA0F,GAAM,cAASA,GAAT,IAAiBuY,QAAS+vB,EAAStoC,EAAO6qB,OAAO7qB,EAAOpF,WAH7E,uCAMA,SAAUgvC,EAAV,8FACa,OADb,IAA8B9tC,QAAU2jC,EAAxC,EAAwCA,UAAW3uB,EAAnD,EAAmDA,WAAnD,IAA+DuG,eAA/D,MAAyE,GAAzE,YACmBlc,QAAO2uC,EAAmBrK,GAD7C,UACCsK,EADD,OAEAC,EAAWD,KAAc1yB,EAAQqiB,YAFjC,iBAGH,OAHG,UAGG99B,QAAIquC,EAAiDxK,IAHxD,OAIW,OAJX,UAIiBjkC,QAAK0uC,EAAU7yB,GAJhC,OASW,OALRjc,EAJH,OAKG+uC,EAAiB,CACrBzuC,OAAQ,OANP,WASiBF,QAAKC,eAAiBqV,GATvC,QAaY,OAJT+Z,EATH,OAUsC,YAArC/rB,IAAK+rB,EAAO,uBACdzvB,EAAMw0B,MAAQ,UAXb,WAakBp0B,QAAKC,kBAAoBqV,EAAY1V,EAAO+uC,GAb9D,QAcQ,OADPxuC,EAbD,kBAccH,QAAKmuC,EAA6BhuC,GAdhD,QAiBH,OAFAA,GADAA,EAdG,QAeiBrB,KAAI,SAAA0F,GAAM,OAAI6/B,IAAM7/B,EAAQorB,mCAC1Coe,IAAwBnyB,EAAQrG,OAAQrV,EAASkE,OAASwX,EAAQrG,MAhBrE,WAiBGpV,QACJquC,EACExK,EAAWpoB,EAAQrG,MAAQrV,EAASyuC,OAAO,EAAG/yB,EAAQrG,OAASrV,EAAU6tC,IAnB1E,wCAwBA,IAAMM,EAAoB,SAAC7uC,EAAOwkC,GAAR,OAAsBxkC,EAAMswB,SAAS6N,iBAAiB/+B,KAAKolC,IAEtFuK,EAAa,SAAAD,GAAS,SAAOA,GAAaA,EAAU1vC,MAAQ0vC,EAAU1vC,KAAKwF,OAAS,IAE7EqqC,EAAW,SAAA7yB,GAAO,oBAEvBA,EAAQrG,MAAQ,CAACA,MAAOqG,EAAQrG,MAAQ,GAAK,IAC7CqG,EAAQyiB,WAAa,CAACpW,OAAQrM,EAAQyiB,YAAc,IACpDziB,EAAQ0Y,QAAU,CAACA,QAAS1Y,EAAQ0Y,SAAW,IAC/C1Y,EAAQgjB,aAAe,CAACA,aAAchjB,EAAQgjB,cAAgB,IAC9DhjB,EAAQpG,SAAW,CAACgY,KAAM5R,EAAQpG,UAAY,K,WChD7BvU,G,WASR2tC,GATF,SAAU3tC,IAAV,iEACb,OADa,UACPR,QAAI,EACRkb,QHRwB,wBGQeizB,KAF5B,uCAMR,IAAMC,EAAkB,SAACrvC,EAAO6V,EAAYpQ,GAApB,OAC7B5B,IAAK7D,EAAD,iCAAkC6V,EAAlC,YAAgDpQ,GAAM,OAErD,SAAU2pC,EAAV,uFAAuBvuC,QAAUkE,EAAjC,EAAiCA,OAAQU,EAAzC,EAAyCA,IAC1CV,EADC,iBAEa,OAFb,UAEmB7E,QAAOmvC,EAAiBtqC,EAAQU,GAFnD,UAIY,MAJZ,wBAKe,OALf,UAKqBlF,QAAKC,iBAAmBuE,EAAQU,EAAI,WALzD,OAMD,OADM6X,EALL,kBAMK3c,QAAI2uC,EAA0BvqC,EAAQU,EAAI6X,IAN/C,wC,qCCFMiyB,EAAuB,SAAA1f,GAAG,MAAK,CAC1CjvB,KAboC,kCAcpCC,QAAS,CACPgvB,SCbSyQ,EAAmB,SAACtqB,EAAUwuB,EAAW9kC,GAAtB,MAAiC,CAC/DkB,KAJgC,8BAKhCC,QAAS,CACPmV,WACAwuB,YACA9kC,W,2gBCLG,IAAM8vC,GAAuB7wC,UAAH,KAGVC,YAAa,IAKvB6wC,GAAoC9wC,UAAH,KAC9BG,WAAY,SACXF,WAAY,IAOzByE,M,GCmBI,mBAAC,KAAD,CAAkBoC,GAAG,qBAuB7B,SAtDuB,SAAC,GAAD,IACrBoQ,EADqB,EACrBA,WACAG,EAFqB,EAErBA,SACA05B,EAHqB,EAGrBA,mBACAC,EAJqB,EAIrBA,kBACAzmB,EALqB,EAKrBA,UACAvT,EANqB,EAMrBA,WACA43B,EAPqB,EAOrBA,MACAqC,EARqB,EAQrBA,UACAC,EATqB,EASrBA,QATqB,OAWrB,mBAACL,GAAD,KACE,mBAACK,EAAD,CACEpqC,GAAE,0BAAoB0mB,UACtBtW,WAAYA,EACZG,SAAUA,EACV05B,mBAAoBA,EACpB35B,MAAO,GACP+5B,gBAAgB,EAChBC,eAAgB,SAAA7mB,GACdymB,EAAkBzmB,IAEpBA,UAAWA,EACXvT,WAAYA,EACZY,eAAgBg3B,EAAQ,QAAU,SAClCyC,kBAAkB,EAClBv5B,4BAA4B,EAC5BP,aAAa,IAEf,mBAACu5B,GAAD,KACE,mBAAC9hC,GAAA,EAAD,CAAQiN,KAAK,SAAS3W,QAAS2rC,GAA/B,OCjCN,IAAM1qC,GAAoB,CACxByQ,WAAYgB,4BAGd,UAAexR,cAAQ,KAAMD,GAA7B,CAAgD+qC,ICLzC,IAAMve,GAAe,SAAChyB,EAAO6tC,GAAR,OAAkB7tC,EAAQ6tC,EAAQ7tC,EAAML,KAAI,SAAAmgB,GAAC,OAAIA,EAAE7f,OAAO,CAACD,EAAMC,KAAO,IAEvFogC,GAAW,SAACr/B,EAAU6sC,GAAX,OACtBA,EACI7sC,EACCA,EAASkE,OAAS,EACf,CACEjF,IAAKe,EAAS,GAAGf,IACjB2d,QAAS5c,EAAS,GAAG4c,SAEvB,MAEG4yB,GACT,SAAC3hB,EAASxpB,EAAQiR,EAAU05B,EAAoBxmB,EAAWymB,EAAmBC,EAAWO,EAAS5C,GAAlG,MAEE,mBAAC6C,GAAD,CACEP,QAASthB,EACT1Y,WAAY9Q,EACZiR,SAAUA,EACV05B,mBAAoBA,EACpBxmB,UAAWA,EACXymB,kBAAmBA,EACnBC,UAAWA,EACXriB,MAAO4iB,EACP5C,MAAOA,IAXX,OACA,sB,qlBCLqB9rC,I,YAMRq9B,I,YAuCA4P,I,YAMA2B,I,YA2BAd,IAhFJe,GAAuB,SAACtwC,EAAOL,GAAR,OAAgBK,EAAMC,KAAKswC,SAAS5wC,IAAQA,GAEjE,SAAU8B,GAAMguB,GAAhB,iEACb,OADa,UACPxuB,QAAI,EACRkb,QNfgC,gCMesB2iB,GAAoBrP,KAF/D,wCAMR,SAAUqP,GAAmBrP,EAA7B,8GAcsB,OAdgB5uB,EAAtC,EAAsCA,QACpC0tB,EAAWkB,EAAXlB,QACAvY,EAA8BnV,EAA9BmV,SAAUqnB,EAAoBx8B,EAApBw8B,UAAW39B,EAASmB,EAATnB,MAGtBywC,EAMF9S,EANF53B,GACAlD,EAKE86B,EALF96B,MACUiuC,EAIRnT,EAJFsB,SACc55B,EAGZs4B,EAHF3P,aACAF,EAEE6P,EAFF7P,SACUijB,EACRpT,EADFrnB,SAEIu3B,EAAqB,uBAAb/f,EACRkjB,EAAsBD,EAAgB,GAAH,OAAM1rC,EAAN,YAAgB0rC,GAAkBD,GAAiBzrC,EAbvF,UAc4BxE,QAAKC,cAAgBkwC,EAAqB,eAdtE,OAeiB,OADhBhB,EAdD,kBAeuBnvC,QAAKgc,MAf5B,QAgBW,OADVC,EAfD,kBAgBiBjc,QAAK4rB,KAhBtB,QAiBuB,OADtBwkB,EAhBD,kBAiB6BzwC,QAAOowC,GAAsB,gCAjB1D,QAkBa,OADZM,EAjBD,kBAkBmBrwC,QAAKmxB,GAAchyB,EAAO6tC,GAlB7C,QAmCL,OAjBMrkB,EAlBD,OAoBC2nB,EAA0BX,GAC9B3hB,EACAxpB,EACA2rC,EACAhB,EACAxmB,GACA,SAAA2G,GACErT,EAAc7b,IAAImwC,EAA2CjhB,OAE/D,WACErT,EAAc7b,IN7BsB,CACxCC,KAnBmC,qCMiDjCuvC,EACA5C,GAjCG,WAmCC5sC,QAAI8b,UAAmBk0B,EAAnB,UAA+BpuC,EAA/B,aAAyCquC,GAAuB,KAAMC,GAAyB,IAnCpG,QAoCL,OApCK,WAoCCxd,QAAMgd,GAAqB7zB,EAAem0B,EAASR,EAASn6B,EAAUjR,EAAQwoC,GApC/E,yCAuCA,SAAUmB,GAA4BhuC,GAAtC,yEACqB,OADrB,UAC2BH,QAAK4vB,sBAAuBzvB,GADvD,OAEY,OADXkuC,EADD,iBAEkBruC,QAAKC,kBAAoBouC,GAF3C,cAECvB,EAFD,yBAGE3sC,EAASrB,KAAI,SAAA0F,GAAM,gBAASA,GAAT,IAAiBuY,QAAS+vB,EAAStoC,EAAO6qB,OAAO7qB,EAAOpF,WAH7E,wCAMA,SAAU0wC,GAAoB7zB,EAAem0B,EAASR,EAASn6B,EAAUjR,EAAQwoC,GAAjF,mFACDwD,GAAY,EADX,WAEEA,EAFF,iBAGqB,OAHrB,UAG2Br0B,QAAKF,GAHhC,mBAGI3b,EAHJ,EAGIA,QNlE2B,qCMkElBD,EAHb,EAGaA,MAHb,sBAKGC,EAAQgvB,KAAOhvB,EAAQgvB,IAAIjrB,OAAS,GALvC,iBASgB,OAHTzE,EAAQ,CACZuY,KAAM7X,EAAQgvB,KAPjB,WASsBtvB,QAAKC,kBAAoBuE,EAAQ5E,GATvD,QAUY,OADPO,EATL,kBAUkBH,QAAKmuC,GAA6BhuC,GAVpD,QAWe,OADdA,EAVD,kBAWqBH,QAAKw/B,GAAUr/B,EAAU6sC,GAX9C,QAYC,OADM7tC,EAXP,kBAYOa,QAAKgvC,GAAsBv5B,EAAUm6B,EAASzwC,GAZrD,gCAcC,OAdD,WAcOa,QAAKgvC,GAAsBv5B,EAAUm6B,EAAS,IAdrD,WAgBI5C,EAhBJ,iBAiBC,OAjBD,WAiBO5sC,QAAI8b,gBAAyBk0B,IAjBpC,QAkBCI,GAAY,EAlBb,mCN9D8B,mCMkFtBnwC,EApBR,iBAqBD,OArBC,WAqBKD,QAAI8b,gBAAyBk0B,IArBlC,QAsBDI,GAAY,EAtBX,gEA2BA,SAAUxB,GAAqBv5B,EAAUuX,EAAOsC,GAAhD,iEACL,OADK,UACClvB,QAAIqwC,EAA8Bh7B,EAAUuX,EAAOsC,IADpD,wC,wCCrFkBpuB,I,YAORwvC,I,YAIAzQ,IAXF,SAAU/+B,KAAV,iEACb,OADa,UACPR,QAAI,EACRkb,QNR8B,8BMQe80B,KAC7C90B,QNRuB,uBMQeqkB,MAH3B,wCAOR,SAAUyQ,GAAV,gFACL,OADK,IAAuBpwC,QAAUmV,EAAjC,EAAiCA,SAAUwuB,EAA3C,EAA2CA,UAAW9kC,EAAtD,EAAsDA,MAAtD,UACCiB,QAAIuwC,YAAmBl7B,EAAUgY,wBAAwBwW,GAAY9kC,IADtE,wCAIA,SAAU8gC,GAAV,8EACL,OADK,IAAsB3/B,QAAUmV,EAAhC,EAAgCA,SAAUwuB,EAA1C,EAA0CA,UAA1C,UACC7jC,QAAIuwC,WAAkBl7B,EAAUgY,wBAAwBwW,KADzD,wC,qkBCfP,IAAM2M,GAAsB,GAAH,OAAMhvC,GAAN,iBAiBZivC,GAAgB,SAAAC,GAC3B,IAAMjyC,EAAO,IAAIkyC,SASjB,OARAlyC,EAAKmyC,OAAO,OAAQF,GAQbG,MAAML,GANQ,CACnB1wC,OAAQ,OACRgxC,YAAa,UACbp1B,KAAMjd,IAILqK,MAAK,SAAAtK,GAAQ,OAAIA,EAASuyC,WAGlBC,GAAiC,SAACC,EAAgBP,GAC7D,IAAMQ,EAAqBjN,IAAMgN,EAAgB,CAAC,KAAM,aAClDE,EAAWF,EAAeG,YAEhC,gBACKF,GADL,IAEEG,WAAYX,EAAKY,QACjBC,cAAeJ,EAASK,WAAW,SAAWd,EAAKY,QAAU,Q,wBChCxCxwC,I,YAMRm8B,IANF,SAAUn8B,KAAV,iEACb,OADa,UACPR,QAAI,EACRkb,QCV2B,2BDUQyhB,MAFxB,wCAMR,SAAUA,GAAV,oFAIoB,OAJM/8B,EAA1B,EAA0BA,QACxBmV,EAAyBnV,EAAzBmV,SAAUq7B,EAAexwC,EAAfwwC,KAAM9jB,EAAS1sB,EAAT0sB,MADlB,mBAI0BhtB,QAAK6wC,GAAeC,GAJ9C,YAIGO,EAJH,QAMgB9tB,QANhB,iBAOyB,OAPzB,UAO+BvjB,QAAKoxC,GAAgCC,EAAgBP,GAPpF,OAQD,OADMe,EAPL,kBAQKzxC,QAAIuwC,YAAmBl7B,EAAUgY,wBAAwBT,GAAQ6kB,IARtE,sCAUK,IAAI7e,MAAJ,iCAAoC8e,KAAKC,UAAUV,KAVxD,gCAcH,OAdG,qCAcGjxC,QAAIuwC,YAAmBl7B,EAAUuX,EAAO,CAAC9nB,GAAI,KAAM8sC,UAAWta,KAAKua,SAdtE,QAeH,OAfG,WAeG7xC,QAAIksB,cACR,0CACA,4CAFQ,OAfP,uDEdA,IAWM4lB,GAAkB,SAAC1tC,EAAQ2tC,GAAT,MAAsB,CACnD9xC,KAX+B,6BAY/BC,QAAS,CACPkE,SACA2tC,a,qkBCbJ,IAEMvxC,GAAkB,ODHS,8BCCT,SAACnB,EAAD,WAASa,QAAUkE,EAAnB,EAAmBA,OAAQ2tC,EAA3B,EAA2BA,QAA3B,UAAC,MAA6C1yC,GAA9C,UAAsD+E,EAAS2tC,OAMjFrxC,GAAe,GAEN,SAASspB,KAAsC,IAA9B3qB,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,ECZrC,IAAM2yC,GAAkC,SAAAC,GAAoB,OACjEA,EAAqBv2B,KAAKq2B,QAAQrzC,KAAI,SAAAwzB,GAAC,MAAK,CAACggB,SAAUhgB,EAAEggB,SAAUv1B,QAASuV,EAAEtwB,MAAO5C,IAAKkzB,EAAElzB,S,YCKrE8B,I,YAQR8/B,IARF,SAAU9/B,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QHR+B,+BGQSqgC,MAF7B,wCAMR,IAAMuR,GAAwB,SAAA9yC,GAAK,OAAIA,EAAMswB,SAASra,eAEtD,SAAUsrB,GAAV,kFAEgB,OAFa1gC,EAA7B,EAA6BA,QAC3BkE,EAAiBlE,EAAjBkE,OAAQy8B,EAAS3gC,EAAT2gC,MADV,UAEsBthC,QAAO4yC,IAF7B,iBAIa/tC,GAJb,iBAK0B,OAL1B,UAKgCxE,QACjCC,gBADqC,+BACKuE,GADL,OACcy8B,EAAQ,UAAH,OAAaA,GAAU,KAN9E,OAQmB,OAHhBoR,EALH,kBAQyBryC,QAAKoyC,GAAiCC,GAR/D,QAUH,OAFM38B,EARH,kBAUGtV,QAAIqF,GAAwBjB,EAAQkR,IAVvC,yCCdA,IAcM88B,GAAyB,SAACxlB,EAAOwT,GAAR,MAAyB,CAC7DngC,KAdsC,oCAetCC,QAAS,CACP0sB,QACAwT,iBAISiS,GAAgC,SAAAzlB,GAAK,MAAK,CACrD3sB,KArB8C,4CAsB9CC,QAAS,CACP0sB,W,wDCLa0lB,I,YAkBAC,I,YA+CAC,I,YAcAC,I,qkBA5FjB,IAKIC,GAAe,GAQZ,SAAUJ,GAAoBtzC,GAA9B,2FACc0zC,IADd,gDACMC,EADN,WAECD,GAAaC,GAAM3zC,MAAQA,EAF5B,yCAGM2zC,GAHN,6BAOU,OAPV,UAOgB/yC,QAAKC,gBAAkB,UAAWb,EAAK,CAACH,MAAO,CAnB7C,UAYlB,OAQW,OADVuF,EAPD,kBAQiBxE,QAAKC,iBAAmB,UAAWb,GARpD,eAQC2d,EARD,OASCi2B,EAAc1vC,IAAKkB,EAAQ,CAAC,QArBX,OAqBsC,UAC7DsuC,GAAe,SACVA,IADO,UAETE,EAAc,CAAC5zC,IAAKoF,EAAOpF,IAAK2d,aAZ9B,kBAeEi2B,GAfF,yCAkBA,SAAUL,GAAcnS,GAAxB,iFACgB,OADhB,UACsB9/B,QAAI8/B,EAAY1hC,KAAI,SAAAm0C,GAAU,OAAIA,EAAW3S,YADnE,OAGoB,OAFnB4S,EADD,iBAG0BlzC,QAAKstC,KAAO4F,GAHtC,OAKa,OAFZC,EAHD,iBAKmBzyC,QACtByyC,EAAiBvtC,QACf,SAAC2nC,EAAajM,GAAd,qBAAmCiM,GAAnC,KAAoDuF,GAAaxR,GAAgB,GAAK,CAACA,OACvF,KARC,aAKC8R,EALD,QAWS/uC,OAAS,GAXlB,iBAmBuB,OAPpBzE,EAAQ,CACZC,WAAY,OA3CO,OA4CGuzC,GAEtBn0C,MAAO,CA9CY,SA8BlB,WAmB6Be,QAAKC,kBAAoB,UAAWL,EAAO,CAACM,OAAQ,QAnBjF,QAoBc,OADXmzC,EAnBH,kBAoBoBrzC,QAAKC,kBAAoB2vB,sBAAsByjB,IApBnE,QAoBGvG,EApBH,OAsBHgG,GAAe,SACVA,IACCO,EAAkBztC,QACpB,SAACgG,EAAKzM,GAAN,UAAC,MAEMyM,GAFP,UAGKtI,IAAKnE,EAAO,CAAC,QA1DD,OA0D4B,UAAY,CACnDC,IAAKD,EAAMC,IACX2d,QAASzZ,IAAKwpC,EAAU,CAAC,UAAW3tC,EAAMC,WAGhD,KAjCD,iCAsCE0zC,IAtCF,yCAyCA,IAAMQ,GAAyB,SAAC9S,EAAa+S,GAAd,OACpC/S,EAAY1hC,KAAI,SAAAm0C,GAAU,gBACrBA,GADqB,IAExB3S,QAASiT,EAAUN,EAAW3S,eAG3B,SAAUsS,GAAmBtT,EAAMC,EAAUe,GAA7C,yEAUY,OATXzkB,EAAU,CACduT,YAAa,YACPkQ,EAAO,CAACA,QAAQ,IAChBC,EAAW,CAACA,YAAY,IACxBe,EAAU,CAACA,WAAW,IAE5BpgC,OAAQ,OAPL,UAUkBF,QAAKC,gBAxFJ,uBAwFyC4b,GAV5D,cAUCjd,EAVD,yBAWEA,EAASkd,KAAKjd,MAXhB,wCAcA,SAAUg0C,GAAWvS,EAASkT,GAA9B,qEACElT,EADF,gBAED,OAFC,UAEKtgC,QAAK0yC,GAAqBpS,EAAQlhC,KAFvC,8CAGDo0C,EAHC,8E,mBC9FkBtyC,I,YAMRuyC,IANF,SAAUvyC,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QFPqC,qCEOS8yC,MAFnC,wCAMR,SAAUA,GAAV,8FACL,OADK,IAAyBnzC,QAAU0sB,EAAnC,EAAmCA,MAAO0mB,EAA1C,EAA0CA,YAAaC,EAAvD,EAAuDA,aAAcH,EAArE,EAAqEA,eAArE,UACCpzC,QAAIqF,GAAsCunB,IAD3C,OAIW,OADTsS,EAAkBoU,EAAlBpU,KAAMC,EAAYmU,EAAZnU,SAHR,UAIiBv/B,QAAK6yC,GAAYc,EAAcH,GAJhD,OAKuB,OADtBlT,EAJD,iBAK6BtgC,QAAK4yC,GAAoBtT,EAAMC,EAAUe,GALtE,OAOa,OAFZsT,EALD,kBAOmB5zC,QAAK2yC,GAAeiB,GAPvC,QAQe,OADdL,EAPD,kBAQqBvzC,QAAKszC,GAAwBM,EAAqBL,GARvE,QAUL,OAFM/S,EARD,kBAUCpgC,QAAIqF,GAA+BunB,EAAOwT,IAV3C,yC,qkBCTA,IAkBD5/B,IAAe,aHnBmB,qCGCF,SAACnB,EAAD,WAASa,QAAU0sB,EAAnB,EAAmBA,MAAOwT,EAA1B,EAA0BA,YAA1B,UAAC,MAEhC/gC,GAF+B,UAGjCutB,EAAQ,CACPwT,oBAce,OHlB2B,6CGSH,SAAC/gC,EAAD,OAAmButB,EAAnB,EAAS1sB,QAAU0sB,MAAnB,UAAC,MAEvCvtB,GAFsC,UAGxCutB,EAAQ,CACP+Q,WAAW,QAKI,IAKfj9B,GAAe,GAEN,SAASspB,KAAsC,IAA9B3qB,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,E,qkBC3BrC,IAODmB,GAAkB,OCTe,oCDEF,SAACnB,EAAD,GAA4C,IAAzB0V,EAAyB,EAAnC7U,QAAU6U,mBACtD,gBACK1V,GADL,IAEE0V,0BAQErU,GAAe,CACnBqU,mBAAoB,MAGP,SAASiV,KAAsC,IAA9B3qB,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,EEnBrC,ICGDo0C,GAAsB,SAAChxC,EAAOoZ,GAAR,OAA0B,SAAA/c,GACpD2D,IACAoZ,EAAc7b,IAAIlB,KA2BpB,SAxBqB,SAAC,GAMhB,IALJ40C,EAKI,EALJA,UACA3mB,EAII,EAJJA,aACAlR,EAGI,EAHJA,cACApZ,EAEI,EAFJA,MACAuS,EACI,EADJA,WAEA,OAAO,mBAAC0+B,EAAD,CACLx+B,WAAY6X,EACZ1X,SAAU0X,EACVjD,KAAM,SACN6pB,gBAAiBF,GAAoBhxC,EAAOoZ,GAC5C7G,WAAYA,KCfhB,IAAMzQ,GAAoB,CACxByQ,WAAYgB,4BAGd,UAAexR,cAAQ,KAAMD,GAA7B,CAAgDqvC,I,gBCEvB9yC,I,YAMR09B,IANF,SAAU19B,GAAMguB,GAAhB,iEACb,OADa,UACPxuB,QAAI,EACRkb,QHb8B,8BGaQgjB,GAAkB1P,KAF7C,wCAMR,SAAU0P,GAAV,8FACiB,OADWqV,EAA5B,EAA4BA,UAA5B,IAAyC3zC,QAAUmV,EAAnD,EAAmDA,SAAUqnB,EAA7D,EAA6DA,UAA7D,UACuB98B,QAAKgc,MAD5B,OAEW,OADVC,EADD,iBAEiBjc,QAAK4rB,KAFtB,OAQL,OANMwkB,EAFD,OAGC8D,EAAkB,SAAC,GAAD,IAAErxC,EAAF,EAAEA,MAAF,OAAa,mBAAC,GAAD,CACnCsqB,aAAc2P,EAAU3P,aACxBlR,cAAeA,EACfpZ,MAAOA,EACPixC,UAAWG,KAPR,WAQC7zC,QAAI8b,UAAmBk0B,EAAStT,EAAU96B,MAAO,KAAMkyC,GAAiB,IARzE,QAUQ,OAVR,WAUc/3B,QAAKF,GAVnB,QAWW,OAXX,SAUE/W,EAVF,EAUEA,GAVF,WAWiBlF,QAAKC,iBAAmB68B,EAAU3P,aAAcjoB,GAXjE,QAYL,OADM6X,EAXD,kBAYC3c,QAAIqwC,EAA8Bh7B,EAAUqnB,EAAUzX,KAAM,CAACjmB,IAAK8F,EAAI6X,aAZvE,yCCwCyBnG,UAAgB,CAC9CgnB,iBAAkBhnB,aAAmBA,aArChC,I,ssBCIP,IAuCMjS,GAAoB,CACxBs5B,qBhC7DkC,SAACgG,EAAW3uB,EAAYuG,GAAxB,MAAqC,CACvExb,KALoC,kCAMpCC,QAAS,CACP2jC,YACA3uB,aACAuG,agCyDF2iB,Y9B/DyB,SAACh6B,EAAQU,GAAT,MAAiB,CAC1C7E,KAJ0B,wBAK1BC,QAAS,CACPkE,SACAU,Q8B4DFq5B,mB1B/DgC,SAAC9oB,EAAUqnB,EAAW39B,GAAtB,MAAiC,CACjEkB,KALkC,gCAMlCC,QAAS,CACPmV,WACAqnB,YACA39B,W0B2DFk+B,ehBlE4B,SAAC5nB,EAAUuX,EAAO8jB,GAAlB,MAA4B,CACxDzwC,KAH6B,2BAI7BC,QAAS,CACPmV,WACAq7B,OACA9jB,WgB8DF+S,iBAAkBA,EAClBE,WzB1DwB,SAACxqB,EAAUwuB,GAAX,MAA0B,CAClD5jC,KAZyB,uBAazBC,QAAS,CACPmV,WACAwuB,eyBuDFjD,kBfpE+B,SAACx8B,EAAQy8B,GAAT,MAAoB,CACnD5gC,KAJiC,+BAKjCC,QAAS,CACPkE,SACAy8B,WeiEFV,yBXpEsC,SAACvT,EAAO0mB,EAAaC,EAAcH,GAAnC,MAAuD,CAC7FnzC,KALuC,qCAMvCC,QAAS,CACP0sB,QACA0mB,cACAC,eACAH,oBW+DF5U,iBLtE8B,SAAC9B,EAAWrnB,GAAZ,MAA0B,CACxDpV,KAJgC,8BAKhCC,QAAS,CACPw8B,YACArnB,eK8EJ,MClFA,IACE+kB,WFqBwB,SAACl1B,EAAO4pB,GAChCruB,mBAA2ByE,EAAO,CAChCyqB,UAAUokB,QAAgB,CACxBvW,mBACAC,WACAnoB,iBACAwqB,aACA/qB,0BAIJ7P,EAAMm1B,eAAevC,IAAIkc,GACzB9uC,EAAMm1B,eAAevC,IAAImc,GACzB/uC,EAAMm1B,eAAevC,IAAIoc,GAAqBplB,GAC9C5pB,EAAMm1B,eAAevC,IAAIqc,IACzBjvC,EAAMm1B,eAAevC,IAAIsc,IACzBlvC,EAAMm1B,eAAevC,IAAIuc,IACzBnvC,EAAMm1B,eAAevC,IAAIwc,IACzBpvC,EAAMm1B,eAAevC,IAAIyc,GAAmBzlB,GAExCA,EAAO/Z,oBACT7P,EAAM6Y,SL5CkD,CAC1D9d,KAHqC,mCAIrCC,QAAS,CACP6U,mBKyCqC+Z,EAAO/Z,sBAG9C,IAAMy/B,EAAuBtxC,IAAK4rB,EAAQ,wBAAyB,MACtC,OAAzB0lB,GACFh6B,OAAOzC,KAAKy8B,GAAsBp3B,SAAQ,SAAAwP,GACxC1nB,EAAM6Y,SAAS4vB,EAAoB/gB,EAAO4nB,EAAqB5nB,IAAQ,QE/C3E6nB,mBDuEwBjwC,eA5CF,SACtBnF,EADsB,OAErBgwB,EAFqB,EAErBA,WAAYoO,EAFS,EAETA,SAAUqC,EAFD,EAECA,UAAWtC,EAFZ,EAEYA,iBAAkBloB,EAF9B,EAE8BA,cAAe0qB,EAF7C,EAE6CA,QAASnU,EAFtD,EAEsDA,OAAQ9W,EAF9D,EAE8DA,mBAF9D,UAAC,2BAInByoB,EAAmB,CAACA,iBAAkByG,IAAM5kC,EAAMswB,SAAS6N,iBAAiB/+B,KAAM++B,IAAqB,IACvGC,EAAW,CAACA,SAAUwG,IAAM5kC,EAAMswB,SAAS8N,SAASh/B,KAAMg/B,IAAa,IACvEnoB,EAAgB,CAACA,cAAe2uB,IAAM5kC,EAAMswB,SAASra,cAAeA,IAAkB,IACtFwqB,EAAY,CAACA,UAAWmE,IAAM5kC,EAAMswB,SAASmQ,UAAWA,IAAc,IACtEzQ,GAAchwB,EAAMguB,KAAKgC,EAAWha,UACpC,CAACga,WAAY4U,IAAM5kC,EAAMguB,KAAKgC,EAAWha,UAAUqU,OAAQ2F,EAAW0Q,SACtE,IACAC,GAAW3gC,EAAMguB,KAAK2S,EAAQ3qB,UAC9B,CAAC2qB,SAAS0U,QAAgB1U,EAAQ3qB,UAAxB,cAAkChW,GAAlC,YAA4C2gC,EAAQD,WAC9D,IACAlU,GAAUxsB,EAAMguB,KAAKxB,EAAOxW,UAC5B,CACEwW,OAAQjtB,KACN+1C,KACE1Q,KAAM2Q,QAAoB/oB,EAAOxW,SAA3Bu/B,CAAqCv1C,GAAQwsB,EAAOkU,QAC1DkE,KAAM4Q,QAAkBhpB,EAAOxW,SAAzBw/B,CAAmCx1C,GAAQwsB,EAAOkU,QACxDkE,KAAM6Q,QAAmBjpB,EAAOxW,SAA1By/B,CAAoCz1C,GAAQwsB,EAAOkU,UAE3D,SAACjhC,EAAQC,GAAT,UAAC,MAAuBD,GAAWC,KAAS,OAEhD,MACAgW,GAAsB1V,EAAMswB,SAAS5a,mBACrC,CAACA,mBAAoB1V,EAAMswB,SAAS5a,mBAAmBA,oBACvD,IA3BkB,IA6BtBF,YAAa3R,IAAK7D,EAAO,gCAiBzBkF,GACA,KACA,CACEwwC,mBAAoB3M,MALE5jC,EAOxBuD,UA1De,SAAApF,GAAK,OACpB,mBAAC,cAAD,KAAiB2B,kBAAmB3B,EAAMoI,SAAU,CAAC4kB,SAAUhtB,W,8CErBjE,SACEqyC,aCN0B,4BDO1Bzc,YCLyB,SAAA9yB,GAAK,MAAK,CACnCxF,KAH0B,4BAI1BC,QAAS,CACPuF,a,0XCkBSwvC,EAAoB,SAAAv/B,GAAc,MAAK,CAClDzV,KAtBkC,kCAuBlCC,QAAS,CACPwV,oBCzBEw/B,EAAkB,CACtBC,KAAM,OACN3qB,OAAQ,SACR4qB,MAAO,QACPC,MAAO,SAG8B7+B,UAAgBgE,OAAOkP,OAAOwrB,IAErE,U,ukBCLA,IASM10C,GAAe,WFdU,6BEeFC,0BAAkC,gBAD1C,MFXU,6BEaFA,0BAAkC,eAF1C,MFRQ,2BEWFA,0BAAkC,aAHxC,MFZe,mCEGV,SAACpB,EAAD,GAAsB,IACvBi2C,EADuB,EAAbp1C,QAC1BwV,eAEDA,EAAiB8E,OAAOkP,OAAOwrB,GAAiB/wC,MAAK,SAAAoxC,GAAK,OAAIA,IAAUD,MACzEJ,QAEL,cAAW71C,GAAX,IAAkBqW,sBAGC,MFTmB,sCEcFjV,0BAAkC,uBALnD,MFVK,wBEgBFA,0BAAkC,WANrC,MFLoB,uCEYFA,0BAAkC,wBAPpD,MFJkC,qDEYFA,0BAAkC,wBARlE,GAWfC,EAAe,CACnB80C,aAAa,EACbtgC,WAAY,GACZG,SAAU,GACVK,eAAgBw/B,QAChBv/B,mBAAoB,MACpB0U,OAAQ,KACRorB,qBAAqB,GC5BvB,QD+Be,WAA+C,IAA9Bp2C,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,mCEG/Bq2C,EAAa,iBAAO,CAC/Bz1C,KAzCwB,oBAoDb01C,EAAc,SAAA51C,GAAQ,MAAK,CACtCE,KAnD0B,oBAoD1BC,QAAS,CACPH,cAIS61C,EAAqB,SAACC,EAAM91C,GAAP,MAAqB,CACrDE,KAlDmC,6BAmDnCC,QAAS,CACP21C,OACA91C,cAQS+1C,EAAiB,SAAAC,GAAW,MAAK,CAC5C91C,KA/D8B,wBAgE9BC,QAAS,CACP61C,iBAISC,EAAoB,SAAA1hB,GAAc,MAAK,CAClDr0B,KA5EiC,2BA6EjCC,QAAS,CACPo0B,oBAWS2hB,EAAa,SAAA9hB,GAAO,MAAK,CACpCl0B,KAxFyB,mBAyFzBC,QAAS,CACPi0B,aAkBS+hB,EAAiB,SAAAC,GAAW,MAAK,CAC5Cl2C,KA1G8B,wBA2G9BC,QAAS,CACPi2C,iBAISC,GAAgB,SAAAC,GAAU,MAAK,CAC1Cp2C,KA7G6B,uBA8G7BC,QAAS,CACPm2C,gBAWSC,GAAU,iBAAO,CAC5Br2C,KAzHqB,iBAsKVs2C,GAAc,SAAAprB,GAAQ,MAAK,CACtClrB,KA/J0B,oBAgK1BC,QAAS,CACPirB,cAISqrB,GAAoB,SAAAC,GAAc,MAAK,CAClDx2C,KArKiC,2BAsKjCC,QAAS,CACPu2C,oBAISC,GAAkB,SAAAjY,GAAY,MAAK,CAC9Cx+B,KA3K8B,wBA4K9BC,QAAS,CACPu+B,kBAkBSkY,GAAc,SAAC12C,EAAM6E,EAAI4kB,GAAX,MAAuB,CAChDzpB,KA7L2B,qBA8L3BC,QAAS,CACPD,OACA6E,KACA4kB,YAISktB,GAAmB,SAACtuB,EAAYC,GAAb,MAA4B,CAC1DtoB,KArMgC,0BAsMhCC,QAAS,CACPooB,aACAC,eAyDSsuB,GAAiB,SAAAtuB,GAAS,MAAK,CAC1CtoB,KAzP6B,uBA0P7BC,QAAS,CACPqoB,eAISuuB,GAA4B,SAAAC,GAAsB,MAAK,CAClE92C,KA/P0C,oCAgQ1CC,QAAS,CACP62C,4BCjRSC,GAAiB,eAACxB,IAAD,+DAAyB,CACrDv1C,KAvB6B,6BAwB7BC,QAAS,CACPs1C,iBAISE,GAAa,iBAAO,CAC/Bz1C,KA7BwB,0BAgCb+1C,GAAoB,SAAA1hB,GAAc,MAAK,CAClDr0B,KAhCiC,iCAiCjCC,QAAS,CACPo0B,oBAIS2iB,GAAgB,iBAAO,CAClCh3C,KAtC4B,8BAkEjBi3C,GAAmB,iBAAO,CACrCj3C,KA7DgC,kCAuErBk3C,GAAoB,SAAAC,GAAc,MAAK,CAClDn3C,KArEkC,kCAsElCC,QAAS,CACPk3C,oBAISC,GAAmB,SAAA/hC,GAAa,MAAK,CAChDrV,KA3EgC,gCA4EhCC,QAAS,CACPoV,mBAISgiC,GAAwB,SAACC,EAAgB53C,EAAQ63C,GAAzB,MAAwC,CAC3Ev3C,KAjFsC,sCAkFtCC,QAAS,CACPq3C,iBACA53C,SACA63C,eCvFSC,GAAkB,iBAAO,CACpCx3C,KAb8B,iCAuBnBy3C,GAAe,SAAAC,GAAS,MAAK,CACxC13C,KAvB2B,4BAwB3BC,QAAS,CACPy3C,eAoBSC,GAAa,SAAA//B,GAAO,MAAK,CACpC5X,KA3CyB,0BA4CzBC,QAAS,CACP2X,aAYSggC,GAAe,iBAAO,CACjC53C,KAxD2B,4BAyD3BC,QAAS,K,YCrDcY,I,YASR40C,I,YAiBAoC,I,YAQArC,IAlCF,SAAU30C,KAAV,iEACb,OADa,UACPR,QAAI,EACRV,QAAK81C,KACLn1C,QPLuB,yBOKSu3C,KAChCv3C,QPPsB,wBOOSm1C,IAAY,IAC3Cn1C,QPNqC,uCOMSk1C,MALnC,wCASR,SAAUC,KAAV,0IAEH,OAFG,UAEG35B,QAAK5W,6BAFR,OAIL,OAJK,UAICnF,QHiByB,CAC/BC,KAzCwB,oBGmBnB,OAKL,OALK,UAKCD,QDZ8B,CACpCC,KAb8B,iCCmBzB,OAML,OANK,WAMCD,QFIyB,CAC/BC,KA7BwB,0BEkBnB,QAOL,OAPK,WAOCK,QAAI,EACRyb,QHO2B,yBGN3BA,QF5B2B,+BE6B3BA,QDnBkC,wCCS/B,QAYL,OAZK,WAYC/b,QHiN4B,CAClCC,KAnN4B,wBGXvB,QAaL,OAbK,WAaC8b,QH3BmB,oBGcpB,QAcL,OAdK,WAcC/b,QFO4B,CAClCC,KAtC4B,8BEgBvB,yCAiBA,SAAU63C,KAAV,iEACL,OADK,UACC93C,QFRyB,CAC/BC,KA7BwB,0BEmCnB,OAEL,OAFK,UAECK,QAAI,EACRyb,QFvC2B,gCEoCxB,OAKL,OALK,UAKC/b,QFD4B,CAClCC,KAtC4B,8BEiCvB,wCAQA,SAAUw1C,GAAV,0EACL,OAD8CA,EAAzC,EAA+Bv1C,QAAUu1C,oBAAzC,UACCz1C,QAAIK,sBAAiC,8BAA+B,CAAC03C,UAAWtC,KADjF,wC,wnBCvCP,IAyBMuC,GAAc,SAAAja,GAAK,MAAc,QAAVA,EAAkB,OAAS,OAsBlDv9B,IAAe,aJlDO,oBImDFC,0BAAkC,aADvC,OJjDc,2BImDFA,0BAAkC,mBAF9C,OJhDW,wBImDFA,0BAAkC,gBAH3C,OJ9CI,iBIkDFA,0BAAkC,UAJpC,OJ7CI,iBIkDFA,0BAAkC,UALpC,OJ5CW,wBIkDFA,0BAAkC,gBAN3C,OJ/CM,mBIsDFA,0BAAkC,YAPtC,OJvBkB,gCIET,SAACpB,EAAD,GAAoC,QAA3Ba,QAAU0sB,EAAiB,EAAjBA,MAC/C,GADgE,EAAVwO,IAU/C,CACL,IAAMpa,EAAW3hB,EAAM80B,QAAQ1nB,QAAO,SAAA0kB,GAAC,OAAIA,EAAEvE,QAAUA,KACjDmR,EAAQ/c,EAAS/c,OAAS,EAAI+zC,GAAYh3B,EAAS,GAAG+c,OAd3C,MAgBjB,gBACK1+B,GADL,IAEE80B,QAAS,GAAF,YAAM90B,EAAM80B,QAAQ1nB,QAAO,SAAA0kB,GAAC,OAAIA,EAAEvE,QAAUA,MAA5C,CAAoD,CAACA,QAAOmR,aAdrE,IAAMka,EAAiB54C,EAAM80B,QACvB4J,EAASka,EAAeh0C,OAAS,GAAKg0C,EAAe,GAAGrrB,QAAUA,EACpEorB,GAAYC,EAAe,GAAGla,OANjB,MAQjB,gBACK1+B,GADL,IAEE80B,QAAS,CAAC,CAACvH,QAAOmR,eAaH,OJ3CW,wBIoDFt9B,0BAAkC,gBAT3C,OJ1CgB,8BILZ,SAACpB,EAAD,OAASa,EAAT,EAASA,QAAT,UAAC,MACrBb,GADoB,IAEvB64C,YAAa,SACR74C,EAAM64C,aADA,UAERh4C,EAAQ21C,KAAO31C,EAAQH,gBA2CP,OJzBQ,sBIdT,SAACV,EAAD,WAASa,QAAUD,EAAnB,EAAmBA,KAAM6E,EAAzB,EAAyBA,GAAI4kB,EAA7B,EAA6BA,OAA7B,UAAC,MAChBrqB,GADe,IAElB84C,SAAU,SACL94C,EAAM84C,UADH,UAELl4C,EAFK,SAGDZ,EAAM84C,SAASl4C,IAHd,UAIH6E,EAJG,SAIM5B,KAAK7D,EAAO,CAAC,WAAYY,EAAM6E,GAAK,KAAQ4kB,YAiCvC,OJzCa,6BIaT,SAAArqB,GAAK,gBACzBA,GADyB,IAE5B64C,YAAa,QA0BM,OJxCU,uBIqDFz3C,0BAAkC,eAb1C,OJrCe,uBImDFA,0BAAkC,mBAd/C,OJpCa,0BImDFA,0BAAkC,kBAf7C,OJhCc,2BIgDFA,0BAAkC,mBAhB9C,OJ/Ba,0BIgDFA,0BAAkC,kBAjB7C,OJ9BO,oBIgDFA,0BAAkC,aAlBvC,OJ7Bc,2BIgDFA,0BAAkC,mBAnB9C,OJ5BW,wBIgDFA,0BAAkC,iBApB3C,OJ1BQ,qBI+CFA,0BAAkC,aArBxC,OJjBO,oBIuCFA,0BAAkC,aAtBvC,OJrBQ,qBI4CFA,0BAAkC,aAvBxC,OJpBS,sBI4CFA,0BAAkC,cAxBzC,OJnBmB,gCI4CFA,0BAAkC,uBAzBnD,OJduB,oCIwCFA,0BAAkC,2BA1BvD,IA6BfC,GAAe,CACnBmU,YAAa,GACb9U,SAAU,GACVqV,MAAO,GACPD,MAAO,OACPghC,YAAa,EACbhiB,QAAS,GACTG,eAAgB,KAChByhB,YAAa,KACbmC,YAAa,GACb7B,YAAY,EACZlH,gBAAgB,EAChB75B,cAAe,GACfipB,kBAAkB,EAClB6Z,gBAAgB,EAChBC,eAAe,EACftiC,UAAU,EACVF,UAAU,EACVsiC,SAAU,GACVhtB,SAAU,KACVsrB,eAAgB,KAChBhY,aAAc,KACd6Z,SAAU,KACVC,UAAW,KACXC,mBAAoB,MCrGtB,SDwGe,WAA+C,IAA9Bn5C,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,wsBE3G5C,IAAMo5C,GAAiB,SAAA55B,GAAC,OACtB/G,MAAM4W,QAAQ7P,GAAKA,EAAEngB,KAAI,SAAAuS,GAAC,OAAIA,EAAEihC,YAAY,CAACrzB,EAAEqzB,WAEpCwG,GAAgC,SAACC,GAAD,IAAmBC,EAAnB,uDAAgC,GAAhC,OAC3Ch6C,KAAQ+5C,GAAkB,SAACntC,EAAKzM,EAAOkmB,GACrC,IAAM4zB,EAAW,GACjB,GAAa,iBAAT5zB,EACElmB,IACF85C,EAAS9G,QAAU0G,GAAe15C,QAE/B,CACL,IAAMyiC,EAAYoX,EAAW3zB,GACvB6zB,EAAMC,YAAkB9zB,EAAMlmB,EAAOyiC,GAC3CqX,EAASC,IAAM,eAAKttC,EAAIstC,IAAM,CAACttC,EAAIstC,KAAO,IAA3B,CAAgCA,IAAKrsC,OAAOD,SAASlK,KAAK,SAG3E,gBAAWkJ,GAAQqtC,KAClB,KCVQG,GAAe,SAAAzwB,GAAS,MAAK,CACxCtoB,KAV2B,qBAW3BC,QAAS,CACPqoB,eAIS6mB,GAAiB,SAACr3B,EAAMkhC,GAAP,MAAuB,CACnDh5C,KAlB8B,qBAmB9BC,QAAS,CACP6X,OACAkhC,gBAeSC,GAAyB,SAAAC,GAAmB,MAAK,CAC5Dl5C,KAjCuC,sCAkCvCC,QAAS,CACPi5C,yBAISC,GAAW,SAAA55C,GAAK,MAAK,CAChCS,KAvCuB,sBAwCvBC,QAAS,CACPV,W,yTC3CG,IAAMkD,IAAe1E,SAAOgP,KAAPhP,CAAH,KAETC,WAAY,I,4dCFrB,IAAMo7C,GAAsBr7C,UAAH,KAC5B0E,MAYSyD,GAAanI,WAAH,M,YCNvB,SAPyB,SAAC,GAAD,IAAEe,EAAF,EAAEA,MAAOgM,EAAT,EAASA,SAAT,OAAuBzG,iBAAmByG,EAAU,CAAChM,W,qkBCD9E,IAAMu6C,GAAuB,SAACv6C,EAAOo5C,GACnC,OAAKp5C,EAIEA,EAAML,KAAI,SAAAK,GACf,IAAM4d,EAAUzZ,KAAKi1C,EAAU,CAAC,kBAAmBp5C,EAAMkwB,MAAOlwB,EAAMC,KAAM,IAC5E,gBAAWD,GAAX,IAAkB4d,eALX5d,GASLw6C,GAAwB,SAACx6C,EAAOo5C,GACpC,IAAKp5C,EACH,OAAOA,EAET,IAAM4d,EAAUzZ,KAAKi1C,EAAU,CAAC,kBAAmBp5C,EAAMkwB,MAAOlwB,EAAMC,KAAM,IAC5E,gBAAWD,GAAX,IAAkB4d,aAOd68B,GAAe,CACnB,mBAAoBF,GACpB,qBAAsBA,GACtB,oBAAqBC,GACrB,sBAAuBA,GACvB,kBAT+B,SAACx6C,EAAOo5C,EAAUr1B,GAAlB,OAC/B5f,KAAKi1C,EAAU,CAAC,qBAAsBr1B,EAAKzN,SAAUyN,EAAK9jB,IAAK8jB,EAAKmC,MAAO,MCH7E,MCjBA,IDiBezgB,eAZS,SAACnF,EAAOsD,GAC9B,IDyBgC5D,EAAOkB,EAAMk4C,EAAUr1B,EACjD22B,EC1BAC,EAAQ,CACZz0B,KAAMtiB,EAAMsiB,KACZ5P,SAAUhW,EAAMk0B,WAAWle,SAC3BrW,IAAK2D,EAAMiS,WAGb,MAAO,CACL7V,ODkB8BA,EClBL4D,EAAM5D,MDkBMkB,EClBC0C,EAAM1C,KDkBDk4C,EClBO94C,EAAMg0B,KAAK8kB,SDkBRr1B,EClBkB42B,EDmBnED,EAAcD,GAAav5C,GAE5Bw5C,EAIEA,EAAY16C,EAAOo5C,EAAUr1B,GAH3B/jB,MChCe,GAc1B,CAA2D46C,I,OEVtB,kBAACljC,GAAA,QAAD,WAAxBkvB,GAAiB,sBAExBJ,GAAa,CAAC,mBAAoB,sBAwBxC,IAAMqU,GAAwB,SAAC,GAMzB,IALJ76C,EAKI,EALJA,MACAkB,EAII,EAJJA,KACA0vB,EAGI,EAHJA,SAEA+M,GACI,EAFJp9B,KAEI,EADJo9B,WAEMmd,EAAa,CACjB9sB,aAAchuB,GAAS0f,gBAAc1f,GAAOkwB,OAGxC6W,GAAQx1B,cAAQ,kBAAMsc,aAAc,OAAQ3sB,KAAO,IAEzD,OACE,kBAAC,GAAD,CAAkBlB,MAAOA,EAAOkB,KAAMA,GACpC,kBAAC6lC,EAAD,CACE7lC,KAAMA,EACNy8B,UAAWA,EACXmd,WAAYA,EACZ96C,MAAOA,EACP4wB,SAAUA,EACVlpB,YAAY,MChDpB,kBAAgBmmB,EAAOxoB,EAAQimB,EAAQ/qB,GAAS,IACvCmqB,EAAiBmD,EAAjBnD,cAEP,OAAIpkB,aAAiBokB,GACZqwB,GAAUltB,EAAOxoB,EAAQimB,GACvBZ,IAAkB4D,0BDA/B,SAAgBqa,EAAiBtjC,EAAQ9E,GAAS,IAE9CwF,EAGE4iC,EAHF5iC,GACAmgB,EAEEyiB,EAFFziB,KACA4H,EACE6a,EADF7a,SAEIktB,EAAcxU,GAAWl5B,SAASwgB,GAClCmtB,EAAY51C,EAAO6gB,GAEnBg1B,IADUF,GAAejiC,MAAM4W,QAAQsrB,GAAaA,EAAY,CAACA,IACtCt7C,KAAI,SAACmgB,EAAGxa,GAAJ,OACnC,kBAACsrB,EAAA,oBAAD,CAA4B3wB,IAAG,4BAAuBoF,EAAO81C,MAA9B,YAAuCj1B,EAAvC,YAA+C5gB,GAAO0Q,oBAAoB,GACvG,kBAAC6kC,GAAD,CAAuB35C,KAAM4sB,EAAU9tB,MAAO8f,EAAGvf,KAAMA,EAAMo9B,UAAWgL,QAE1EliC,QAAO,SAACugC,EAAMC,EAAM3hC,GAAb,MAAqB,CAAC0hC,EAAM,kBAACJ,GAAD,CAAgB3mC,IAAK,MAAQqF,IAAQ2hC,MAE1E,OACE,kBAAC7/B,GAAD,CAAYnH,IAAK8F,GACdm1C,GChBIE,CAAavtB,EAAOxoB,EAAQ9E,GAC1BmqB,IAAkB4D,4BACpB+sB,GAAqBxtB,EAAOxoB,QAD9B,GAKT,IAAMg2C,GAAuB,SAACxtB,EAAOxoB,GAAR,OAC3B,kBAAC,GAAD,CACApF,IAAK,UAAY4tB,EAAM9nB,GACrBmgB,KAAM2H,EAAM9nB,GACZ8P,UAAWxQ,EAAO81C,MAClBj6C,KAAM,oBACNlB,MAAO,MAEP,kBAAC2V,GAAA,EAAD,CAAgBzU,KAAK,OAAOwG,YAAY,EAAO1H,MAAOqF,EAAOwoB,EAAM9nB,QAGjEg1C,GAAY,SAACltB,EAAOxoB,EAAQimB,GAAhB,OAChB,kBAACgvB,GAAD,CACCr6C,IAAK,UAAY4tB,EAAM9nB,GACvBxB,QAAS,SAAA2N,GACPA,EAAE4oB,oBAGH,kBAACx0B,EAAA,SAAD,CACErG,IAAK,cAAgB4tB,EAAM9nB,GAC3BwjB,WAAYsE,EACZrE,UAAWljB,6BAAiCjB,EAAOqrB,QAASrrB,EAAO81C,OACnE7vB,OAAQA,M,qkBCpCP,IC+BCgwB,GD/BKC,GAAW,SAAAhmB,GAAc,OACpCA,EAAevpB,SAAS5G,MAAK,SAAA6G,GAAK,OAAIA,EAAMye,gBAAkB4D,8BAKnDktB,GAAa,SAAAjmB,GACxB,IAAMkmB,EAAQF,GAAShmB,GACvB,OAAOkmB,EAAMrmB,QAAUqmB,EAAMrmB,QAAU,IAG5BsmB,GAAgB,SAAAnmB,GAE3B,OAA4B,IADdgmB,GAAShmB,GACVomB,YAGFC,GAAe,SAAArmB,GAE1B,OAA2B,IADbgmB,GAAShmB,GACVsmB,WAGFC,GAA4B,SAAAvmB,GAAc,OACX,IAA1CA,EAAeyiB,wBAEJ+D,GAAc,SAAAxmB,GAEzB,OADcgmB,GAAShmB,GACVnJ,UAAY,MAGd4vB,GAAoB,SAAAzmB,GAE/B,OADcgmB,GAAShmB,GACVmiB,gBAAkB,MAGpBuE,GAAkB,SAAA1mB,GAE7B,OADcgmB,GAAShmB,GACVmK,cAAgB,MAGzBwc,GAAqB,SAAAjwC,GAAK,OAAKA,EAAMgiB,QAErCkuB,GAAuB,SAACniC,EAAQob,GACpC,IAAM9vB,EAAM8vB,GAAWA,EAAQ7iB,WAAU,SAAA6f,GAAC,OAAIA,EAAEvE,QAAU7T,EAAOjU,MACjE,OAAOT,GAAO,EACV,CACE82C,SAAU92C,EAAM,EAChB05B,MAAO5J,EAAQ9vB,GAAK05B,OAEtB,MAGAqd,GAAoB,CAAC,UAAW,UAAW,SAAU,UAAW,WAAY,OAAQ,YAAa,cACrG,UAAW,SAAU,UAAW,WAKrBC,GAAsB,SAAC,GAAD,IACjCb,EADiC,EACjCA,MACArmB,EAFiC,EAEjCA,QAFiC,IAGjCte,gBAHiC,SAIjCwU,EAJiC,EAIjCA,OACA/qB,EALiC,EAKjCA,KALiC,IAMjCg8C,gCANiC,MAMN,GANM,MAOjCC,qBAPiC,MAOjB,GAPiB,SAU9Bf,EAAMzvC,SACR0B,QAAO,SAAAsM,GAAM,OAAIyB,OAAOqD,UAAUC,eAAele,KAAK07C,EAA0BviC,EAAOjU,IACpFw2C,EAAyBviC,EAAOjU,KAC/BiU,EAAOiU,UACXvgB,QAAO,SAAAsM,GAAM,OAAKsR,GAAqC,IAA3BtR,EAAOhO,SAAS9G,QAAgB8U,EAAOhO,SAAS,GAAGka,OAASoF,EAAOmxB,uBAC/F/uC,QAAO,SAAAsM,GAAM,OAAIA,EAAOhO,SAAS0B,OAAOwuC,IAAoBh3C,OAAS,KACrEvF,KAAI,SAAAyZ,GAAC,MACJ,CACErT,GAAIqT,EAAErT,GACNlD,MAAOuW,EAAEvW,MACTuyB,QAAS,IACPte,SAAUA,GAAYsC,EAAEtC,UACrBqlC,GAAqB/iC,EAAGgc,IAE7BsnB,gBAAiBtjC,EAAEsjC,kBAAmB,EACtC1wC,SAAUoN,EAAEpN,SAAS0B,OAAOwuC,IAC5B94C,WAAYgW,EAAEujC,WACdC,cA9BiB5iC,EA8BYZ,EA7BjCY,EAAOhO,UAAuC,IAA3BgO,EAAOhO,SAAS9G,QAAgBm3C,GAAkB/uC,SAAS0M,EAAOhO,SAAS,GAAG8hB,WA8B7F+uB,aAAc,gBAAEC,EAAF,EAAEA,QAAS9iC,EAAX,EAAWA,OAAX,OACZZ,EAAE2jC,gBAAkBP,EAAcpjC,EAAE2jC,gBAChCP,EAAcpjC,EAAE2jC,gBAAgBD,EAAS9iC,GAAQ,SAAA/N,GAAK,OAAI+wC,GAAa/wC,EAAO6wC,EAASxxB,EAAQ/qB,MAC/FyZ,EAAOhO,SAASrM,KAAI,SAAAsM,GAAK,OAAI+wC,GAAa/wC,EAAO6wC,EAASxxB,EAAQ/qB,QAlCvD,IAAAyZ,MAsCVijC,GAAY,SAAC1nB,EAAgBgnB,GACxC,IAAMW,EAAiB,GACjBC,EAA0B,GAG1Bnc,EAFUsb,GAAoB,CAACb,MAAOF,GAAShmB,GAAiBgnB,6BAE/C91C,QAAO,SAAC2nC,EAAaz8B,GAAd,qBAEvBy8B,GAFuB,KAGvBz8B,EAAQ3F,SACR0B,QAAO,SAAAzB,GAAK,OAAK3F,aAAiB2F,EAAMye,kBACxC/qB,KAAI,SAAAsM,GACH,GAAIwkB,iCAAgCxkB,EAAM6hB,UACxCovB,EAAe/zB,KAAKld,EAAMia,WACrB,GAA4B,YAAxBja,EAAMye,cAEf,OADAyyB,EAAwBh0B,KAAKld,EAAMlG,IAC5B,KAGT,OAAOkG,EAAMia,QACZxY,QAAO,SAAAylB,GAAC,OAAIA,SAClB,IAEH,MAAO,CAACrzB,MAAOquC,KAAMnN,GAASkc,iBAAgBC,4BAGnCC,GAAmB,SAAA7nB,GAAc,OAC5C8nB,GAAe9nB,IAEX8nB,GAAiB,SAAjBA,EAAiBC,GACrB,MAA2B,cAAvBA,EAAK5yB,cACA4yB,EAAKtxC,SAASvF,QAAO,SAACgG,EAAKzM,GAAN,UAAC,MAAoByM,GAArB,UAA2BzM,EAAMkmB,MAAQlmB,EAAM+F,GAAK/F,EAAM8tB,aAAY,IACzFwvB,EAAKtxC,SACPsxC,EAAKtxC,SAASvF,QAAO,SAACgG,EAAKzM,GAAN,UAAC,MACxByM,GACA4wC,EAAer9C,MAChB,SAJC,GAaIu9C,GAAwB,SAAxBA,EAAyBC,EAAaC,GACjD,GAAkC,cAA9BD,EAAY9yB,cAA+B,CAC7C,IAAMgzB,EAAsBF,EAAYxxC,SAAS2xC,MAAK,SAAA1xC,GAAK,OAAIA,EAAMia,OAASu3B,KAE9E,mBACKD,GACCE,GAAuB,CAACxvB,UAAU,IAFxC,IAGEliB,SAAUwxC,EAAYxxC,SAASrM,KAAI,SAAAsM,GAAK,OACtCA,EAAMia,OAASu3B,EAAf,SACQxxC,GADR,IACe6hB,SAAU,sBACrB7hB,OAGV,OAAIuxC,EAAYxxC,SACd,SACKwxC,GADL,IAEExxC,SAAUwxC,EAAYxxC,SAASrM,KAAI,SAAAsM,GAAK,OAAIsxC,EAAsBtxC,EAAOwxC,QAItED,GAGII,GAAkB,SAACroB,GAAD,IAAiBgnB,EAAjB,uDAA4C,GAAIjxB,EAAhD,8CAC7BiwB,GAAShmB,GACNvpB,SACA0B,QAAO,SAAAsM,GAAM,OAAKsR,GAAqC,IAA3BtR,EAAOhO,SAAS9G,QAAgB8U,EAAOhO,SAAS,GAAGka,OAASoF,EAAOmxB,uBAC/F98C,KAAI,SAAAqa,GAAM,gBACNA,GADM,IAETiU,OAAQxS,OAAOqD,UAAUC,eAAele,KAAK07C,EAA0BviC,EAAOjU,KACzEw2C,EAAyBviC,EAAOjU,IACjCiU,EAAOiU,a,sBCxKJ4vB,GAAuB,SAAClzB,EAAQ4K,GAC3C,IAAMzI,EAAS,GAiBf,OAfA+X,KAAQla,GAAQ,SAAC3qB,EAAO8kC,GACtB,IAAI6D,EAAkBmV,GAAqBC,IAAIjZ,GAM/C,GALK6D,IACHA,EAAkBqV,GAAmB1vB,4BAA4BwW,GAAYvP,GAC7EuoB,GAAqBzhB,IAAIyI,EAAW6D,IAGlCA,EAAiB,CACnB,IAAM3E,EAAcia,GAAcj+C,EAAO2oC,GACrC3E,IACFlX,EAAOgY,GAAad,OAKnBlX,GAGHmxB,GAAgB,SAACj+C,EAAOupB,GAC5B,IAAMroB,EAAOqoB,EAAWuE,SAClBowB,EAAgBC,GAAej9C,GAErC,OAAIg9C,EACKA,EAAcl+C,GAEhB,MAGH89C,IACExC,GAAkB,GAOjB,CACLjf,IANiB,SAACnwB,EAAMqd,GACxB+xB,GAAgBpvC,GAAQqd,GAMxBw0B,IAJmB,SAAA7xC,GAAI,OAAIovC,GAAgBpvC,MAQzC8xC,GAAqB,SAArBA,EAAsBlZ,EAAW6D,GACrC,GAAIA,EAAgB5iC,KAAO++B,EACzB,OAAO6D,EAAgB38B,SAAS,GAGlC,IAAIjM,EAAS,KAUb,OATI4oC,EAAgB38B,UAClB28B,EAAgB38B,SAASqS,SAAQ,SAAApS,GAC/B,IAAM08B,EAAkBqV,EAAmBlZ,EAAW74B,GAClD08B,IACF5oC,EAAS4oC,MAKR5oC,GAGHo+C,GAAiB,CACrB,OAAU,SAAAn+C,GAER,GAAIA,EAAMkF,OAAS,GAAKlF,EAAMkF,OADZ,EAEhB,MAAO,CACL0lC,UAAW,CACT,kBAAC,KAAD,CACE3qC,IAAI,YACJ8F,GAAG,mDACH4kB,OAAQ,CAACigB,UAPC,QAapB,kBAAmB,SAAA5qC,GAEjB,GAAIA,EAAMkF,OAAS,GAAKlF,EAAMkF,OADZ,EAEhB,MAAO,CACL0lC,UAAW,CACT,kBAAC,KAAD,CACE3qC,IAAI,YACJ8F,GAAG,mDACH4kB,OAAQ,CAACigB,UAPC,S,uhCC/Ef,IAAMlwB,GAAWzb,SAAH,KAELC,YAAa,IACXA,YAAa,IAI3Byb,OAKSC,GAAiB3b,YAAH,KAETC,YAAa,IAOlBub,GAAsBxb,UAAH,KAGfC,WAAY,GACPE,WAAY,SAI9BuE,MAKSy6C,GAAWn/C,WAAH,KACVG,WAAY,SAIVi/C,IAAap/C,SAAOq/C,MAAPr/C,CAAH,MACL,gBAAEs/C,EAAF,EAAEA,cAAen/C,EAAjB,EAAiBA,MAAjB,OAA4Bm/C,EAAgB,aAAH,OAAgBn/C,EAAMyhB,OAAOlT,WAAc,UAClG,gBAAEuK,EAAF,EAAEA,UAAW9Y,EAAb,EAAaA,MAAb,OAAwB8Y,GAAa,4CAAJ,QAEXsmC,SAAQ,IAAMp/C,EAAMyhB,OAAOjT,gBAFhB,iF,qkBCkCrC,SAnEqB,SAAC,GAA6C,IAA5CkN,EAA4C,EAA5CA,KAAM2jC,EAAsC,EAAtCA,WAAYC,EAA0B,EAA1BA,eAAgBn+C,EAAU,EAAVA,KAAU,GACnC0H,cAASy2C,GAD0B,YAC1D5lC,EAD0D,KACjD+/B,EADiD,QAE7B5wC,cAAS,MAFoB,YAE1Dk3B,EAF0D,KAE9Cwf,EAF8C,OAenC3pC,aAZD,SAACyE,EAAmBlB,GAC/C,GAAIkB,IAAsBlB,EAAmB,CAC3C,IAAMqmC,EAAwB9lC,EAAQ1T,MAAK,SAAAgU,GAAC,OAAIA,EAAErT,KAAO0T,KACzDo/B,GAAW,SAAAgG,GAAI,OAAIA,EAChBnxC,QAAO,SAAA0L,GAAC,OAAIA,IAAMwlC,KAClBn4C,QAAO,SAACgG,EAAKxM,GAAN,qBACHwM,GADG,CAENxM,GAFM,KAGFA,EAAI8F,KAAOwS,EAAoB,CAACqmC,GAAyB,OAC5D,WAGF9kC,EAf0D,EAe1DA,UAAWzB,EAf+C,EAe/CA,SAEZ9L,GAAQgF,cAAQ,kBAAMuH,EACzBpL,QAAO,SAAAsM,GAAM,OAAmB,OAAfmlB,GAAuBnlB,EAAOnX,MAAM2a,MAAM,IAAI0tB,OAAO/L,EAAY,SAClFx/B,KAAI,SAAAqa,GAAM,OAAI,kBAACqkC,GAAD,MACbp+C,IAAK+Z,EAAOjU,GACZmS,UAAWumC,EACXF,cAAelmC,EAASE,oBAAsByB,EAAOjU,IAAMsS,EAASoB,oBAAsBO,EAAOjU,IAC5F04C,GAAc,MAAI3kC,EAAUE,EAAOjU,MACxC,kBAAC6U,GAAD,CACE1Z,KAAM,WACN6E,GAAIiU,EAAOjU,GACXgV,SAAUf,EAAOiU,OACjBjT,SAAU,SAAAhb,GAAK,OAAI64C,EAAW//B,EAC3BnZ,KAAI,SAAAyZ,GAAC,OAAIA,EAAErT,KAAOiU,EAAOjU,GAAhB,SAEDqT,GAFC,IAGJ6U,QAASjuB,EAAM4P,OAAOmL,UAExB3B,SAER,kBAAC1B,GAAA,SAAD,CAAkBuD,IAAKjB,EAAOjU,IAC3BiU,EAAOnX,OAAS,kBAACu7C,GAAD,KAAWpkC,EAAOjU,WAEvB,CAACo5B,EAAYrmB,EAAST,IAExC,OACE,6BACE,kBAACzF,GAAA,EAAD,CACEG,YAAaxS,EAAK+J,cAAc,CAACvE,GAAI,kDACrC+M,SAAU6rC,IACZ,kBAACjkC,GAAD,KAAWnO,GACX,kBAACkO,GAAD,KACE,kBAACxM,GAAA,EAAD,CAAQ1J,QAAS,kBAAMuW,EAAKhC,IAAUoC,KAAM,UACzC3a,EAAK+J,cAAc,CAACvE,GAAI,wDCpDnC,MCRA,IDQeN,eALS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCkV,QAASlV,EAAMkV,QACfgC,KAAMlX,EAAMkX,QAGd,EAAwC9R,SAAW81C,K,qlBEwB1B/8C,I,YAeR40C,I,YAaAoI,I,YAUAC,I,YAwCAC,I,YAMAC,I,YAUAC,I,YAUAC,I,YAKAC,I,YAyBAC,I,YAUAC,I,YAQAC,I,YAMAC,I,YAiBAC,I,YAmCAC,I,YAcAC,I,YAyCAC,I,YAWAC,I,YASAC,I,YAiCPC,I,YAcOC,IAtVJC,GAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAC/By6C,GAAqB,SAAA7/C,GAAK,OAAIA,EAAM8/C,YACpC/rB,GAAe,SAAA/zB,GAAK,OAAIA,EAAMg0B,MAC9BC,GAAqB,SAAAj0B,GAAK,OAAIA,EAAMk0B,YACpC6rB,GAA6B,SAAA//C,GAAK,OAAIA,EAAMg0B,KAAKiB,gBACjD+qB,IAAuBC,QAAc,eACnBtf,QAAQ,cAIxB,SAAUl/B,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QrBnCsB,wBqBmCSm1C,KAC/Bn1C,QAAWg/C,MAAwBtB,KACnC19C,QrB7B8B,gCqB6BS09C,KACvC19C,QrBnCwB,0BqBmCSg+C,KACjCh+C,QrBxB8B,gCqBwBSk+C,KACvCl+C,QrB1BgC,kCqB0BSo+C,KACzCp+C,QrBzBsC,wCqByBSq+C,KAC/Cr+C,QrBzBuC,yCqByBSs+C,KAChDt+C,QrBzBuC,yCqByBSu+C,KAChDv+C,QrBzB+B,+BqByBSy+C,MAX7B,wCAeR,SAAUtJ,KAAV,+EACgC,OADhC,UACsCn2C,QAAO+zB,IAD7C,mBACE5d,EADF,EACEA,eAAgBR,EADlB,EACkBA,aACjBsqC,EAAoB9pC,IAAmBw/B,QAFxC,iBAIsC,OAJtC,UAI4Ct1C,QAAKw+C,IAJjD,gDAImE,KAJnE,QAKL,OADM9pB,EAJD,gBAKC10B,QAAKm+C,GAAsByB,EAAmBlrB,GAL/C,WAMD5e,IAAmBw/B,QANlB,iBAOH,OAPG,WAOGt1C,QAAKs+C,GAAkBhpC,GAP1B,QAUL,OAVK,WAUClV,QAAIqF,MAVL,yCAaA,SAAUy4C,KAAV,yEACkB,OADlB,UACwBv+C,QAAO6/C,IAD/B,UACC9qB,EADD,uBAGY,OAHZ,UAGkBvY,QtB9DU,4BsB2D5B,cAGGnb,EAHH,yBAIIA,EAAOV,QAAQo0B,gBAJnB,gCAOEA,GAPF,wCAUA,SAAUypB,GAAqByB,EAAmBlrB,GAAlD,+FAC6B,OAD7B,UACmC/0B,QAAO0/C,IAD1C,OAEY,OAFZ,SACEQ,EADF,EACEA,wBADF,UAEkBlgD,QAAO+zB,IAFzB,mBAEEjJ,EAFF,EAEEA,OACHgF,EAAa,IACbowB,EAJC,iBAKW,OALX,WAKiB7/C,QAAKy+C,IALtB,WAKGpvB,EALH,QAMuBuwB,EANvB,iBAOC,OAPD,WAOO5/C,QAAKytB,0BAA2BoyB,EAAyBxwB,GAPhE,iDAQCwwB,EARD,QAMGC,EANH,KAUHrwB,EAAa,SAAIA,GAAeqwB,GAV7B,YAaDr1B,GAAW7P,OAAOqD,UAAUC,eAAele,KAAKyvB,EAAYhF,EAAOmxB,qBAblE,iBAcwB,OAdxB,WAc8B57C,QAAKk+C,IAdnC,QAec,OADX/O,EAdH,kBAeoBnvC,QAAKk7C,GAAa/L,GAftC,mCAiBe,OAjBf,WAiBqBnvC,QAAKC,kBAAmBwqB,EAAO4E,MAAO5E,EAAOrrB,KAjBlE,QAiBK2d,EAjBL,OAkBD0S,EAAWhF,EAAOmxB,qBAAuB,CAACx8C,IAAKqrB,EAAOrrB,IAAK2d,WAlB1D,YAsBD6iC,IAAqBlrB,EAtBpB,iBAuBsB,OAvBtB,WAuB4B10B,QAAKytB,yBAA0BiH,GAvB3D,QAwBuB,OADpB8W,EAvBH,kBAwB6BxrC,QAAKytB,sBAAuB+d,GAxBzD,QAwBGuU,EAxBH,OAyBHtwB,EAAa,SAAIswB,GAAsBtwB,GAzBpC,QA4ByB,OA5BzB,WA4B+BzvB,QAAKo+C,GAAqB3uB,GA5BzD,QA6Ba,OADZuwB,EA5BD,kBA6BmBrgD,SAAO+/C,QArEjB,eAwCT,QA+BL,OAFMO,EA7BD,kBA+BC7/C,QAAIuwC,gBAvEI,aAuE4BqP,IA/BrC,YAgCDC,EAhCC,iBAiCH,OAjCG,WAiCGv/C,QAAIka,OAAOzC,KAAK8nC,GAAWnhD,KAAI,SAAA8wC,GAAO,OAC1CxvC,QAAIuwC,YA1EM,aA0EsBf,EAASqQ,EAAUrQ,SAlClD,QAqCL,OArCK,WAqCCxvC,QrBpCkD,CACxDC,KAhEoC,oCAiEpCC,QAAS,CACP4/C,mBqBiCqC,KArClC,yCAwCA,SAAU9B,GAAoB3uB,GAA9B,0FACEzwB,KAAQywB,GAAY,SAAC7jB,EAAKu8B,EAAK/oC,GAAX,UAAC,MACtBwM,GADqB,UACf6hB,wBAAwBruB,GAAO+oC,MACxC,KAHE,wCAMA,SAAUkW,KAAV,6EACU,OADV,UACgB1+C,SAAO+/C,QAvFd,eAsFT,OAEoB,OADnB51B,EADD,iBAE0BnqB,QAAO2/C,IAFjC,OAGU,OAHV,SAEE5qB,EAFF,EAEEA,eAFF,UAGgB10B,QAAKg9C,GAAsBlzB,EAAQ4K,GAHnD,UAGCzI,EAHD,OAK8B,IAA/BrR,OAAOzC,KAAK8T,GAAQ5nB,OALnB,iBAMH,OANG,WAMGjE,QrBpF0B,CAClCC,KAtC4B,8BqBmHvB,yCAUA,SAAUi+C,GAAiBhpC,GAA3B,6EACiB,OADjB,UACuBtV,QAAKC,wBAAyBqV,GADrD,OAGY,OAFXI,EADD,iBAGkB/V,QAAO+zB,IAHzB,OAKL,OALK,SAGEjJ,EAHF,EAGEA,OACD01B,GAAmB11B,EAJpB,WAKCrqB,QAAIqF,GAAyBiQ,EAAc5W,KAAI,SAAAiN,GAAY,gBAC1DA,GAAkBo0C,GAAmBp0C,EAAaq0C,eAAiB,CAACrgD,QAAQ,SAN9E,yCAUA,SAAUw+C,KAAV,uEAEL,OADM7pB,EAAiB,CAAC2rB,YAAa,mBADhC,UAECjgD,QAAIqF,GAA0BivB,IAF/B,wCAKA,SAAU8pB,KAAV,+FAC8B,OADL8B,EAAzB,0CACoC3gD,QAAO+zB,IAD3C,mBACE5d,EADF,EACEA,eAAgBL,EADlB,EACkBA,SACnBK,IAAmBw/B,SAFlB,iBAGH,OAHG,UAGGt1C,QAAKu+C,IAHR,gCAII,MAJJ,QAOgB,OAPhB,WAOsBv+C,QAAKC,eAAgBwV,EAAU,UAAU,EAAM6qC,GAPrE,aAOD5rB,EAPC,yBAUc,OAVd,WAUoB/0B,QAAO0/C,IAV3B,sBAUI50B,EAVJ,EAUIA,UACOA,EAAOmxB,oBAXlB,iBAYgB,OAZhB,WAYsB57C,QAAK08C,GAAuBhoB,EAAgBjK,EAAOmxB,qBAZzE,QAYDlnB,EAZC,eAeH,OAfG,WAeGt0B,QAAIqF,GAA0BivB,IAfjC,QAgBH,OAhBG,WAgBGt0B,QAAIqF,GAA0B82C,GAAiB7nB,KAhBlD,iCAiBIA,GAjBJ,QAmBH,OAnBG,WAmBGt0B,QAAIi1C,EAAkBC,WAnBzB,QAoBH,OApBG,WAoBGt1C,QAAKu+C,IApBR,iCAqBI,MArBJ,yCAyBA,SAAUE,KAAV,2EACc,OADd,UACoB9+C,QAAO6zB,IAD3B,UACCG,EADD,OAE8C,IAA/C/Y,OAAOzC,KAAKwb,EAAW1e,aAAa5Q,OAFnC,gBAGH,OAHG,UAGG8X,QtBvKsB,yBsBoKzB,OAMiB,OANjB,UAMuBxc,QAAO6zB,IAN9B,uBAMEve,EANF,EAMEA,YANF,kBAOEA,GAPF,yCAUA,SAAUypC,KAAV,yEACmB,OADnB,UACyB/+C,QAAO2/C,IADhC,OAGL,OAHK,SACE5pC,EADF,EACEA,cADF,UAGCtV,QAAIqF,GAAyBiQ,EAAc5W,KAAI,SAAAiN,GAAY,gBAC1DA,GAD0D,IAC5ChM,OAAQgM,EAAaq0C,qBAJrC,wCAQA,SAAUzB,KAAV,iEACL,OADK,UACC3+C,QAAK0+C,IADN,OAEL,OAFK,UAECt+C,QAAIuwC,WAAkB,eAFvB,OAGL,OAHK,UAGC3wC,QAAKq+C,IAHN,wCAMA,SAAUO,KAAV,yEACuB,OADvB,UAC6Bj/C,QAAO2/C,IADpC,qBACEY,kBADF,gBAIH,OAJG,UAIG/jC,QrB1L4B,qCqBsL/B,OAOgB,OAPhB,UAOsBxc,QAAO8/C,IAP7B,cAOCc,EAPD,yBASEvhD,KAAQuhD,GAAc,SAACrhD,EAAQC,EAAOC,GAAhB,UAAC,MAEvBF,IACEgZ,MAAM4W,QAAQ3vB,IAAUA,EAAMkF,OAAhC,OAA4CopB,4BAA4BruB,GAAOD,GAAS,MAE5F,KAdE,yC,OAkCG,kBAAC,KAAD,CAAkB+F,GAAG,2DAjBxB,SAAU25C,KAAV,yFACiB,OADjB,UACuB7+C,QAAKgc,OAD5B,OAEL,OADMC,EADD,iBAEC7b,QAAI8b,UACR,cACA,kDACA,MACA,YAAa,IAAXrZ,EAAW,EAAXA,MAAW,GAKauE,cAAS,IALtB,YAKJiE,EALI,KAKEm1C,EALF,KAMX,OAAO,oCACL,kBAACjb,GAAA,EAAD,CAAavjC,MAAO,QAClB,kBAAC06B,GAAA,EAAD,CAAer8B,KAAM,SAAUlB,MAAOkM,EAAMlG,OAAQ,CAACgV,SAAUqmC,MAEjE,kBAAC19C,GAAD,CAAcY,QAAS,kBATVvE,EASuBkM,EARpCxI,SACAoZ,EAAc7b,IAAIjB,GAFL,IAAAA,GAS8Bkb,KAAM,SAAUmF,IAAK,UAAW8D,UAAWjY,GAAtF,QAKJ,IArBG,OAwBoB,OAxBpB,UAwB0B8Q,QAAKF,GAxB/B,OAyBmB,OADlBwkC,EAxBD,kBAyByBzgD,QAAK0gD,IAAe,GAzB7C,QA0Ba,OA1Bb,SAyBEtsB,EAzBF,EAyBEA,MAAOvnB,EAzBT,EAyBSA,OAzBT,WA0BmBlN,QAAO6zB,IA1B1B,QA2BgB,OA3BhB,SA0BEe,EA1BF,EA0BEA,QA1BF,WA2BsB50B,QAAO+zB,IA3B7B,QA6BuB,OA7BvB,SA2BEpe,EA3BF,EA2BEA,WA3BF,WA6B6BtV,QAAK8+C,GAAqB2B,EAAkBnrC,EAAY8e,EAAOG,EAAS1nB,GA7BrG,QA8BL,OADM8zC,EA7BD,kBA8BC3gD,QAAKs+C,GAAkBhpC,GA9BxB,QA+BL,OA/BK,WA+BCtV,QAAK2+C,IA/BN,QAgCL,OAhCK,WAgCCv+C,QAAIqF,GAA8Bk7C,EAAoBrO,UAAU,GAAM,IAhCvE,yCAmCA,SAAUwM,GAAoBzzC,EAAMiK,EAAY1V,EAAO20B,EAAS4d,GAAhE,6EAUoB,OATnBhU,EAAQl+B,yBAAyBs0B,GACtB,uBACXzY,EAAO,CACXzQ,OACAzL,QACA0V,aACA6oB,QACAgU,WARG,UAU0BnyC,QAAKC,iBARnB,uBAQ+C,CAACC,OAAQ,OAAQ4b,SAV5E,uBAUQld,EAVR,EAUEkd,KAVF,kBAWEld,GAXF,wCAcA,SAAUmgD,GAAV,sFACgE,OADxB6B,EAAxC,EAA8BtgD,QAAUsgD,WAAxC,UACsEjhD,QAAO0/C,IAD7E,OAGiB,OAHjB,SACsBwB,EADtB,EACEC,mBAAwC3rC,EAD1C,EAC0CA,mBAD1C,UAGuBnV,QAAKgc,OAH5B,OAIL,OADMC,EAHD,kBAIC7b,QAAI8b,UACR,gBACA,8BACA,MACA,YAAa,IAAXrZ,EAAW,EAAXA,MAWA,OAAO,kBAACg+C,EAAD,CACL93B,MAAO,SACPJ,UAAW,CACTrT,WAAY,gBACZga,IAAK,CAACsxB,GACNvgD,KAAM,MAER8U,mBAAoBA,EACpBqO,UAlBgB,WAChBvH,EAAc7b,KAAI,GAClByC,KAiBA8tB,SAde,WACf1U,EAAc7b,KAAI,GAClByC,UAcJ,IA9BG,QAiCyB,OAjCzB,WAiC+BsZ,QAAKF,GAjCpC,oCAmCkB,OAnClB,WAmCwBtc,QAAO+zB,IAnC/B,QAoCH,OApCG,SAmCIpe,EAnCJ,EAmCIA,WAnCJ,WAoCGtV,QAAKs+C,GAAkBhpC,GApC1B,QAqCH,OArCG,WAqCGtV,QAAK2+C,IArCR,yCAyCA,SAAUK,KAAV,+EACmC,OADnC,UACyCr/C,QAAO2/C,IADhD,OAIL,OAJK,SACE5pC,EADF,EACEA,cAAegf,EADjB,EACiBA,eAChBt1B,EAFD,UAEUs1B,EAAeqsB,UAFzB,YAEsCrsB,EAAexvB,GAFrD,iBAGC/F,EAAQuW,EAAcnR,MAAK,SAAAgtB,GAAC,OAAIA,EAAExxB,UAAQX,IAH3C,UAICY,QAAKC,qBAAD,OAAyBb,EAAMD,IAJpC,OAKL,OALK,WAKCiB,QAAI8b,YAAqB,CAC7B7b,KAAM,UACN5B,MAAO,mEAPJ,yCAWA,SAAUwgD,KAAV,yEACoB,OADpB,UAC0Bt/C,QAAO2/C,IADjC,OAEL,OAFK,SACE5qB,EADF,EACEA,eADF,UAEC10B,QAAKC,2BAAD,UAAgCy0B,EAAeqsB,UAA/C,YAA4DrsB,EAAexvB,GAA3E,kBAFL,OAGL,OAHK,UAGC9E,QAAI8b,YAAqB,CAC7B7b,KAAM,UACN5B,MAAO,oEALJ,wCASA,SAAUygD,KAAV,+EACoB,OADpB,UAC0Bv/C,QAAO2/C,IADjC,OAYiB,OAZjB,SACE5qB,EADF,EACEA,eACDzc,EAAUyc,EAAevpB,SAAS61C,SAAQ,SAAA1uB,GAAC,OAAIA,EAAEnnB,YAAUrM,KAAI,SAAAwzB,GAAC,MAAK,CACzEptB,GAAIotB,EAAEptB,GACNlD,MAAOswB,EAAEtwB,MACTorB,QAAqB,IAAbkF,EAAElF,WAEN6zB,EAPD,eAQAhpC,EAAQpL,QAAO,SAAAylB,GAAC,OAAKA,EAAElF,WARvB,KASAnV,EAAQpL,QAAO,SAAAylB,GAAC,OAAIA,EAAElF,YATtB,UAYuBptB,QAAKgc,OAZ5B,OAaL,OADMC,EAZD,kBAaC7b,QAAI8b,UAAA,UACLwY,EAAexvB,GADV,4BAER,qDACA,MACA,YAAa,IAAXrC,EAAW,EAAXA,MAMA,OAAO,kBAAC,GAAD,CAAcg7C,eAAgBoD,EAAehnC,KALvC,SAAAhC,GACXpV,IACAoZ,EAAc7b,IAAI6X,IAG4C2lC,YAAY,OAE9E,IAzBG,QA4BL,OA5BK,WA4BC59C,QAAKm/C,GAAkBzqB,EAAeqsB,UAAW9kC,GA5BlD,QA6BL,OA7BK,WA6BCjc,QAAKw+C,IAAgB,GA7BtB,QA8BL,OA9BK,WA8BCx+C,QAAK2+C,IA9BN,yCAiCP,SAAUQ,GAAiB4B,EAAW9kC,GAAtC,2EACkB,OADlB,UACwBE,QAAKF,GAD7B,OAWE,OAVMhE,EADR,OAEQsX,EAFR,gBAE4BwxB,EAF5B,kBAGQllC,EAAU,CACd3b,OAAQ,OACR4b,KAAM,CACJolC,aAAcjpC,EAAQpL,QAAO,SAAA0L,GAAC,OAAIA,EAAE6U,UAAQtuB,KAAI,SAAAyZ,GAAC,OAAIA,EAAErT,MACvDi8C,gBAAiBlpC,EAAQpL,QAAO,SAAA0L,GAAC,OAAKA,EAAE6U,UAAQtuB,KAAI,SAAAyZ,GAAC,OAAIA,EAAErT,QAPjE,UAWQlF,QAAKC,iBAAkBsvB,EAAU1T,GAXzC,wCAcO,SAAUujC,KAAV,6EACoB,OADpB,UAC0Bz/C,QAAO2/C,IADjC,OAOL,OAPK,SACE5qB,EADF,EACEA,eACDnF,EAFD,gBAEqBmF,EAAeqsB,UAFpC,wBAGCllC,EAAU,CACd3b,OAAQ,QAJL,UAOCF,QAAKC,iBAAkBsvB,EAAU1T,GAPlC,OAQL,OARK,WAQC7b,QAAKw+C,IAAgB,GARtB,QASL,OATK,WASCx+C,QAAK2+C,IATN,yCC5WA,IAAMyC,GAA0B,SAAAjQ,GACrC,OAAOA,EAAKtyC,KAAKC,KAAI,SAAA0F,GAAM,OAAIorB,sBAAqBprB,O,qlBC6B7BtD,I,YAoBR40C,I,YAWAuL,I,YAMAC,I,YAQAZ,I,YAiCAa,I,YAOAC,I,YAwBAC,I,YAQAC,I,YAKAxJ,I,YAKAyJ,I,YAOAC,I,YAUAC,I,YASAC,I,YAWAC,I,YAaAC,I,YAgBA/K,I,YAWAgL,I,YAUAC,I,YA6BAC,I,YAWAC,I,YAKAC,I,YAgBAC,I,YAMPC,I,YAWOlM,I,YAgBAmM,I,YAMAC,I,YAeAC,I,YAKA9sC,I,YAUA+sC,I,YAKA3L,I,YASAre,IA7WJ0mB,GAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAC/B6uB,GAAqB,SAAAj0B,GAAK,OAAIA,EAAMk0B,YACpCH,GAAe,SAAA/zB,GAAK,OAAIA,EAAMg0B,MAC9B6rB,GAAqB,SAAA7/C,GAAK,OAAIA,EAAM8/C,YACpCqD,GAAoB,SAAAnjD,GAAK,OAAIA,EAAMkpB,WACnCk6B,GAAsB,SAAApjD,GAAK,OAAIA,EAAM+O,aAEnC,SAAUtN,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QxBlCsB,kBwBkCSm1C,KAC/Bn1C,QxBtBuB,mBwBsBS8gD,KAChC9gD,QvBjC0B,4BuBiCmBu3C,KAC7Cv3C,QvBlC0B,4BuBkCmB0gD,KAC7C1gD,QxBTmC,+BwBSSu3C,KAC5Cv3C,QxBzBmB,ewByBS+gD,KAC5B/gD,QxBrB8B,gCwBqBSgiD,KACvChiD,QxBb8B,0BwBaSq2C,KACvCr2C,QjBlCuB,wBiBkCkBu3C,KACzCv3C,QxBzBwB,oBwByBSiV,KACjCgG,QAAUkQ,kBAA2B6M,KACrCh4B,QvB/BoC,sCuB+BmB01C,KACvD11C,QxBhB0B,sBwBgBS01C,KACnC11C,QxBXsB,kBwBWSqhD,KAC/BrhD,QxBX2B,uBwBWSs2C,MAhBzB,wCAoBR,SAAUnB,KAAV,+EAC0B,OAD1B,UACgCn2C,QAAO+zB,IADvC,OAEW,OAFX,SACEpe,EADF,EACEA,WAAYG,EADd,EACcA,SADd,UAEiB9V,QAAO6zB,IAFxB,OAGL,OAHK,SAEEje,EAFF,EAEEA,MAFF,WAGC7U,QAAI,EACRV,QAAKwiD,GAAoB/sC,EAAUF,IACnCvV,QAAK0iD,GAAiBptC,KALnB,QAQL,OARK,WAQClV,QxB6M6B,CACnCC,KAxO6B,yBwBkBxB,yCAWA,SAAUghD,KAAV,uEACS,OADT,UACerhD,QAAK0gD,IADpB,OAEL,OADM9gD,EADD,iBAECQ,QAAI0iD,GAA0BljD,IAF/B,OAGL,OAHK,UAGCQ,QAAIK,sBAAiC,iBAAkB,CAACb,MAAOA,KAHhE,wCAMA,SAAU0hD,GAASrL,GAAnB,iEACL,OADK,UACC71C,QAAIqF,IAAsB,IAD3B,OAEL,OAFK,UAECs9C,QAAKvB,IAFN,OAGL,OAHK,UAGCphD,QxBL+B,CACrCC,KAzDgC,8BwB0D3B,OAIL,OAJK,UAICL,QAAKmiD,GAAiBlM,GAJvB,OAKL,OALK,WAKC71C,QAAIqF,IAAsB,IAL3B,yCAQA,SAAUi7C,KAAV,qHAC2D,OADnCsC,IAAxB,2CACiErjD,QAAO6zB,IADxE,OAGoC,OAHpC,SACEolB,EADF,EACEA,mBAAoBF,EADtB,EACsBA,SAAUC,EADhC,EACgCA,UAAW9Z,EAD3C,EAC2CA,aAD3C,WAG0Cl/B,QAAOijD,IAHjD,oBAGEK,EAHF,EAGEA,oBAAqBt6B,EAHvB,EAGuBA,WACxBq6B,IAAmBC,EAJlB,0CAKI,CACL9qC,KAAMwQ,IANL,QAU2D,OAV3D,WAUiEhpB,QAAO2/C,IAVxE,QAWoB,OAXpB,SAUE9H,EAVF,EAUEA,eAA+B0L,EAVjC,EAUkBxtC,cAVlB,WAW0B1V,QAAK4+C,IAX/B,QAa0B,OAFzB7F,EAXD,kBAagC/4C,QAAK84C,GAA+BC,EAAkBvB,GAbtF,QAgBU,OAHT2L,EAbD,OAeCC,EAAiCpkC,KAAMmkC,EAAwB,CAAC,UAAW,QAf5E,WAgBgBnjD,QAAK2hD,GAAiB/I,EAAoBuK,EAAuBhR,QAAS+Q,GAhB1F,QAiBS,OADRr2C,EAhBD,kBAiBe7M,QAAKqjD,GAAQ3K,EAAUyK,EAAuBjK,KAjB7D,eAiBC9kB,EAjBD,OAmBCkvB,EAAiB1oC,OAAOzC,KAAKirC,GAAgC/+C,OAAS,IACtEmkC,IAASoQ,GAAsB,GAAI/rC,MACjCs2C,EAAuBjK,KAAOiK,EAAuBjK,IAAI70C,OAAS,EArBrE,uCAwBA++C,GACCv2C,GAAUA,EAAOxI,OAAS,EAAI,CAACwI,UAAU,IACzCunB,EAAQ,CAACA,SAAS,IAClByK,GAAgB,CAACA,iBACjB8Z,EAAY,CAACxgC,KAAMwgC,GAAa,IA5BjC,IA6BH2K,oBA7BG,yCAiCA,SAAU/B,GAAmBh2B,EAAUsrB,EAAgByM,GAAvD,6EACY,OADZ,UACkB3jD,QAAO+zB,IADzB,uBACEjJ,EADF,EACEA,OACD84B,EAAY94B,EAASA,EAAOrrB,IAAM,GAClCokD,EAAmBF,GAAkBzM,EAAiBA,EAAiBtrB,EAHxE,kBAIEi4B,EAAmBA,EAAiB//B,QAAQ,cAAe8/B,GAAa,MAJ1E,wCAOA,SAAU/B,KAAV,+FACgB,OADhB,UACsB7hD,QAAO0/C,IAD7B,OAE8B,OAF9B,SACE/pC,EADF,EACEA,WADF,UAEoC3V,QAAO6zB,IAF3C,OAGoC,OAHpC,SAEEjI,EAFF,EAEEA,SAAUsrB,EAFZ,EAEYA,eAFZ,WAG0Cl3C,QAAOijD,IAHjD,QAMS,OANT,SAGEK,EAHF,EAGEA,oBAAqBt6B,EAHvB,EAGuBA,UAEtBq6B,GAAmBC,EALpB,WAMejjD,QAAK0gD,GAAesC,GANnC,QAOoB,OADnBpjD,EAND,kBAO0BI,QAAKuhD,GAAoBh2B,EAAUsrB,EAAgBj3C,EAAM0jD,gBAPnF,QAae,OANdG,EAPD,OASC9U,EATD,IAUHzuC,OAAQqrB,EAAW,MAAQ,QACvBk4B,EAAmB,CAACl4B,SAAUk4B,GAAoB,IAXnD,WAaqBzjD,QAAKC,sBAAuBqV,EAAY1V,EAAO+uC,GAbpE,WAaCwH,EAbD,QAeD8M,EAfC,iBAgBH,OAhBG,WAgBG7iD,QAAIqF,EAAuBkjB,EAAUtkB,SAhBxC,gCAkBH,OAlBG,WAkBGjE,QAAIqF,EAAuB0wC,IAlB9B,QAqBL,OArBK,WAqBC/1C,QjBxFoC,CAC1CC,KA7C6B,4BA8C7BC,QAAS,CACPojD,WiBqFuCvN,KArBpC,yCAwBA,SAAUsL,GAAV,4EAEL,OAF2BnhD,EAAtB,EAAsBA,QACpB21C,EAAQ31C,EAAR21C,KADF,UAEC71C,QAAIqF,IAAsB,IAF3B,OAGL,OAHK,UAGCrF,QAAIqF,EAAuBwwC,IAH5B,OAIL,OAJK,UAICj2C,QAAKmiD,GAAiBlM,GAJvB,OAKL,OALK,WAKC71C,QAAIqF,IAAsB,IAL3B,yCAQA,SAAUi8C,KAAV,yEACiB,OADjB,UACuB/hD,QAAO6zB,IAD9B,OAEL,OAFK,SACE+iB,EADF,EACEA,YADF,UAECv2C,QAAKshD,GAAU/K,GAFhB,wCAKA,SAAU2B,KAAV,iEACL,OADK,UACC93C,QAAIqF,EAAuB,IAD5B,OAEL,OAFK,UAECzF,QAAKshD,GAAU,GAFhB,wCAKA,SAAUK,GAAgB/I,EAAoB+K,GAA9C,qFAIE,OAJiEC,EAAnE,+BAA4F,GAC3FC,EAA0BD,GAA0BA,EACvD/2C,QAAO,SAAAylB,GAAC,OAAIA,EAAEvyB,UAAQjB,KAAI,SAAAwzB,GAAC,OAAIA,EAAEggB,YAF/B,UAIQtyC,QAAK8jD,KAAQlL,EAAoB+K,EAAqBE,GAJ9D,gFAOA,SAAUjC,KAAV,yEACmB,OADnB,UACyBjiD,QAAO2/C,IADhC,uBACE5pC,EADF,EACEA,cADF,kBAEEA,GAAiBA,EAAconC,MAAK,SAAAxqB,GAAC,OAAIA,EAAEvyB,QAAUuyB,EAAEyxB,YAFzD,wCAKA,IAAMV,GAAS,SAAC3K,EAAUsL,GAAX,MAAyB,eACzCtL,GAAYA,EAASr0C,OAAS,EAAI,CAAC,IAAD,OAAKq0C,EAAL,MAAoB,IADb,KAEzCsL,GAAaA,EAAU3/C,OAAS,EAAI,CAAC,IAAD,OAAK2/C,EAAL,MAAqB,KAC7DthD,KAAK,UAEA,SAAUm/C,GAAuBpsC,EAAUF,EAAOtW,EAAOkB,GAAzD,gFACDlB,GAASA,EAAMoF,OAAS,GAAKlE,EAASkE,OAAS,GAD9C,gBAIY,OAFT8T,EAAOhY,EAASrB,KAAI,SAAAuS,GAAC,OAAIA,EAAEipC,SAC3BhlC,EAAanV,EAAS,GAAG0vB,QAH5B,UAIkB7vB,QAAKC,6BAA8BwV,EAAUF,EAAO4C,EAAMlZ,EAAOqW,GAJnF,OAKH,OADMpW,EAJH,iBAKGkB,QAAIqF,GAAoB,qBAAsBgQ,EAAUvW,IAL3D,wCASA,SAAU4iD,GAAqBzF,EAAgBl8C,GAA/C,kFACDk8C,GAAkBA,EAAeh4C,OAAS,GADzC,iBAEgB,OAFhB,UAEsB1E,QAAO6zB,IAF7B,OAGa,OAHb,SAEI+kB,EAFJ,EAEIA,SAFJ,UAGmBv4C,QAAK4vB,2BAA2BzvB,EAAUk8C,EAAgB9D,GAH7E,OAIc,OADX0L,EAHH,kBAIoBjkD,QAAKC,mBAAoBgkD,GAJ7C,QAKH,OADMnX,EAJH,kBAKGpsC,QAAIka,OAAOzC,KAAK20B,GAAUhuC,KAAI,SAAA0F,GAAM,OACxCpE,QAAIqF,GAAoB,kBAAmBjB,EAAQsoC,EAAStoC,SAN3D,yCAWA,SAAUu9C,GAAa5hD,GAAvB,+EACiC,OADjC,UACuCR,QAAO6zB,IAD9C,mBACEkB,EADF,EACEA,kBAAgBzf,EADlB,EACkBA,aACPivC,UAAYxvB,EAAewvB,UAAY/jD,EAASkE,OAAS,GAFpE,iBAQY,OALTskB,EAAY,CAChBtoB,KAAM,KACNiV,WAAYL,EAAY5J,KACxBikB,IAAKnvB,EAASrB,KAAI,SAAAuS,GAAC,OAAIA,EAAEipC,UANxB,UAQkBt6C,QAAKC,mBAAoB0oB,GAR3C,OASH,OADMzpB,EARH,kBASGc,QAAKiiD,GAAmBhtC,EAAY5J,KAAMnM,GAT7C,yCAaA,SAAU8iD,GAAV,gFAEH,OAFG,IAAqB1hD,QAAUgV,EAA/B,EAA+BA,WAAYN,EAA3C,EAA2CA,UAAWmvC,EAAtD,EAAsDA,OAAtD,mBAEGzjD,QAAI,EACRV,QAAKiiD,GAAmB3sC,EAApB,OACDN,EAAYmvC,KAEfnkD,QAAKC,eAAgBqV,EAAYN,EAAWmvC,KAN3C,8BAUH,OAVG,yBASHztC,cAAuB,uBAAvB,MATG,WAUG1W,QAAKiiD,GAAmB3sC,EAApB,OACPN,GAAamvC,IAXb,sDAgBA,SAAUlN,GAAV,gFAEiB,OAFmBtuB,EAApC,EAA0BroB,QAAUqoB,UAApC,mBAEuB3oB,QAAKC,mBAAoB0oB,GAFhD,OAIiB,OAFdy7B,EAFH,OAGGC,EAAczpC,OAAOkP,OAAOs6B,GAAa33C,UAAS,GAHrD,UAIuBzM,QAAKC,wBAAyB0oB,EAAW07B,GAJhE,OAKH,OADMC,EAJH,kBAKGtkD,QAAKiiD,GAAmBt5B,EAAUrT,WAAYgvC,GALjD,0DAOH5tC,cAAuB,4BAAvB,MAPG,uDAWA,SAAUurC,GAAkB3sC,EAAYivC,GAAxC,6EACc,OADd,UACoB5kD,QAAO6zB,IAD3B,OAOL,OAPK,SACE+kB,EADF,EACEA,SACDiM,EAAwBjM,EAASgM,UAAYhM,EAASgM,SAASjvC,GAAcijC,EAASgM,SAASjvC,GAAc,GAC7GmvC,EAHD,SAIAD,GACAD,GALA,UAOCnkD,QAAIqF,GAAoB,WAAY6P,EAAYmvC,IAPjD,wCAUA,SAAUvC,GAA2BjM,GAArC,iHAC0B,OAD1B,UACgCt2C,QAAO+zB,IADvC,OAEgC,OAFhC,SACEpe,EADF,EACEA,WAAYG,EADd,EACcA,SADd,UAEsC9V,QAAOkjD,IAF7C,OAGkF,OAHlF,SAEW6B,EAFX,EAEEzsC,QAFF,WAGwFtY,QAAO6zB,IAH/F,oBAGE8kB,EAHF,EAGEA,YAAa/jB,EAHf,EAGeA,QAAS/e,EAHxB,EAGwBA,MAAOkf,EAH/B,EAG+BA,eAAgBnJ,EAH/C,EAG+CA,SAAUsrB,EAHzD,EAGyDA,eAAgBthC,EAHzE,EAGyEA,MACzE+iC,EAAYrC,GAJZ,iBAKsD,OALtD,WAK4Dj2C,QAAKo8C,GAAW1nB,EAAgBgwB,GAL5F,QAMgB,OANhB,SAKIzlD,EALJ,EAKIA,MAAOo9C,EALX,EAKWA,eAAgBC,EAL3B,EAK2BA,wBAL3B,WAMsBt8C,QAAK0gD,IAN3B,QAcsB,OARnBiE,EANH,OAOG/kD,EAPH,SAQE+kD,GARF,IASD1O,OACA1hB,UACA/e,QACAvW,UAZC,WAc4Be,QAAKuhD,GAAoBh2B,EAAUsrB,EAAgB8N,EAAWrB,gBAd1F,QAoBc,OANXG,EAdH,OAeG9U,EAfH,IAgBDzuC,OAAQqrB,EAAW,MAAQ,QACvBk4B,EAAmB,CAACl4B,SAAUk4B,GAAoB,IAjBrD,WAoBoBzjD,QAAKC,mBAAoBqV,EAAY1V,EAAO+uC,EAAgByS,IApBhF,QAsBH,OAFMjhD,EApBH,kBAsBGC,QAAIqF,EAA2BwwC,EAAM91C,IAtBxC,QAuBH,OAvBG,WAuBG2yB,QAAMgvB,GAAsBzF,EAAgBl8C,GAvB/C,QAwBH,OAxBG,WAwBG2yB,QAAM+uB,GAAwBpsC,EAAUF,EAAO+mC,EAAyBn8C,GAxB3E,QAyBH,OAzBG,WAyBG2yB,QAAMivB,GAAc5hD,GAzBvB,yCA6BA,SAAUgiD,GAAgBlM,GAA1B,uEACiB,OADjB,UACuBt2C,QAAO6zB,IAD9B,qBACE8kB,YAEUrC,GAHZ,gBAIH,OAJG,UAIGj2C,QAAKkiD,GAA4BjM,GAJpC,OAOL,OAPK,UAOCj2C,QAAKsiD,GAAerM,GAPrB,OAQL,OARK,WAQCnjB,QAAMsvB,GAAwBnM,GAR/B,yCAWA,SAAUmM,GAAuBnM,GAAjC,iEACL,OADK,UACC2O,QAAM,KADP,OAEL,OAFK,UAEC5kD,QAAKqiD,GAAiBpM,GAFvB,wCAKA,SAAUoM,GAAgB9L,GAA1B,iFACQ,OADR,UACc52C,QAAO6zB,IADrB,UACCC,EADD,OAEE6kB,EAAsB7kB,EAAtB6kB,YAAa9iC,EAASie,EAATje,MACf2gC,EAAe1iB,EAAf0iB,YACC0O,EAAWtO,EAAc,EAJ1B,MAMDJ,EANC,iBAOoB,OAPpB,UAO0Bh6B,QxBjSD,yBwB0RzB,OAOG2oC,EAPH,OAQH3O,EAAc2O,EAAexkD,QAAQ61C,YARlC,aAWDI,EAAc/gC,EAAQ2gC,IAAgBmC,EAAYuM,GAXjD,iBAYH,OAZG,WAYG7kD,QAAKkiD,GAA4B2C,GAZpC,yCAgBA,SAAUvC,GAAcrM,GAAxB,yEACQ,OADR,UACct2C,QAAO6zB,IADrB,OAGL,OAFMC,EADD,OAECtzB,EAAWszB,EAAK6kB,YAAYrC,GAF7B,UAGC71C,QAAIqF,EAAoBtF,IAHzB,wCAMP,SAAUoiD,KAAV,2EACsB,OADtB,UAC4B5iD,QAAOkjD,IADnC,WACQr0C,EADR,QAEmB+lB,QAFnB,iBAGsB,OAHtB,UAG4BpY,QtBzTD,2BsBsT3B,uBAGW7b,EAHX,EAGWA,QAHX,kBAIWA,EAAQi0B,SAJnB,iCAMW/lB,EAAY+lB,SANvB,yCAWO,SAAU8hB,KAAV,iFACiC,OADjC,UACuC12C,QAAO6zB,IAD9C,OAEgB,OAFhB,SACEkB,EADF,EACEA,eAAgBzf,EADlB,EACkBA,YADlB,UAEsBjV,QAAK26C,GAAYjmB,GAFvC,OAGsB,OADrBqwB,EAFD,kBAG4B/kD,QAAKuiD,IAHjC,QAIgC,OAD/ByC,EAHD,kBAIsChlD,QAAK4hD,IAJ3C,WAICqD,EAJD,SAKDD,GAAsBA,EAAmB3gD,OAAS,GALjD,iBAMH,OANG,WAMGjE,QAAIqF,EAAmBu/C,IAN1B,qCAOMD,EAAa1gD,OAAS,GAP5B,iBAQH,OARG,WAQGjE,QAAIqF,EAAmBs/C,IAR1B,mCASOE,IAAgChwC,EAAYhW,MAAZ,iBATvC,iBAUH,OAVG,WAUGmB,QAAIqF,EAAmB,CAAC,CAACunB,MAXG,mBAW4BmR,MAAO,WAVlE,gCAYH,OAZG,WAYG/9B,QAAIqF,EAAmB,KAZ1B,yCAgBA,SAAU+8C,GAAmB/sC,EAAUF,GAAvC,uEACyB,OADzB,UAC+BvV,QAAKC,eAAgBwV,EAAUF,GAD9D,OAEL,OADM2vC,EADD,iBAEC9kD,QAAIqF,EAA0By/C,IAF/B,OAGL,OAHK,UAGCllD,QAAKyiD,GAAwByC,GAH9B,wCAMA,SAAUzC,GAAuB/tB,GAAjC,iFACc,OADd,UACoB10B,QAAK66C,GAAenmB,GADxC,OAEL,OADMomB,EADD,iBAEC16C,QxBtL4C,CAClDC,KAnJiC,2BAoJjCC,QAAS,CACPk4C,ewBmLkCsC,KAF/B,OAGa,OAHb,UAGmB96C,QAAK+6C,GAAcrmB,GAHtC,OAIL,OADMsmB,EAHD,kBAIC56C,QxBjL0C,CAChDC,KAzJgC,0BA0JhCC,QAAS,CACPm4C,cwB8KiCuC,KAJ9B,QAKY,OALZ,WAKkBh7C,QAAKk7C,GAAaxmB,GALpC,QAML,OADMnJ,EALD,kBAMCnrB,QAAIqF,GAAoB8lB,IANzB,QAOkB,OAPlB,WAOwBvrB,QAAKm7C,GAAmBzmB,GAPhD,QAQL,OADMmiB,EAPD,kBAQCz2C,QAAIqF,GAA0BoxC,IAR/B,QASgB,OAThB,WASsB72C,QAAKo7C,GAAiB1mB,GAT5C,QAUL,OADMmK,EATD,kBAUCz+B,QAAIqF,GAAwBo5B,IAV7B,QAW0B,OAX1B,WAWgC7+B,QAAKi7C,GAA2BvmB,GAXhE,QAYL,OADMyiB,EAXD,kBAYC/2C,QAAIqF,GAAkC0xC,IAZvC,yCAeA,SAAUuL,GAAgBptC,GAA1B,uEACS,OADT,UACetV,QAAKC,gBAAiBqV,GADrC,OAEL,OADM+Z,EADD,iBAECjvB,QxBtRsC,CAC5CC,KAlF8B,wBAmF9BC,QAAS,CACP2U,YwBmR+Boa,KAF5B,wCAKA,SAAUzZ,GAAV,gFACsB,OADAtV,EAAtB,EAAsBA,QAAtB,UAC4BX,QAAO0/C,IADnC,oBAEoB,IAFpB,EACE5P,iBADF,iBAGU,OAHV,UAGgB9vC,QAAOijD,IAHvB,OAKH,OAFMnvB,EAHH,OAIG0xB,EAAW1xB,EAAK9K,UAAUlc,SAASnM,EAAQ4E,IAJ9C,WAKG9E,QAAI0iD,GAAgC,CAACxiD,EAAQ4E,KAAMigD,IALtD,QAOL,OAPK,WAOC/kD,QAAIK,sBAAiC,aAAc,CAACyE,GAAI5E,EAAQ4E,MAPjE,yCAUA,SAAUy9C,GAAV,8EACwB,OADIriD,EAA5B,EAA4BA,QAA5B,UAC8BX,QAAO0/C,IADrC,OAEL,OAFK,SACElqC,EADF,EACEA,mBADF,UAECnV,QAAKmV,EAAmBiT,yBAA0B9nB,EAAQ+nB,cAF3D,wCAKA,SAAU2uB,GAAV,kFAEwB,OAFI12C,EAA5B,EAA4BA,QAC1BooB,EAAyBpoB,EAAzBooB,WAAYC,EAAaroB,EAAbqoB,UADd,UAE8BhpB,QAAO0/C,IAFrC,OAGL,OAHK,SAEElqC,EAFF,EAEEA,mBAFF,UAGCnV,QAAKmV,EAAmBsT,yBAA0BC,EAAYC,GAH/D,wCAMA,I,GAAMy8B,GAAwB,SAACv/C,EAAOyP,GAAR,QACjCzP,EAAMvF,QAAQH,SAASoE,MAAK,SAAAC,GAAM,OAAIA,EAAO8Q,aAAeA,MAEzD,SAAUqjB,GAAY33B,GAAtB,6EAEiB,OADhB6E,EAAQ7E,EAAOV,QAAQuF,MADxB,UAEuBlG,QAAO6zB,IAF9B,mBAEEve,EAFF,EAEEA,aACH,CAAC,sBAAuB,sBAAuB,uBAAuBxI,SAAS5G,EAAMxF,MAHpF,oBAIC+kD,GAAsBv/C,EAAOoP,EAAY5J,MAJ1C,gBAKD,OALC,UAKKrL,QAAKk4C,IALV,UASc,wBAAfryC,EAAMxF,KATL,iBAWH,OADMglD,EAAoBx/C,EAAMvF,QAAQH,SAAS0M,QAAO,SAAAwE,GAAC,OAAIA,EAAEiE,aAAeL,EAAY5J,QAAMvM,KAAI,SAAAuS,GAAC,OAAIA,EAAEjS,OAVxG,WAWGgB,QAAI0iD,GAAgCuC,GAAmB,IAX1D,QAcL,OAdK,WAcCjlD,QAAIgW,eAAyBpV,IAd9B,yC,qkBClYP,IAwBMJ,IAAe,axB5BU,6BwB6BFC,0BAAkC,gBAD1C,OxBtBmB,uCwBIV,SAACpB,EAAD,GAAsB,IAAba,EAAa,EAAbA,QAC/BglD,EAAuChlD,EAAQilD,mBANlCnqC,MAAM,KACtBvO,QAAO,SAAA0kB,GAAC,OAAIA,KACZzyB,KAAI,SAAAyyB,GAAC,OAAIA,EAAEi0B,UAKd,OAAIF,EAAWjhD,OAAS,EACtB,SACK5E,GADL,IAEE8lD,mBAAoBD,IAGjB7lD,KAUY,OxB1Bc,iCwB6BFoB,0BAAkC,mBAH9C,OxBvBwB,2CwB2BFA,0BAAkC,2BAJxD,OxBrBoB,uCwB0BFA,0BAAkC,wBALpD,OxBlBiB,oCwBwBFA,0BAAkC,sBANjD,OxBhBe,kCwBuBFA,0BAAkC,mBAP/C,OxBfa,gCwBuBFA,0BAAkC,kBAR7C,OxBdmB,uCwBOV,SAACpB,EAAD,WAASa,QAAUq3C,EAAnB,EAAmBA,eAAgB53C,EAAnC,EAAmCA,OAAQ63C,EAA3C,EAA2CA,UAA3C,UAAC,MAC1Bn4C,GADyB,IAE5BiW,cAAe,KAAIjW,EAAMiW,cAAc5W,KAAI,SAAAiN,GAAY,gBAChDA,GAAkB4rC,IAAmB5rC,EAAaumC,SAAW,CAACvyC,UAAU63C,EAAY,CAAC73C,QAASA,GAAU,aAI5F,IAYfe,GAAe,CACnB80C,aAAa,EACblhB,eAAgB,GAChB+wB,wBAAwB,EACxBF,mBAAoB,CAAC,eACrBG,qBAAqB,EACrBxF,mBAAmB,EACnBxqC,cAAe,MC3CjB,SD8Ce,WAA+C,IAA9BjW,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,4kBE/C5C,IAAMkmD,GAAa,SAACvyC,EAAGC,GAAJ,OAAUD,EAAIC,GAa3BzS,IAAe,apBdoB,sCoBeFC,0BAAkC,wBADpD,OpBXuB,yCoBaFA,kBAA0B,wBAF/C,OpBjBQ,sBoBMR,SAACpB,EAAD,OAASa,EAAT,EAASA,QAAT,UAAC,MACjBb,GADgB,IAEnBkpB,UAAW2kB,KAAMhtC,EAAQqoB,WAAWxV,KAAKwyC,SAStB,OpBhBU,6BoBUR,SAAClmD,EAAD,KAASa,QAAT,UAAC,MACnBb,GADkB,IAErBkpB,UAAW,GACXs6B,qBAAqB,OAGF,OpBfwB,0CoBoBFpiD,0BAAkC,4BALxD,OpBdoB,sCoBoBFA,0BAAkC,wBANpD,OpBbI,sBoBoBFA,0BAAkC,UAPpC,OpBZU,4BoBoBFA,0BAAkC,eAR1C,IAWfC,GAAe,CACnBmiD,qBAAqB,EACrBt6B,UAAW,GACXi9B,yBAAyB,EACzBrM,oBAAqB,OACrB35C,MAAO,GACP8jD,WAAY,GC/Bd,SDkCe,WAA+C,IAA9BjkD,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,GEtC5C,IAAMomD,GAAkB,CACtBC,OAAQ,SACRC,MAAO,QACPC,eAAgB,iBAChBzQ,KAAM,QAGuB3+B,UAAgBgE,OAAOzC,KAAK0tC,IAAiB/mD,KAAI,SAAAM,GAAG,OAAIymD,GAAgBzmD,O,qhCCLhG,I,GAAM6mD,GAAyB,SAACC,EAAqBhwC,EAA4BsiC,GACtF,OAAsC,IAA/BtiC,KACAgwC,GAAuBA,IAAwBL,GAAgBA,SAC9C,IAAnBrN,GAGM2N,GAAyB,SAACD,EAAqBE,GAC1D,OAAuB,IAAnBA,GAA4BF,IAAwBL,GAAgBA,KAC/DA,GAAgBA,KAGrBK,IAAwBL,GAAgBA,OACnCA,GAAgBA,OAGlBA,GAAgBA,OAMnBQ,GAA4B,SAACjzC,EAAGC,GAAJ,OAAUD,EAAIC,GAMnCizC,GAAmB,SAACC,EAAkBpuC,EAAMkhC,GACvD,IADsE,EAClEmN,EAAeD,EAAiBE,QADkC,KAEpDtuC,GAFoD,yBAE3D/Y,EAF2D,QAGhEi6C,EACFmN,EAAal+B,KAAKlpB,GAElBonD,EAAeA,EAAa35C,QAAO,SAAA65C,GAAC,OAAIA,IAAMtnD,MAJlD,2BAAwB,IAF8C,8BAUtE,OAAOkuC,KAAMkZ,GAAcrzC,KAAKkzC,K,YC5BTnlD,I,YASRsuC,I,YAYAmX,I,YAIAzO,I,YAIApC,I,YAgBA8Q,IAlDJvH,GAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAE/B+9C,GAAoB,SAAAnjD,GAAK,OAAIA,EAAMkpB,WACnC6K,GAAe,SAAA/zB,GAAK,OAAIA,EAAMg0B,MAE5B,SAAUvyB,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QxBRwC,yCwBQSu3C,KACjDv3C,QxBhB4B,qBwBgBS6uC,KACrC7uC,QxBf2B,4BwBeSgmD,KACpChmD,Q/BE+B,2B+BFCm1C,MALrB,wCASR,SAAUtG,GAAV,sFACiC,OADjC,IAA0BlvC,QAAU6X,EAApC,EAAoCA,KAAMkhC,EAA1C,EAA0CA,WAA1C,UACuC15C,QAAOijD,IAD9C,OAEoB,OAFpB,SACa2D,EADb,EACE59B,UADF,UAE0BhpB,QAAO0/C,IAFjC,qBAEErpC,iBAEiC6vC,GAAgBA,OAJnD,sBAKD1tC,EALC,wBAMD,OANC,WAMKnY,QAAKsmD,GAAkBC,EAAkBpuC,EAAMkhC,GANpD,4BAQL,OAJMmN,EAJD,gBAQCpmD,QAAIqF,GAAqB+gD,IAR1B,QASL,OATK,WASCpmD,QAAIK,sBAAiC,iBAAkB+lD,IATxD,yCAYA,SAAUG,KAAV,iEACL,OADK,UACCvmD,QAAIK,sBAAiC,iBAAkB,KADxD,wCAIA,SAAUy3C,KAAV,iEACL,OADK,UACC93C,QxBsByB,CAC/BC,KAtDyB,0BwB8BpB,wCAIA,SAAUy1C,KAAV,qFACoB,OADpB,UAC0Bn2C,QAAO6zB,IADjC,OAEgD,OAFhD,SACEglB,EADF,EACEA,eADF,UAEsD74C,QAAO0/C,IAF7D,OAGmB,OAHnB,SAEErpC,EAFF,EAEEA,eAAgBE,EAFlB,EAEkBA,2BAFlB,WAGyBvW,QAAOijD,IAHhC,QAK8B,OAL9B,SAGEiE,EAHF,EAGEA,cAHF,WAKoC7mD,QACvCimD,GACAjwC,EACAE,EACAsiC,GATG,QAWL,OANMsO,EALD,kBAWC1mD,QxBxB8D,CACpEC,KA3B2C,0CA4B3CC,QAAS,CACPslD,wBwBqB2CkB,KAXxC,QAaL,OAbK,WAaC9mD,QAAK4mD,GAAeC,GAbrB,yCAgBA,SAAUD,KAAV,+EACoB,OADpB,UAC0BjnD,QAAO6zB,IADjC,OAEoB,OAFpB,SACEglB,EADF,EACEA,eADF,UAE0B74C,QAAO0/C,IAFjC,OAIuB,OAJvB,SAEErpC,EAFF,EAEEA,eAFF,WAI6BhW,QAAKmmD,GAAwBnwC,EAAgBwiC,GAJ1E,QAKL,OADMe,EAJD,kBAKCn5C,QAAIqF,GAA+B8zC,IALpC,yC,qkBCtDP,IA0BM34C,IAAe,a9B7BQ,4B8B8BFC,0BAAkC,cADxC,O9B3BM,0B8B6BFA,0BAAkC,YAFtC,O9B1BM,0B8B6BFA,0BAAkC,YAHtC,O9BzBO,4B8BDR,SAACpB,EAAD,WAASa,QAAU0sB,EAAnB,EAAmBA,MAAO9qB,EAA1B,EAA0BA,MAA1B,UAAC,MAChBzC,GADe,IAElBsnD,OAAQ,SACHtnD,EAAMsnD,QADL,UAEH/5B,EAAQ9qB,SAsBQ,O9BpBiB,qC8ByBFrB,0BAAkC,sBALjD,O9BxBQ,6B8BMR,SAAApB,GAAK,gBACrBA,GADqB,IAExB80B,QAAS,QAgBU,O9BvBQ,6B8BUR,SAAA90B,GAAK,gBACrBA,GADqB,IAExBs4C,UAAW,GACX9/B,QAAS,QAUU,O9BtBY,iC8BeR,SAAAxY,GAAK,gBACzBA,GADyB,IAE5Bs4C,UAAW,GACXxjB,QAAS,GACTtc,QAAS,QAGU,IAWfnX,GAAe,CACnBi3C,UAAW,GACXxjB,QAAS,GACTtc,QAAS,GACT8uC,OAAQ,GACRC,mBAAmB,GC1CrB,SD6Ce,WAA+C,IAA9BvnD,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,qkBEnDrC,IAAMwnD,GAAe,SAAAz4C,GAAW,OACrCoM,OAAOzC,KAAK3J,GACT3B,QAAO,SAAAzN,GAAG,OAAIA,EAAI8nD,SAAS,gBAC3BthD,QAAO,SAACgG,EAAKxM,GACZ,IAAM6kC,EAAY7kC,EAAIud,MAAM,0BAC5B,gBACK/Q,GADL,UAEGq4B,EAAU,GAAKjpB,OAAOxM,EAAYpP,QAEpC,KAEM+nD,GAA0B,SAAAlvC,GAAO,OAC5CA,EACGpL,QAAO,SAAA0L,GAAC,OAAKA,EAAE6uC,iBACfxhD,QAAO,SAACgG,EAAK2M,EAAG9T,GAAT,UAAC,MACJmH,GADG,UAEL2M,EAAErT,GAAKT,MACN,KAEK4iD,GAAiB,SAACtP,EAAW/qB,EAAOs6B,GAAnB,OAC5B1sC,OAAOzC,KAAK4/B,GACT5kC,MAAK,SAACC,EAAGC,GAAJ,OAAU0kC,EAAU3kC,GAAK2kC,EAAU1kC,MACxCxG,QAAO,SAAAzN,GAAG,OAAIA,IAAQ4tB,KACtBpnB,QAAO,SAACgG,EAAKxM,GAAN,qBACHwM,GADG,CAENxM,GAFM,KAGFA,IAAQkoD,EAAqB,CAACt6B,GAAS,OAE3C,IACDpnB,QAAO,SAACgG,EAAKxM,EAAKqF,GAAX,UAAC,MACJmH,GADG,UAELxM,EAAMqF,MAEP,KAEO8iD,GAAgC,SAAC9xC,EAAUsiC,GAAX,OAC3Cn9B,OAAOzC,KAAK4/B,GACTnyC,QAAO,SAACgG,EAAKxM,GAAN,UAAC,MACJwM,GADG,oBAEF6J,EAFE,YAEUrW,EAFV,aAE2B24C,EAAU34C,GAAK8qC,eAC9C,KAEKyQ,GAAa,SAAAnsC,GACxB,IAAMg5C,EAAW,4CACjB,OAAO5sC,OAAOsE,QAAQ1Q,GACnB3B,QAAO,gBAAEzN,EAAF,oBAAWooD,EAASld,KAAKlrC,MAChCN,KAAI,4BAAEM,EAAF,KAAOD,EAAP,WAAkB,CAACsoD,GAAoBroD,EAAIud,MAAM6qC,IAAYroD,MACjEyG,QAAO,SAACgG,EAAD,GAAuB,gBAAhBxM,EAAgB,KAAXD,EAAW,KAK7B,OAJAyM,EAAIxM,EAAIuU,OAAR,SACK/H,EAAIxM,EAAIuU,QADb,UAEGvU,EAAI4tB,MAAQ7tB,IAERyM,IACN,KAGD67C,GAAsB,SAAAC,GAAQ,MAAK,CACvC16B,MAAO26B,GAAsBD,EAAS,IACtC/zC,MAAO+zC,EAAS,GAAK5sC,SAAS4sC,EAAS,IAAM,IAGzCC,GAAwB,SAAA36B,GAAK,MAAc,cAAVA,EAAwB,QAAUA,EAAMxgB,eAElEo7C,GAA8B,SAACnyC,EAAU8e,GAAX,kCACrC9e,EADqC,iBACX8e,EAAQvH,OADG,gBAErCvX,EAFqC,qBAEP8e,EAAQ4J,OAFD,GAK9B0pB,GAAwC,SAACpyC,EAAU8e,EAAS5gB,GAApB,kCAC/C8B,EAD+C,yBACtB9B,GAAU4gB,EAAQvH,OADI,gBAE/CvX,EAF+C,6BAElB9B,GAAU4gB,EAAQ4J,OAFA,GAKxC2pB,GAAa,SAAAt5C,GACxB,IAAMg5C,EAAW,wBACjB,OAAO5sC,OAAOsE,QAAQ1Q,GACnB3B,QAAO,gBAAEzN,EAAF,oBAAWooD,EAASld,KAAKlrC,MAChCwG,QAAO,SAACgG,EAAD,GAAuB,gBAAhBxM,EAAgB,KAAXD,EAAW,KACvB8kC,EAAY7kC,EAAIud,MAAM6qC,GAAU,GACtC,gBACK57C,GADL,UAGGq4B,EAAsB,UAAV9kC,MAEd,KAGM4oD,GAA6B,SAACtyC,EAAUwC,GAAX,OACxC2C,OAAOzC,KAAKF,GACTrS,QAAO,SAACgG,EAAKxM,GAAN,UAAC,MACJwM,GADG,oBAGF6J,EAHE,YAGUrW,EAHV,aAG2B6Y,EAAQ7Y,IAAM8qC,eAC7C,K,qlBC5EiBhpC,I,YAYR22C,I,YAWAwP,I,YAkBAW,I,YAoBA/P,I,YAWAgQ,I,YAQAC,I,YAyBPC,I,YAmBOC,IA9HJvF,GAAsB,SAAApjD,GAAK,OAAIA,EAAM+O,aAEnC,SAAUtN,KAAV,iEACb,OADa,UACPR,QAAI,EACRC,QjCnB4B,+BiCmBSk3C,KACrCl3C,QjClB2B,8BiCkBS0mD,KACpC1mD,QnCQmC,+BmCRaqnD,KAChDrnD,QjChByB,4BiCgBSs3C,KAClCt3C,QjChByB,4BiCgBSynD,KAClCznD,QjChB6B,gCiCgBSsnD,KACtCtnD,QjChBgC,mCiCgBSunD,MAR9B,wCAYR,SAAUrQ,KAAV,6EACmB,OADnB,UACyBl4C,QAAO0oD,IADhC,OAEa,OADZC,EADD,iBAEmB3oD,QAAO0oD,IAF1B,OAIe,OAFdt0B,EAFD,OAGCte,EAHD,UAGe6yC,EAAgB7yC,SAH/B,YAG2Cse,EAAUxe,OAHrD,UAIqBvV,QAAKC,0BAAD,UAA+BwV,EAA/B,MAJzB,OAKL,OADMjH,EAJD,kBAKCpO,QAAI03C,GAAayQ,GAAkB/5C,KALpC,QAML,OANK,WAMCpO,QjCI8B,CACpCC,KArCyB,0BAsCzBC,QAAS,CACPi0B,QiCPmBg0B,GAAgB/5C,MANhC,QAOL,OAPK,WAOCpO,QAAI43C,GAAWuQ,GAAgB/5C,KAPhC,QAQL,OARK,WAQCpO,QjCrBkD,CACxDC,KAPoC,qCAQpCC,QAAS,CACP0mD,mBiCkB6B,KAR1B,yCAWA,SAAUK,GAAV,8FAEa,OAFa/mD,EAA1B,EAA0BA,QACxB0sB,EAAsC1sB,EAAtC0sB,MAAOw7B,EAA+BloD,EAA/BkoD,mBAAoBvwC,EAAW3X,EAAX2X,QAD7B,UAEmBtY,QAAOkjD,IAF1B,mBAEA9K,EAFA,EAEAA,UAEiC,IAAlCn9B,OAAOzC,KAAK4/B,GAAW1zC,OAJtB,iBAKS,OALT,UAKerE,QAAKuoD,GAA8BtwC,GALlD,OAKH8/B,EALG,eAQgB,OARhB,WAQsB/3C,QAAKuoD,GAAqBxQ,EAAW/qB,EAAOw7B,GARlE,QASL,OADMC,EARD,kBASCroD,QAAI03C,GAAa2Q,IATlB,QAUmB,OAVnB,WAUyB9oD,QAAO0oD,IAVhC,QAWa,OADZC,EAVD,kBAWmB3oD,QAAO0oD,IAX1B,QAaL,OAFMt0B,EAXD,OAYCte,EAZD,UAYe6yC,EAAgB7yC,SAZ/B,YAY2Cse,EAAUxe,OAZrD,WAaCvV,QAAKC,2BAAD,UAAgCwV,EAAhC,iBAbL,QAcuB,OAdvB,WAc6BzV,QAAKuoD,GAAoC9yC,EAAUgzC,GAdhF,QAeL,OADMC,EAdD,kBAeC1oD,QAAKC,qBAAsByoD,GAf5B,yCAkBA,SAAUV,KAAV,iFACuB,OADvB,UAC6BroD,QAAO0oD,IADpC,sBACWM,EADX,EACEp0B,SACMlwB,OAAS,GAFjB,iBAGqB,OAHrB,UAG2B1E,QAAO0oD,IAHlC,OAIe,OADZC,EAHH,kBAIqB3oD,QAAO0oD,IAJ5B,QAMH,OAFMt0B,EAJH,OAKGte,EALH,UAKiB6yC,EAAgB7yC,SALjC,YAK6Cse,EAAUxe,OALvD,WAMG7U,QAAI,EACRV,QAAKC,2BAAD,UAAgCwV,EAAhC,oBACJzV,QAAKC,2BAAD,UAAgCwV,EAAhC,yBARH,QAgBH,OANMmzC,EAAqBD,EAASlC,MAAM,GACvC3nD,KAAI,SAACy1B,EAAS5gB,GAAV,OAAoB40C,GAA2C9yC,EAAU8e,EAAS5gB,EAAQ,MAC9F/N,QAAO,SAACgG,EAAK2oB,GAAN,UAAC,MACJ3oB,GACA2oB,KACDg0B,GAAiC9yC,EAAUkzC,EAAS,KAfvD,WAgBG3oD,QAAKC,qBAAsB2oD,GAhB9B,yCAoBA,SAAU3Q,KAAV,yEACmB,OADnB,UACyBt4C,QAAO0oD,IADhC,OAEa,OADZC,EADD,iBAEmB3oD,QAAO0oD,IAF1B,OAGL,OADMt0B,EAFD,iBAGCrzB,QAAI,EACRV,QAAKC,2BAAD,UAAgCqoD,EAAgB7yC,SAAhD,YAA4Dse,EAAUxe,MAAtE,oBACJvV,QAAKC,2BAAD,UAAgCqoD,EAAgB7yC,SAAhD,YAA4Dse,EAAUxe,MAAtE,yBALD,OAOL,OAPK,WAOCvV,QAAKqoD,IAPN,QAQL,OARK,WAQCroD,QAAKqoD,IARN,yCAWA,SAAUJ,KAAV,yEACmB,OADnB,UACyBtoD,QAAO0oD,IADhC,OAEa,OADZC,EADD,iBAEmB3oD,QAAO0oD,IAF1B,OAGL,OADMt0B,EAFD,iBAGC/zB,QAAKC,2BAAD,UAAgCqoD,EAAgB7yC,SAAhD,YAA4Dse,EAAUxe,MAAtE,OAHL,OAIL,OAJK,WAICvV,QAAKqoD,IAJN,QAKL,OALK,WAKCroD,QAAKqoD,IALN,yCAQA,SAAUH,KAAV,qFACoB,OADpB,UAC0BvoD,QAAO0oD,IADjC,OAEiC,OAFjC,SACE3zB,EADF,EACEA,eADF,UAEuC/0B,QAAOkjD,IAF9C,OAGY,OAHZ,SAEWgG,EAFX,EAEE5wC,QAFF,WAGkBtY,QAAO0oD,IAHzB,QAMiB,OANjB,SAGE59B,EAHF,EAGEA,OACDq+B,EAAc/L,GAAgBroB,EAAgBm0B,EAAoBp+B,GAJnE,WAMuBzqB,QAAKgc,OAN5B,QAOL,OADMC,EAND,kBAOC7b,QAAI8b,UAAA,UACLwY,EAAexvB,GADV,qBAER,yCACA,MACA,YAAa,IAAXrC,EAAW,EAAXA,MAMA,OAAO,kBAAC,GAAD,CAAcg7C,eAAgBiL,EAAa7uC,KALrC,SAAAhC,GACXpV,IACAoZ,EAAc7b,IAAI6X,IAG0C2lC,YAAY,OAE5E,IAnBG,QAsBL,OAtBK,UAsBCuK,GAAsBlsC,EAAe4sC,EAAoBn0B,GAtB1D,yCAyBP,SAAUyzB,GAAsBlsC,EAAe4sC,EAAoBn0B,GAAnE,2EACmB,OADnB,UACyBvY,QAAKF,GAD9B,OAWE,OAVMhE,EADR,OAC8CrS,QAAO,SAAC2nC,EAAa7iC,GAAd,UAAC,MAC/C6iC,GAD8C,UAEhD7iC,EAAKxF,IAAMwF,EAAK0iB,WACf,IACE27B,EAAcnuC,OAAOzC,KAAKF,GAASrS,QAAO,SAAC2nC,EAAayb,GAAd,UAAC,MAC5Czb,GACCt1B,EAAQ+wC,KAAgBH,EAAmBG,GAA3C,OACEA,EAAa/wC,EAAQ+wC,IACvB,MACF,IAVN,UAWQ5oD,QAAI43C,GAAW//B,IAXvB,WAYM2C,OAAOsE,QAAQ6pC,GAAajM,MAAK,mCAZvC,gBAaI,OAbJ,UAaU18C,QnCDoB,CAC5BC,KAzHqB,iBmC4GvB,OAe4B,OAf5B,WAekCL,QAAKuoD,GAAiC7zB,EAAexvB,GAAI6jD,GAf3F,QAgBE,OADMrE,EAfR,kBAgBQ1kD,QAAKC,qBAAsBykD,GAhBnC,yCAmBO,SAAU0D,KAAV,yEACmB,OADnB,UACyBzoD,QAAO0oD,IADhC,OAEa,OADZC,EADD,iBAEmB3oD,QAAO0oD,IAF1B,OAGL,OADMt0B,EAFD,iBAGCrzB,QAAI,EACRV,QAAKC,2BAAD,UAAgCqoD,EAAgB7yC,SAAhD,YAA4Dse,EAAUxe,MAAtE,iBACJvV,QAAKC,2BAAD,UAAgCqoD,EAAgB7yC,SAAhD,YAA4Dse,EAAUxe,MAAtE,gBALD,OAOL,OAPK,WAOCnV,QnCdsB,CAC5BC,KAzHqB,iBmC+HhB,yCCrIP,UACEszB,WAAYs1B,EACZx1B,KAAMy1B,GACN3J,WAAY4J,GACZ17B,SACA9E,UAAWygC,GACX56C,YAAa66C,IAGR,IAAMnoD,GAAQ,CACnBooD,GACAjB,GACAkB,GACAC,GACAC,I,kCCeF,MCnCA,IDmCeC,QAAU,CACvBj8B,KAAM,aACNk8B,kBAAkB,GAFpB,EA/B2B,SAAA5mD,GAAS,IAC3Bu0C,EAA0Bv0C,EAA1Bu0C,iBAAkB53C,EAAQqD,EAARrD,KASnBstB,GAAQtc,cAAQ,kBAAM,gBAFhBxL,EAEkBL,EAAF,EAAEA,MAAF,OAC1B,kBAACkN,GAAA,EAAD,CACE5S,MAAO0F,EAAM1F,MACbyqD,YAAY,EACZ33C,SAAU,SAAA9S,GAAK,OAAI0F,EAAMsV,SAAShb,IAClC+S,aAPQhN,EAOS,yCAPFxF,EAAK+J,cAAc,CAACvE,aAQjC,IAEN,OACE,0BAAM6oB,SAjBa,SAAA1c,GACnBA,EAAEG,iBACFH,EAAE4oB,kBACFqd,MAeE,kBAACpR,GAAA,EAAD,CAAO76B,KAAK,cAActF,UAAWinB,QEpB3C,IAAMroB,GAAoB,CACxB2yC,qBAGF,UAAe1yC,cAAQ,KAAMD,GAA7B,EAAgDwD,SAAW0hD,K,sSCPpD,IAAMC,GAAwB1rD,UAAH,KAC9BqP,KAGEg3B,MAMOslB,GAA0B3rD,UAAH,MC4GpC,MCvHA,IDuHesrD,QAAU,CACvBj8B,KA/GsB,aAgHtBk8B,kBAAkB,GAFpB,EA5GwB,SAAC,GAYnB,IAXJjE,EAWI,EAXJA,oBACAlhD,EAUI,EAVJA,OACMiR,EASF,EATJgY,KACAgC,EAQI,EARJA,WACA/vB,EAOI,EAPJA,KACAmgD,EAMI,EANJA,wBACAmK,EAKI,EALJA,qBACAC,EAII,EAJJA,0BACAxE,EAGI,EAHJA,uBACAF,EAEI,EAFJA,mBACAjO,EACI,EADJA,iBAEA,IAAK0S,EAAqB7+C,SACxB,OAAO,KAGT,IAAYjG,EAkCNglD,GADSz8B,yBAAyBu8B,GACIG,OAAM,SAAAn9B,GAAK,OAAIu4B,EAAmB94C,SAASugB,EAAM9nB,OAE7F,OACE,kBAAC4kD,GAAD,KACE,0BAAM/7B,SApCW,SAAA1c,GACnBA,EAAEG,iBACFH,EAAE4oB,kBACFqd,MAkCK4S,IAAgCxE,GAC9B,kBAACqE,GAAD,KACD,kBAACn8C,GAAA,EAAD,CACEtC,UAAQ,uBACR9M,KAAI,kBAAainD,EAAyB,KAAO,QACjD/hD,QAfuB,WAC/BumD,GAA2BxE,IAenBhnD,OA7CEyG,EA6CS,oCA7CHxF,EAAK+J,cAAc,CAACvE,WAiDhC,kBAAC,iBAAD,CACEV,OAAQA,EACRiR,SAAUA,EACVif,eAAgBs1B,EAChBv6B,WAAYA,EACZwW,iBAAiB,SACjB6C,kBAvCkB,SACxB+W,EACA6F,EACAD,EACAF,GAJwB,OAID,SAAAl6C,GAAI,OAZZ,SAACw0C,EAAyBx0C,GACzC,IAAKw0C,EACH,OAAO,EAET,IAAM7yB,EAAQ6yB,EAAwBt7C,MAAK,SAAA+tB,GAAC,OAAIA,EAAEptB,KAAOmG,KACzD,OAAO2hB,GAASA,EAAMI,OAQrBg9B,CAASvK,EAAyBx0C,KAEjCq6C,GACGD,GACAF,EAAmB94C,SAASpB,KA8BRm+B,CACjBqW,EACA6F,EACAD,EACAF,GAEFr7B,KAAK,gBElFf,IAAMvlB,GAAoB,CACxB2yC,oBACA2S,0B1CqCuC,SAAAxE,GAAsB,MAAK,CAClEplD,KA5C2C,2CA6C3CC,QAAS,CACPmlD,6B0C3BJ,UAAe7gD,eAVS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCinD,qBAAsBvqD,EAAM8/C,WAAW7qB,eACvCzf,YAAaxV,EAAMg0B,KAAKxe,YACxBo1C,aAAc5qD,EAAM8/C,WAAW8K,aAC/B3E,oBAAqB3iD,EAAM2iD,qBAAuBjmD,EAAM8/C,WAAWmG,oBACnEH,mBAAoB9lD,EAAM8/C,WAAWgG,mBACrCE,uBAAwBhmD,EAAM8/C,WAAWkG,uBACzC5F,wBAAyBpgD,EAAMoF,MAAMg7C,2BAGCl7C,GAAxC,EAA2DwD,SAAWmiD,K,i7DCpB/D,IAAMC,IAAcnsD,SAAOosD,KAAPpsD,CAAH,MAEXqsD,GAAqBrsD,UAAH,MAIlBwhB,GAAexhB,UAAH,KACHG,WAAY,SACLA,WAAY,kBAOrCiW,MAKSk2C,GAAkBtsD,UAAH,MACf,qBAAEusD,YAA+B,OAAS,UAInDJ,IAOSK,GAAoBxsD,UAAH,MACjB,qBAAEusD,YAA+B,OAAS,SAGvCpsD,WAAY,SACXF,YAAa,IACZA,YAAa,MAOlBwsD,IAA6BzsD,SAAOgP,KAAPhP,CAAH,KACxBC,UAAW,IAIhB,qBAAEssD,YAAyC,QAAT,SAGvBC,GAERrsD,WAAY,mBAIZ2mC,GAAM9mC,UAAH,KACMG,WAAY,SAQ9BkP,MAGSq9C,GAAe1sD,UAAH,KACHG,WAAY,SAORA,WAAY,mBCnFzBwsD,GAAsB,SAAC33C,EAAGC,GACrC,OAAOD,EAAEgtC,eAAiB/sC,EAAE+sC,cACxBhtC,EAAEgtC,eAAiB,EAAI,GACR,OAAdhtC,EAAEmhB,UAAmC,OAAdlhB,EAAEkhB,UAAqBnhB,EAAEmhB,QAAUlhB,EAAEkhB,S,+zCCE5D,IAAMy2B,GAA0B5sD,UAAH,MAKvB6sD,IAAyB7sD,SAAOmI,MAAPnI,CAAH,MAItB8sD,IAAwB9sD,SAAOgP,KAAPhP,CAAH,KAMjBC,YAAa,MAGf,qBAAE0B,OAAqBxB,WAAY,SAAWA,WAAY,gBAK5DiP,GAAoBpP,UAAH,KAIXC,YAAa,IAIjB,qBAAE0B,OAAqBxB,WAAY,SAAWA,WAAY,gBAM5D4sD,GAAqB/sD,UAAH,KAEVoP,GACA09C,IAKRE,GAA2BhtD,UAAH,KAClBG,WAAY,WAIT,qBAAEwB,QAAsBxB,WAAY,eAI7B8sD,OACd,qBAAEtrD,QAAsBxB,WAAY,WAK5B0sD,GACAz9C,GACA09C,GACR3sD,WAAY,UAEH,qBAAEwB,QAAuBxB,WAAY,qBAKhD+sD,GAAuBltD,UAAH,M,GCrDzB,kBAAC,KAAD,CAAkB8G,GAAG,kD,GAOrB,kBAAC,KAAD,CAAkBA,GAAG,oDAbvBqmD,GAAe,SAAC,GAAqF,IAApFC,EAAoF,EAApFA,QAASC,EAA2E,EAA3EA,UAAWt2C,EAAgE,EAAhEA,mBAAoB4pC,EAA4C,EAA5CA,mBAAoB6B,EAAwB,EAAxBA,WAAY7gD,EAAY,EAAZA,OACvFmf,EAAU,GAiBhB,OAfIssC,GACFtsC,EAAQoJ,KACN,kBAAC7d,GAAA,EAAD,CAAUrL,IAAK,cAAesE,QAAS,kBAAMyR,EAAmBU,WAAW,gBAAiB+qC,KAA5F,KAKA6K,GACFvsC,EAAQoJ,KACN,kBAAC7d,GAAA,EAAD,CAAUrL,IAAK,gBAAiBsE,QAASq7C,GAAzC,KAMmB,IAAnB7/B,EAAQ7a,OACH,KAIP,kBAACmJ,GAAD,CAAmBzN,OAAQA,GACzB,kBAACuU,GAAA,EAAD,CAAUC,YAAa,CAAC/V,KAAM,eAC3B0gB,KAeHwsC,GAAqB,SAAC,GAAD,IACzBC,EADyB,EACzBA,UACA5rD,EAFyB,EAEzBA,OACAiC,EAHyB,EAGzBA,MACAwpD,EAJyB,EAIzBA,QACAC,EALyB,EAKzBA,UACA7K,EANyB,EAMzBA,WACAzrC,EAPyB,EAOzBA,mBACA4pC,EARyB,EAQzBA,mBARyB,OAUzB,kBAACqM,GAAD,CAA0BrrD,OAAQA,EAAQ2D,QAAS,kBAAMioD,GAAW5rD,KAClE,kBAACkrD,GAAD,CAAwBxsD,MAAOuD,GAAQA,GACvC,kBAACmpD,GAAD,KACE,kBAACD,GAAD,CACEnrD,OAAQA,EACR2D,QAAS,SAAA2N,GACPs6C,GAAU,GACVt6C,EAAE4oB,mBAEJz7B,KAAMuB,EAAS,QAAU,OACzB6rD,OAAK,IACP,kBAACL,GAAD,CACEC,QAASA,EACTC,UAAWA,EACXt2C,mBAAoBA,EACpB4pC,mBAAoBA,EACpB6B,WAAYA,EACZ7gD,OAAQA,O,GAuBL,kBAACurD,GAAD,KACL,kBAACz0C,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,yCAoC7B,SA7CwB,SAAAnC,GAAS,IACxB2S,EAA+F3S,EAA/F2S,cAAegiC,EAAgF30C,EAAhF20C,sBAAuBL,EAAyDt0C,EAAzDs0C,cAAeliC,EAA0CpS,EAA1CoS,mBAAoB4pC,EAAsBh8C,EAAtBg8C,mBAChF,OAAKrpC,EAIwB,IAAzBA,EAAcrR,OAChB,GAOK,kBAAC2mD,GAAD,KACJ,KAAIt1C,GACFvC,KAAK43C,IACLjsD,KAAI,SAAAiN,GAAY,OACf,kBAAC2/C,GAAD,CACEtsD,IAAK2M,EAAaumC,SAClBsO,WAAY70C,EAAa3M,IACzBW,OAAQgM,EAAahM,OACrBiC,MAAO+J,EAAa/J,MACpB2pD,UAAW,SAAA/T,GACTF,EAAsB3rC,EAAaumC,UAAWvmC,EAAahM,OAAQ63C,GACnEP,KAEFmU,QAASz/C,EAAa8/C,YACtBJ,UAAW1/C,EAAa+/C,cACxB32C,mBAAoBA,EACpB4pC,mBAAoB,kBAAMA,EAAmBhzC,EAAa3M,YA3BzD,MCjGX,IAAMuF,GAAoB,CACxB+yC,yBACAL,iBACA0H,mB/C+FgC,SAAA6B,GAAU,MAAK,CAC/CvgD,KAzFkC,kCA0FlCC,QAAS,CACPsgD,iB+C1FJ,MCdA,IDceh8C,eALS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC2S,cAAejW,EAAM8/C,WAAW7pC,cAChCP,mBAAoB1V,EAAMoF,MAAMsQ,sBAGMxQ,GAAxC,CAA2DonD,IEI3D,I,GAQI,kBAACjB,GAAD,CAAckB,SAAU,GACtB,kBAAC,KAAD,CAAMxtD,KAAK,qB,GA6DF,kBAAC,KAAD,CAAkB0G,GAAG,+D,GAEtB,kBAAC,KAAD,CAAkBA,GAAG,0D,GAIvB,kBAAC,KAAD,CAAkBA,GAAG,2D,GAGrB,kBAAC,KAAD,CAAkBA,GAAG,oD,GAGrB,kBAAC,KAAD,CAAkBA,GAAG,uD,GAGrB,kBAAC,KAAD,CAAkBA,GAAG,wD,GAYvB,kBAACggC,GAAD,KACE,kBAAC,GAAD,O,GAEF,kBAACA,GAAD,KACE,kBAAC+mB,GAAD,CAA0BvG,qBAAqB,KA0B3D,UAAev9C,UAAWwd,UAhHF,SAAC,GAYnB,IAXJg5B,EAWI,EAXJA,YACAj/C,EAUI,EAVJA,KACAgW,EASI,EATJA,cACAmpC,EAQI,EARJA,iBACAG,EAOI,EAPJA,wBACAC,EAMI,EANJA,yBACAC,EAKI,EALJA,yBACAE,EAII,EAJJA,kBACA8M,EAGI,EAHJA,gBACAvB,EAEI,EAFJA,YACAwB,EACI,EADJA,eAEMC,GAAiBh8C,YAAO,MAD1B,GAEoBhJ,cAAS,CA1BJ,GA0B6B,KAFtD,YAEGkB,EAFH,KAES+jD,EAFT,QAGoDjlD,eAAS,GAH7D,YAGGklD,EAHH,KAGyBC,EAHzB,QAIwDnlD,eAAS,GAJjE,YAIGolD,EAJH,KAI2BC,EAJ3B,KAMEz7C,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,SAEtCwC,gBAAU,WACR,IAAMglD,EAAqBh3C,EApCK,GAqC5BA,EAAcrR,OApCQ,GADM,GAuC1BsoD,EAAqBP,EAAet7C,QAAQgT,aAC5C8oC,EAA+BvxC,KAAKwxC,KAAK,KAAOF,EAAqBD,KAEtEJ,GAAwBM,EAxCJ,IAyCvBH,GAA0B,GAC1BJ,EAAQ,CAzCiB,GAyCQ,MAEjCA,EAAQ,CAACO,EAA8B,IAAMA,MAE9C,CAACl3C,EAAe42C,IAEnB,IAAMQ,EAA6E,KAAhDp3C,aAAA,EAAAA,EAAe7I,QAAO,SAAA0kB,GAAC,OAAIA,EAAExxB,UAAQsE,QAExE,OAAO,oCACL,kBAACqmD,GAAD,CAAiBC,YAAaA,GAC5B,kBAAC/qC,GAAD,KACE,kBAACirC,GAAD,CAA4BrsD,KAAM,eAAgBmsD,YAAaA,EAAajnD,QAASyoD,IACpFK,GAA0B,kBAAC5+C,GAAA,EAAD,CACzBpP,KAAM8tD,EAAuB,aAAe,eAC5C5oD,QAAS,kBAAM6oD,GAAyBD,IACxC7tD,MAA8BuS,EAAvBs7C,EAA2B,8BAAqC,+BAEzE,kBAAC1+C,GAAA,EAAD,CACEtC,UAAQ,eACR9M,KAAK,QACLkF,QAASi7C,EACTlgD,MAAOuS,EAAI,8BAEb,kBAACsD,GAAA,EAAD,CAAUC,YAAa,CAAC/V,KAAM,eAC5B,kBAACiM,GAAA,EAAD,CAAU6Y,UAAWwpC,EAA4BppD,QAASs7C,GACxD,kBAAC+N,GAAA,EAAD,CAAS1nD,SAAUynD,GAAD,IAAlB,KAMF,kBAACriD,GAAA,EAAD,CAAU/G,QAASu7C,GAAnB,IAGA,kBAACx0C,GAAA,EAAD,CAAU/G,QAASm7C,EAAkBv7B,UAAW4oC,GAAhD,IAGA,kBAACzhD,GAAA,EAAD,CAAU/G,QAASw7C,GAAnB,IAGA,kBAACz0C,GAAA,EAAD,CAAU/G,QAAS07C,GAAnB,MAKJ,kBAACqL,GAAD,CAAoBt5C,IAAKi7C,GACvB,kBAAC7B,GAAD,CACEyC,UAAU,WACVC,WAAY,GACZC,MAAO5kD,EACP6kD,QAAS,CAAC,GAAI,GACdC,OA1Fc,WACtB,IAAMC,EAAWz7C,SAAS4f,cAAc,OAMxC,OALA5P,YAAA,GAGmByrC,GAEZA,IA8ED,SAgBJ,kBAACzC,GAAD,CAAmBlnD,QAASyoD,EAAgBxB,YAAaA,GACvD,kBAACE,GAAD,CAA4BrsD,KAAM,gBAAiBmsD,YAAaA,UClHtE,IAAMhmD,GAAoB,CACxBg6C,YlD8ByB,iBAAO,CAChCt+C,KAzC0B,4BkDW1Bw+C,iBlD+F8B,iBAAO,CACrCx+C,KA/FgC,kCkDAhC2+C,wBlDkGqC,iBAAO,CAC5C3+C,KAlGwC,0CkDAxC4+C,yBlDqGsC,iBAAO,CAC7C5+C,KArGyC,2CkDAzC6+C,yBlDwGsC,iBAAO,CAC7C7+C,KAxGyC,2CkDAzC++C,kBlD2G+B,iBAAO,CACtC/+C,KA3GiC,kCkDOnC,MCzBA,IDyBeuE,eALS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC2S,cAAejW,EAAM8/C,WAAW7pC,cAChCw2C,iBAAiB9rB,QAAQ,aAARA,CAAsB3gC,MAGDkF,GAAxC,CAA2D2oD,I,gUEzBpD,IAAMC,GAA+BnvD,UAAH,M,GCmBU,kBAAC,GAAD,M,GAAwB,kBAAC6tD,GAAD,MAW3E,MC9BA,GDQmB,SAAC,GAAkD,IAAjDn2C,EAAiD,EAAjDA,eAAgB60C,EAAiC,EAAjCA,YAAawB,EAAoB,EAApBA,eAChD,OAAIr2C,IAAmBw/B,QAEnB,kBAACiY,GAAD,KACE,kBAAC,GAAD,CAAiB5C,YAAaA,EAAawB,eAAgBA,KAK1D,kBAACziB,GAAA,WAAD,CAAe8jB,cAAc,EAAO7jB,UAAU,GACnD,kBAACD,GAAA,QAAD,KACG5zB,IAAmBw/B,SAAnB,SEVP,UAAe1wC,eAJS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC+S,eAAgBrW,EAAMk0B,WAAW7d,kBAHT,GAM1B,EAA2D3N,SAAWslD,K,sqBCRtE,SAAervD,UAAf,MAKO,IAAM0E,GAAe1E,WAAH,KACNG,WAAY,WAElB,qBAAE+kB,SAAyB,OAAS,UAI3B,qBAAEvjB,QAAsBxB,WAAY,eAGlCA,WAAY,kBAGrBA,WAAY,UAMZ,qBAAEwB,QAAsBxB,WAAY,WAUlCA,WAAY,cCuC7B,MC1EA,GDK4B,SAAC,GAOvB,IACQ2G,EAPZxF,EAMI,EANJA,KACAipB,EAKI,EALJA,UACAs6B,EAII,EAJJA,oBACAyK,EAGI,EAHJA,0BACAhK,EAEI,EAFJA,WACAiD,EACI,EADJA,eAGMgH,EAAyC,IAArBhlC,EAAUtkB,OAEpC,OACE,kBAACupD,GAAD,KACE,kBAAC,GAAD,CACE7tD,QAASkjD,EACTv/C,QAAS,YACHu/C,GAAuB0K,IACzBD,MAIJ,kBAAC72C,GAAA,QAAD,KACE,kBAAC,KAAD,CACE3R,GAAG,kCACH4kB,OAAQ,CAACkO,MAAO0rB,OAGtB,kBAAC,GAAD,CACE3jD,OAAQkjD,EACR3/B,UAAWqqC,EACXjqD,QAAS,WACHiqD,GACFD,KAGJpiD,UAAQ,kCAER,kBAACuL,GAAA,QAAD,KACE,kBAAC,KAAD,CACE3R,GAAG,wCACH4kB,OAAQ,CAACkO,MAAOrP,EAAUtkB,UAC3BskB,EAAUtkB,OAAS,GAAK,kBAAC+I,GAAA,EAAD,CACvB9B,UAAQ,wCACRsgD,OAAK,EACLptD,KAAK,QACLC,OArCEyG,EAqCS,oCArCHxF,EAAK+J,cAAc,CAACvE,QAsC5BxB,QAAS,SAAA2N,GACPA,EAAE4oB,kBACEgpB,GACFyK,IAEF/G,WEpDd,IAAMhiD,GAAoB,CACxBgiD,erDkB4B,iBAAO,CACnCtmD,KAxB6B,8BqDM7BqtD,0BrDiDuC,iBAAO,CAC9CrtD,KAnD0C,4CqDY5C,UAAeuE,eARS,SAACnF,EAAOsD,GAAR,MACtB,CACE2gD,WAAYjkD,EAAMkpB,UAAU+6B,WAC5B/6B,UAAWlpB,EAAMkpB,UAAUA,UAC3Bs6B,oBAAqBxjD,EAAMkpB,UAAUs6B,uBAIDt+C,GAAxC,EAA2DwD,SAAW0lD,K,mBCP9D,kBAAC,KAAD,CAAkB3oD,GAAG,2C,GAGrB,kBAAC,KAAD,CAAkBA,GAAG,iD,GAInB,kBAAC,KAAD,CAAkBA,GAAG,qC,GAIvB,kBAAC,KAAD,CAAkBA,GAAG,yCAcvBP,GAAoB,CACxBujD,mB3DiCgC,iBAAO,CACvC7nD,KA/DkC,mCAgElCC,QAAS,K2DlCT23C,gBACAgQ,iB3D0B8B,iBAAO,CACrC5nD,KA3D+B,gCA4D/BC,QAAS,K2D3BT8nD,a3DmC0B,iBAAO,CACjC/nD,KAtE2B,4BAuE3BC,QAAS,M2D7BX,UAAesE,eALS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCkT,SAAUxW,EAAMg0B,KAAKxd,SACrBkhC,uBAAwB13C,EAAMg0B,KAAK0jB,0BAGGxyC,GAAxC,EAzC6B,SAAA5B,GAAK,OAC/BA,EAAMo0C,uBAiBH,KAhBA,kBAAC7iC,GAAA,EAAD,CAAUC,YAAa,CAAC/V,KAAM,eAC9B,kBAACiM,GAAA,EAAD,CAAU/G,QAASX,EAAMmlD,oBAAzB,IAGA,kBAACz9C,GAAA,EAAD,CAAU/G,QAASX,EAAMqlD,cAAzB,IAGCrlD,EAAMkT,UACF,kBAACxL,GAAA,EAAD,CAAU/G,QAASX,EAAMk1C,cAAzB,IAIL,kBAACxtC,GAAA,EAAD,CAAU/G,QAASX,EAAMklD,kBAAzB,Q,OCLE,kBAAC,KAAD,CAAMzpD,KAAK,gBAXbw9C,GAAe,SAAC,GAAD,IAAE8R,EAAF,EAAEA,eAAgB7R,EAAlB,EAAkBA,QAAS9mC,EAA3B,EAA2BA,mBAAoBsV,EAA/C,EAA+CA,OAA/C,OACnBqjC,GAAkB34C,EAAmBJ,mBACjC,0BACArR,QAAS,SAAA2N,GAAC,OAAIA,EAAE4oB,mBAChB3uB,UAAQ,yBAER,kBAAC6J,EAAmBJ,mBAApB,MACEC,UAAWinC,EAAQ3B,MACnBrlC,YAAagnC,EAAQpsB,SAChBpF,GAAUA,EAAOpC,cAAgB,CAACT,SAAU6C,EAAOpC,eAH1D,KAQA,M,mPCjBC,IAAM0lC,GAAuB3vD,WAAH,MAC7BiM,UAQS9L,WAAY,mBAErB,gBAAE4lD,EAAF,EAAEA,OAAQ5lD,EAAV,EAAUA,MAAV,OAAqB4lD,GAAU,UAAJ,OAAc5lD,EAAMyhB,OAAOlT,UAA3B,QC8BzBnI,GAAoB,CACxBq9C,UhEuOuB,SAAC1sC,EAAYN,EAAWmvC,GAAxB,MAAoC,CAC3D9jD,KAjPwB,kBAkPxBC,QAAS,CACPgV,aACAN,YACAmvC,agErOE6J,IAAsBppD,eAJJ,SAAAnF,GAAK,MAAK,CAChC8kD,SAAU9kD,EAAMg0B,KAAK8kB,SAASgM,YAGqB5/C,GAAzBC,EA5CP,SAAC,GAAmC,IAAlCq3C,EAAkC,EAAlCA,QAASsI,EAAyB,EAAzBA,SAAUvC,EAAe,EAAfA,UAAe,GACrB56C,eAAS,GADY,YAChD6mD,EADgD,KACrCC,EADqC,KAGjD/J,EAASI,GAAYA,EAAStI,EAAQpsB,UAAY00B,EAAStI,EAAQpsB,SAASosB,EAAQ3B,QAE1F5yC,gBAAU,WACHy8C,GACH+J,GAAa,KAEd,CAAC/J,IAOJ,OACE,kBAAC4J,GAAD,CACE5J,OAAQA,EACRzgD,QARgB,SAAA2N,GAClBA,EAAE4oB,kBACF+nB,EAAU/F,EAAQpsB,QAASosB,EAAQ3B,OAAQ6J,IAOzCgK,aAAc,kBAAMD,GAAa,IACjCE,aAAc,kBAAMF,GAAa,KACjC,kBAAC,KAAD,CAAM1vD,KAAM2lD,GAAU8J,EAAY,YAAc,a,qkBCrBtD,IAAMI,GAAQ,SAAAtrD,GACZ,IH0B6B+qD,EAAgB34C,EAAoBsV,EG1B3D6jC,EAAqBvrD,EAAMoT,UAC5BpT,EAAMi4C,WACNj4C,EAAMoS,sBACJpS,EAAMoS,mBAAmBJ,mBAC1Bw5C,GAAuBxrD,EAAMo0C,uBAC7Bl/B,EAAU,GAAH,YACNq2C,GAAsBC,EACvB,EHmBuBT,EGnBPQ,EHmBuBn5C,EGlBrCpS,EAAMoS,mBHkBmDsV,EGjBzD1nB,EAAM0nB,OHiB+D,CAC7EvlB,GAAI,oBACJkiD,eAAe,EACfllD,MAAO,GACPK,WAAW,EACXisD,SAAS,EACTC,eAAgBC,GAChB1S,aAAc,SAAAj5C,GAAK,OAAI,kBAAC,GAAD,QACjBA,EADiB,CAErB+qD,eAAgBA,EAChB34C,mBAAoBA,EACpBsV,OAAQA,SG3BJ,IALO,KAMP1nB,EAAMmhD,SAAW,CDiCS,CAChCh/C,GAAI,cACJkiD,eAAe,EACfllD,MAAO,GACPK,WAAW,EACXisD,SAAS,EACTxS,aAAcgS,KCvC2B,IAN5B,KAORjrD,EAAM4rD,kBACN7vD,KAAI,SAAAsU,GAAC,gBAASA,GAAT,IAAYlR,MAAOoB,KAAKP,EAAMgkD,OAAQ3zC,EAAElO,SAC7CiO,MAAK,SAACC,EAAGC,GAAJ,OACJ/P,KAAKP,EAAMg1C,UAAW,CAAC3kC,EAAElO,KAAO5B,KAAKP,EAAMg1C,UAAW,CAAC1kC,EAAEnO,UAG/D,OAAO,kBAAC,KAAD,CACLrG,KAAMkE,EAAM5C,SACZ8X,QAASA,EACT22C,oBAAqB7rD,EAAM8rD,YAC3BC,sBAAuB/rD,EAAM0zC,WAC7BsY,eAAgB,CACdxY,YAAaxzC,EAAMwzC,YACnByY,WAAYjsD,EAAMozC,YAClB8Y,eAAgBlsD,EAAMyS,OAExB05C,aAAcnsD,EAAM0+C,WACpB0N,cAAepsD,EAAM2zC,QACrB0Y,gBAAiBrsD,EAAMssD,sBACvBr5C,eAAgBjT,EAAMw2C,oBACtBnK,kBAAmBrsC,EAAMysC,eACzB7mB,UAAW5lB,EAAM4lB,UACjB/S,WAAY7S,EAAM6S,WAClBolC,UAAWj4C,EAAMi4C,UACjBsU,uBAAwB,SAACC,EAAUC,GAAX,OAAwBzsD,EAAMskD,eAAekI,EAAUC,EAAUv3C,OAmCvFyG,GAAW,SAAC1a,EAAW2a,GAC3B,IAAMC,EAAOC,gBAAc7a,EAAW2a,GACtC,OAAoC,IAA7B/D,OAAOzC,KAAKyG,GAAMva,QAG3B,MCpFA,GDoFeK,SAAW2pD,GAAO3vC,IEjEjC,IAAM/Z,GAAoB,CACxBmxC,aACA2L,WnEwGwB,SAAAxL,GAAI,MAAK,CACjC51C,KAnHyB,mBAoHzBC,QAAS,CACP21C,UmE1GFS,WACA2Y,sBnE+MmC,SAACriC,EAAOwO,GAAR,MAAiB,CACpDn7B,KA5MqC,+BA6MrCC,QAAS,CACP0sB,QACAwO,SmElNF5lB,WnE8HwB,SAAA1Q,GAAE,MAAK,CAC/B7E,KAvI0B,oBAwI1BC,QAAS,CACP4E,QmEhIFsqC,kBACA4J,gBACAiO,ejEC4B,SAACr6B,EAAOw7B,EAAoBvwC,GAA5B,MAAyC,CACrE5X,KA7B6B,8BA8B7BC,QAAS,CACP0sB,QACAw7B,qBACAvwC,aiELFggC,gBACA4W,YjEsByB,SAAC7hC,EAAO9qB,GAAR,MAAmB,CAC5C7B,KAjD0B,2BAkD1BC,QAAS,CACP0sB,QACA9qB,YiELJ,UAAe0C,eAlBS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCwzC,YAAa92C,EAAMg0B,KAAK8iB,YACxBp2C,SAAUV,EAAMg0B,KAAKtzB,SACrBg2C,YAAa12C,EAAMg0B,KAAK0iB,YACxB3gC,MAAO/V,EAAMg0B,KAAKje,MAClBihC,WAAYh3C,EAAMg0B,KAAKgjB,WACvB8C,oBAAqB95C,EAAMkpB,UAAU4wB,oBACrCyB,UAAWv7C,EAAMg0B,KAAKglB,cACtB9vB,UAAWlpB,EAAMkpB,UAAUA,UAC3B8B,OAAQhrB,EAAMk0B,WAAWlJ,OACzBtU,SAAU1W,EAAMg0B,KAAKtd,SACrBhB,mBAAoB1V,EAAMoF,MAAMsQ,mBAChC4iC,UAAWt4C,EAAM+O,YAAYupC,UAC7BgP,OAAQtnD,EAAM+O,YAAYu4C,OAC1B7C,SAAUzkD,EAAMg0B,KAAKxe,YAAYivC,UAAYzkD,EAAMg0B,KAAKiB,eAAewvB,SACvE/M,uBAAwB13C,EAAMg0B,KAAK0jB,0BAGGxyC,GAAxC,EAA2DwD,SAAWkmD,KCpD/D,IAAMoB,GAA2B,SAAAhwD,GAAS,IACxCkpB,EAAoBlpB,EAApBkpB,UAAW9jB,EAASpF,EAAToF,MAElB,OAAI8jB,EAAUA,UAAUtkB,OAAS,GAA8B,mBAAzBQ,EAAMmR,eACnC,CACLV,WAAY7V,EAAMk0B,WAAWre,WAC7BjV,KAAM,KACNivB,IAAK3G,EAAUA,UACfqP,MAAOrP,EAAUA,UAAUtkB,QAAU,GAIlC,CACLiR,WAAY7V,EAAMk0B,WAAWre,WAC7BjV,KAAM,QACNT,MAAO+oB,EAAU/oB,MACjBo4B,MAAOrP,EAAU+6B,YAAc,ICLnC,UAAe9+C,eANS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC4lB,UAAW8mC,GAAyBhwD,MAGZ,GAE1B,CAA2DgG,Y,6gBCRpD,IAAMiqD,GAAoBtxD,UAAH,MAIjBq7C,GAAsBr7C,UAAH,KAEVG,WAAY,UAWrBoxD,GAAiBvxD,UAAH,M,GC2BY,kBAACwxD,GAAD,CAA8BxwD,IAAI,wBApCnEywD,GAAW,SAAC,GAaZ,IAZJf,EAYI,EAZJA,sBACAp6B,EAWI,EAXJA,eACAjK,EAUI,EAVJA,OACA1U,EASI,EATJA,mBACAJ,EAQI,EARJA,YACAiwC,EAOI,EAPJA,wBACArxB,EAMI,EANJA,QACAmnB,EAKI,EALJA,yBACAC,EAII,EAJJA,cACAqL,EAGI,EAHJA,kBACAtnD,EAEI,EAFJA,KACAuW,EACI,EADJA,SAIM65C,GAAOp/C,cAAQ,WACnB,GAAIgkB,GAAkBsyB,EAAmB,CACvC,IAAMpM,EAAQF,GAAShmB,GACjBq7B,EAAqBtU,GACzB,CAACb,QAAOrmB,UAASte,WAAUwU,SAAQ/qB,OAAMg8C,2BAA0BC,kBAGrE,OAAO,kBAAC+T,GAAD,CAAmB35C,mBAAoBA,EAAoB3W,IAAG,uBAAkBw7C,EAAM11C,KAC3F,kBAAC8qD,GAAD,CACE5wD,IAAG,gBAAWw7C,EAAM11C,IACpBypD,kBAAmBoB,QAIxB,CAACr7B,EAAgBH,EAASmnB,EAA0BsL,IAEjDiJ,GAAYv/C,cAAQ,WACxB,GAAIgkB,EAAgB,CAClB,IAAMw7B,EvDpCgB,SAAAx7B,GAAc,OACxCA,EAAevpB,SAAS5G,MAAK,SAAA6G,GAAK,OAAIA,EAAMye,gBAAkB4D,kCuDmCxC0iC,CAAaz7B,GACzBrvB,EAAU,GAAH,YACPugD,EAA0B,CAAC,IAA6D,IADjF,MAES,IAAhBjwC,GAAyBu6C,EACzB,CAAC,kBAACE,GAAD,CACDhxD,IAAG,qBAAgB8wD,EAAUhrD,IAC7BwjB,WAAYwnC,EACZzlC,OAAQA,EACRnH,SAAUwrC,KAEV,KAGN,GAAIzpD,EAAQhB,OAAS,GAAK6rD,EACxB,OAAO,kBAAC,GAAD,CAAqB9wD,IAAG,4BAAuB8wD,EAAUhrD,KAC7DG,MAIN,CAACypD,EAAuBp6B,IAE3B,OACE,kBAAChO,GAAA,EAAD,CACEC,SAAU,CAAC+N,GACXhN,YA5CQ,SAACxiB,GAAD,IAAK4kB,EAAL,uDAAc,GAAd,OAAqBpqB,EAAK+J,cAAc,CAACvE,MAAK4kB,GA4CzC9Y,CAAI,mCAEjB,kBAAC2+C,GAAD,KACGM,EACAH,KAiCHpxC,GAAW,SAAC1a,EAAW2a,GAE3B,OAAuB,IADV/D,OAAOzC,KAAK0G,gBAAc7a,EAAW2a,IACtCta,QAGd,MC7GA,GD6GeK,SAAWmrD,GAAUnxC,IEzFpC,UAAe9Z,eAjBS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC2xB,eAAgBj1B,EAAMg0B,KAAKiB,eAC3B/L,UAAWlpB,EAAMkpB,UAAUA,UAC3B0nC,eAAgB5wD,EAAMg0B,KAAKtzB,SAASrB,KAAI,SAAAuS,GAAC,OAAIA,EAAEipC,SAC/ChlC,WAAY7V,EAAMk0B,WAAWre,WAC7BmV,OAAQhrB,EAAMk0B,WAAWlJ,OACzBqkC,sBAAuBrvD,EAAMg0B,KAAKgjB,WAClCmP,wBAAyBnmD,EAAMkpB,UAAUi9B,wBACzC7vC,mBAAoBtW,EAAMoF,MAAMkR,mBAChCJ,YAAalW,EAAMoF,MAAM8Q,YACzB4e,QAAS90B,EAAMg0B,KAAKc,QACpBte,SAAUxW,EAAMg0B,KAAKxd,SACrBylC,yBAA0Bj8C,EAAM+O,YAAYyJ,QAC5C+uC,kBAAmBvnD,EAAM+O,YAAYw4C,kBACrCrL,cAAel8C,EAAMoF,MAAM82C,iBAGW,KAAxC,EAA8CxzC,SAAW0nD,K,uwBCnBlD,IAAMS,GAAiBlyD,UAAH,MAOK,kBAAyC,WAAzC,EAAE0X,eAAkD,OAAS,WAGzF,kBAAyC,WAAzC,EAAEA,gBAAoB,2DAMby6C,GAAkBnyD,UAAH,MAGxB,qBAAEusD,YAAiB,mHAcV6F,GAAapyD,UAAH,KAKFkyD,GAEAjyD,YAAa,IAC5BoP,MAIOgjD,GAAWryD,UAAH,M,GC7BV,kBAACsyD,GAAD,M,GAWH,kBAACA,GAAD,MAaR,SAnCmB,SAAC,GAKd,IAJJ56C,EAII,EAJJA,eACA+/B,EAGI,EAHJA,oBACA9/B,EAEI,EAFJA,mBACA46C,EACI,EADJA,uBAMA,GAAI76C,IAAmBw/B,OACrB,UAGF,IAAMsb,EAA8C,SAAvB76C,EAAgCw6C,GAAkBD,GAE/E,OACE,kBAACM,EAAD,CAAsB96C,eAAgBA,EAAgB60C,YAAa9U,GACjE,kBAAC2a,GAAD,KACE,kBAACK,GAAD,CAAqBlG,YAAa9U,EAAqBsW,eAbtC,WACrBwE,GAAwB9a,OActB,kBAAC4a,GAAD,CAAU36C,eAAgBA,GAA1B,MCrBN,IAAMnR,GAAoB,CACxBmxC,WhFUwB,iBAAO,CAC/Bz1C,KAnBwB,0BgFSxBywD,wBACAjZ,mBACA8Y,uBhFsDoC,SAAA9a,GAAmB,MAAK,CAC5Dx1C,KA1DuC,uCA2DvCC,QAAS,CACPu1C,0BgFhDJ,MCnBA,IDmBejxC,eANS,SAAAnF,GAAK,MAAK,CAChCqW,eAAgBrW,EAAMoF,MAAMiR,eAC5BC,mBAAoBtW,EAAMoF,MAAMkR,mBAChC8/B,oBAAqBp2C,EAAMk0B,WAAWkiB,uBAGAlxC,GAAxC,EAA2DwD,SAAW4oD,KEItE,IAEaC,GAAqB,SAAAnsD,GAAK,OACrCosD,GAAerrD,QAAO,SAACgG,EAAKslD,GAI1B,YAPiCxkD,IAInB7H,EAAMqsD,EAAc7lD,OAChCO,EAAI0c,KAAK4oC,EAAclwD,OAAd,MAAAkwD,EAAa,KAAWA,EAAcC,YAAYtsD,MAEtD+G,IACN,KAEQwlD,GACN,EADMA,GAEL,EAFKA,GAGF,EAaLH,GAAiB,CACrB,CACE5lD,KAAM,aACNrK,OlFxByB,SAAAsU,GAAU,MAAK,CAC1CjV,KA5B6B,6BA6B7BC,QAAS,CACPgV,gBkFsBA67C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMyQ,aAC7B+7C,OAAQD,IAEV,CACE/lD,KAAM,WACNrK,OlFTuB,SAAAyU,GAAQ,MAAK,CACtCpV,KA9C2B,2BA+C3BC,QAAS,CACPmV,ckFOA07C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM4Q,WAC7B47C,OAAQD,IAEV,CACE/lD,KAAM,QACNrK,O9EiCoB,SAAAwU,GAAK,MAAK,CAChCnV,KA9FuB,iBA+FvBC,QAAS,CACPkV,W8EnCA27C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM2Q,QAC7B67C,OAAQD,IAEV,CACE/lD,KAAM,QACNrK,O9EkCoB,SAAAuU,GAAK,MAAK,CAChClV,KApGuB,iBAqGvBC,QAAS,CACPiV,W8EpCA47C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM0Q,QAC7B87C,OAAQD,IAEV,CACE/lD,KAAM,gBACNrK,O9EmE4B,SAAA0U,GAAa,MAAK,CAChDrV,KAlIgC,0BAmIhCC,QAAS,CACPoV,mB8ErEAy7C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM6Q,gBAC7B27C,OAAQD,IAEV,CACE/lD,KAAM,iBACNrK,OAAQq0C,EACR8b,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMiR,iBAC7Bu7C,OAAQD,IAEV,CACE/lD,KAAM,qBACNrK,OlF9CiC,SAAA+U,GAAkB,MAAK,CAC1D1V,KAxCsC,sCAyCtCC,QAAS,CACPyV,wBkF4CAo7C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMkR,qBAC7Bs7C,OAAQD,IAEV,CACE/lD,KAAM,sBACNrK,O7ElCkC,SAAA0kD,GAAmB,MAAK,CAC5DrlD,KAxDuC,uCAyDvCC,QAAS,CACPolD,yB6EgCAyL,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM6gD,sBAC7B2L,OAAQD,IAEV,CACE/lD,KAAM,qBACNrK,O7E/CiC,SAAAukD,GAAkB,MAAK,CAC1DllD,KAlDsC,sCAmDtCC,QAAS,CACPilD,wB6E6CA4L,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM0gD,qBAC7B8L,OAAQD,IAEV,CACE/lD,KAAM,YACNhL,KAAM,UACNW,OAAQo4C,GACR+X,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM8jB,YAC7B0oC,OAAQD,IAEV,CACE/lD,KAAM,SACNrK,OlF9EqB,SAAAypB,GAAM,MAAK,CAClCpqB,KAlCwB,wBAmCxBC,QAAS,CACPmqB,YkF4EA0mC,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM4lB,SAC7B4mC,OAAQD,IAEV,CACE/lD,KAAM,qBACNrK,OAAQswD,EACRH,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMsqC,qBAC7BkiB,OAAQD,IAEV,CACE/lD,KAAM,WACNrK,O9EiFuB,SAAAmV,GAAQ,MAAK,CACtC9V,KAvL2B,qBAwL3BC,QAAS,CACP6V,c8EnFAg7C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMsR,WAC7Bk7C,OAAQD,IAEV,CACE/lD,KAAM,WACNrK,O9EwIuB,SAAAiV,GAAQ,MAAK,CACtC5V,KA3O0B,oBA4O1BC,QAAS,CACP2V,c8E1IAk7C,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMoR,WAC7Bo7C,OAAQD,IAEV,CACE/lD,KAAM,MACNrK,O9EyGuB,SAAA03C,GAAQ,MAAK,CACtCr4C,KAtN2B,qBAuN3BC,QAAS,CACPo4C,c8E3GAyY,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMq0C,MAC7BmY,OAAQD,IAEV,CACE/lD,KAAM,OACNrK,O9E0GwB,SAAA23C,GAAS,MAAK,CACxCt4C,KA5N4B,sBA6N5BC,QAAS,CACPq4C,e8E5GAwY,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMsT,OAC7Bk5C,OAAQD,IAEV,CACE/lD,KAAM,gBACNrK,O9E2GiC,SAAA43C,GAAkB,MAAK,CAC1Dv4C,KAlOsC,gCAmOtCC,QAAS,CACPs4C,wB8E7GAuY,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAM6Q,gBAC7B27C,OAAQD,IAEV,CACE/lD,KAAM,sBACNrK,OlFpF8C,SAAA60C,GAAmB,MAAK,CACxEx1C,KAhEqD,qDAiErDC,QAAS,CACPu1C,yBkFkFAsb,YAAa,SAAAtsD,GAAK,MAAI,CAACA,EAAMgxC,sBAC7Bwb,OAAQD,KC3JZ,kBAAevsD,GAAK,MAAK,CACvB0sD,IAAA,UAAK,8EACH,OADG,UACGnxD,Q/EyJuC,CAC/CC,KA7IgC,gCA8IhCC,QAAS,CACP+nB,a+E5J2BxjB,EAAM4lB,QAAU5lB,EAAM4lB,OAAOpC,gBADrD,0CAGL+H,WAAU,UAAE,WAAW1H,EAAYC,GAAvB,iEACV,OADU,UACJvoB,QAAI42C,GAAiBtuB,EAAYC,IAD7B,0CAGZ6oC,KAAI,UAAE,WAAW9oC,EAAYC,GAAvB,iEACJ,OADI,UACEvoB,QAAI62C,GAAetuB,IADrB,4C,8+BCeR,IAEM5jB,GAAkB,CACtB,aACA,aACA,iBACA,gBACA,iBACA,+B,GAIgB,kBAAC,GAAD,MADZE,GAAU,SAACC,EAAIL,GAAmC,IAA5BM,EAA4B,uDAAnB,GAAIC,EAAe,uCAChDC,EAAU,GAEZC,EAAQT,EAAMS,MAEZmsD,EAAmB,SACpBphC,GAAcxrB,IACbA,EAAMwrB,eAAiB,IAGvBI,EAAU,IACdihC,SAAU,OACVj8C,SAAU5Q,EAAM4Q,UACZ5Q,EAAM8sD,eAAiB,IAGxBrsD,EAmBHA,EAAM6Y,ShF8DoB,CAC5B9d,KAzHqB,kBgFwCnBiF,EAAQC,gBAAuBC,GAAUtE,GAAO2D,EA5BhC,eA8BhBpE,eAA0B6E,EAAOH,GACjCiR,eAAyB9Q,EAAOH,EAAOiQ,YACvCkX,eAAwBhnB,GAAO,GAC/B4W,eAAwB5W,GAAO,GAC/BG,eAAmBH,EAAO,CACxBwoB,QAAS8jC,IACT5jC,QAAS6jC,GACTxhC,cAAeohC,EACfnhC,aAAczrB,EAAMi8C,mBACpB3rC,mBAAoBtQ,EAAMsQ,mBAC1Bsb,YAEFV,eAAoBzqB,EAAO,CAAC0oB,QAAS6jC,GAAe18C,mBAAoBtQ,EAAMsQ,qBAE9E7P,EAAM6Y,SAAS1d,sBAAiC,gBAAiB6E,KAKnE,IAAMQ,EAAMP,cAjDM,cAmDhBF,EACAC,EACA,CACET,QACAM,SACAM,QAASurD,GAAmBnsD,GAC5BO,aACAM,oBAAqB,CAAC,YAAa,YAWvC,OAAOI,GAkBLP,0BAvFgB,cAuF8BN,IAIlD,IAAM46B,GAAY,SAAA98B,GAAK,OACrBgC,GAAgBa,QAAO,SAACT,EAAQU,GAI9B,OAHI9C,EAAM8C,KACRV,EAAOU,GAAS9C,EAAM8C,IAEjBV,IACN,KAEC0sD,e,qBACJ,WAAY9uD,GAAO,0BACjB,cAAMA,IACD+C,IAAMb,GAAQlC,EAAMmC,GAAInC,EAAO88B,GAAU98B,IAF7B,E,uDAKAiB,GAAW,IF1FDa,EE0FC,OACtBitD,EAAeC,IAAQ5tD,KAAKpB,OAAO,SAAC5D,EAAOC,GAAR,OAAiBopC,IAASrpC,EAAO6E,EAAU5E,OACpF,GAAI0yD,EAAaxsD,YAAoC,IAApBtB,EAAUsB,MAUzCnB,KAAK2B,IAAMb,GAAQd,KAAKpB,MAAMmC,GAAIf,KAAKpB,MAAO88B,GAAU17B,KAAKpB,aACxD,IAAKivD,IAASF,GAAe,CAClCd,GAAmBc,GAAct0C,SAAQ,SAAAxc,GACvC,EAAK8E,IAAIR,MAAM6Y,SAASnd,MAG1B,IAAMixD,GF5GmBptD,EE4GYitD,EF3GlCl3C,OAAOzC,KAAKtT,GAAOe,QAAO,SAACuD,EAAK/J,GACrC,IAAM8xD,EAAgBD,GAAe1sD,MAAK,SAAA2tD,GAAE,OAAIA,EAAG7mD,OAASjM,KAC5D,OAAI8xD,GAAiBA,EAAcG,OAASloD,EACnC+nD,EAAcG,OAEhBloD,IACNioD,KEsGKa,IAAiBb,GACnBjtD,KAAK2B,IAAIR,MAAM6Y,SpFzFS,CAC9B9d,KAxDwB,0BoFiJT4xD,IAAiBb,IAC1BjtD,KAAK2B,IAAIR,MAAM6Y,SpF/FU,CAC/B9d,KAnDyB,8B,+BoFuJvB,OAAO8D,KAAK2B,IAAIC,c,EAlCd8rD,CAAsBntD,eAiF5B,a,sSCzMaytD,EAA0B,SAAAC,GAAoB,MAAK,CAC9D/xD,KANmC,6CAOnCC,QAAS,CACP8xD,0BAISC,EAAkB,SAAAC,GAAY,MAAK,CAC9CjyD,KAX+B,yCAY/BC,QAAS,CACPgyD,kBAWSC,EAAkB,SAAAC,GAAY,MAAK,CAC9CnyD,KAxBgC,0CAyBhCC,QAAS,CACPkyD,kBClBSC,EAAqB,SAAAC,GAAe,MAAK,CACpDryD,KAX8B,yBAY9BC,QAAS,CACPoyD,qBCTSjR,EAAa,SAAAxL,GAAI,MAAK,CACjC51C,KANyB,oBAOzBC,QAAS,CACP21C,UAIS0c,EAAc,SAAAjwC,GAAQ,MAAK,CACtCriB,KAZ0B,qBAa1BC,QAAS,CACPoiB,cAISkwC,EAAc,SAAAC,GAAQ,MAAK,CACtCxyD,KAlB0B,qBAmB1BC,QAAS,CACPuyD,c,qDCtBSC,EACC,aADDA,EAEO,mBAFPA,EAGG,eAHHA,EAIM,kBAJNA,EAKc,0B,u8CCMpB,IAAMC,GAAuB30D,WAAH,KAgB7B40D,MAGSC,GAA8B70D,SAAH,KAElC80D,MAIOC,IAAoB/0D,QAAOgP,IAAPhP,CAAH,KAEbC,UAAW,KACPE,WAAY,UAcpB60D,IAA0Bh1D,QAAOgP,IAAPhP,CAAH,KAIvBG,WAAY,YAWZ80D,GAAyBj1D,SAAH,KAC/Bk1D,KAKExwD,M,GCKK,kBAAC,aAAD,KACD,kBAAC+T,EAAA,MAAD,KAAe,kBAAC,IAAD,CAAkB3R,GAAG,6BACpC,kBAAC2R,EAAA,KAAD,KAAc,kBAAC,IAAD,CAAkB3R,GAAG,qCA+F7C,MC9KA,GDiBkB,SAAC,GAab,IAZJquD,EAYI,EAZJA,WACA9R,EAWI,EAXJA,WACA/hD,EAUI,EAVJA,KACA0nB,EASI,EATJA,MACAosC,EAQI,EARJA,aACA90D,EAOI,EAPJA,QACAm0D,EAMI,EANJA,SACAY,EAKI,EALJA,mBACAb,EAII,EAJJA,YACAD,EAGI,EAHJA,YACA1qD,EAEI,EAFJA,UACAya,EACI,EADJA,SACI,GAC4Btb,eAAS,GADrC,WACGssD,EADH,KACaC,EADb,KAEEC,GAAexjD,cAEfY,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,SAEtCwC,gBAAU,WACJ+rD,GACFI,MAED,CAACJ,IAEJ,IAAMI,EAAY,+BAAG,WAAMxiD,GAAN,0EACfA,GACFA,EAAEG,iBAGAsiD,EAAiB,MACjBL,EANe,gCAOMG,EAAa9iD,QAAQijD,eAP3B,OAOjBD,EAPiB,OAQjBF,EAAa9iD,QAAQkjD,QARJ,OAWnB5sC,EAAM1E,EAAUmwC,EAAUiB,GAXP,2CAAH,sDAwBZG,EAAiB,SAAA5iD,GACG,oBAApBA,EAAE6iD,eACJP,GAAY,IAIVQ,IAAkBzxC,EAClB0xC,GAAiBD,EAEvB,OAAO,kBAACd,GAAD,KACJprD,GAAS,GAKV,0BAAM8lB,SAAU8lC,GACd,kBAACtuB,EAAA,EAAD,CACEnG,WAAY1c,GAAYgxC,EACxBxuD,GAAG,iBACHlD,MAAOgP,EAAI,sCAEX,kBAACiiD,GAAD,KACE,kBAACF,GAAD,CACEsB,UAAWD,EACX/oD,KAAK,OACLC,UAAQ,wBACR6O,SApCmB,SAAA9I,GAC3BshD,EAAYthD,EAAEtC,OAAO5P,OACrBw0D,GAAY,IAmCJhtC,UAAQ,EACRtmB,KAAK,OACLlB,MAAOujB,EACP4xC,iBAAkBL,EAClBM,QAAS,SAAAljD,GAAC,OAAIA,EAAEtC,OAAOpP,cAK7B,kBAAC4lC,EAAA,EAAD,CACEnG,WAAYyzB,GAAYa,EACxBxuD,GAAG,iBACHlD,MAAOgP,EAAI,0CAEX,kBAACiiD,GAAD,KACE,kBAACF,GAAD,CACEsB,UAAWF,EACX9oD,KAAK,WACLC,UAAQ,4BACR6O,SAnDmB,SAAA9I,GAC3BuhD,EAAYvhD,EAAEtC,OAAO5P,OACrBw0D,GAAY,IAkDJhtC,UAAQ,EACRtmB,KAAK,WACLlB,MAAO0zD,EACPyB,iBAAkBL,EAClBM,QAAS,SAAAljD,GAAC,OAAIA,EAAEtC,OAAOpP,cAM3BjB,GAAWA,EAAQmW,MACZ,kBAAC2/C,EAAA,QAAD,KACD,kBAACA,EAAA,QAAD,CACEC,UAAW/1D,EAAQg2D,SAAW,SAAW,OACzC1yD,MAAOtD,EAAQmW,QAIxB0+C,GAAcE,GAAsB,kBAAC,IAAD,CACnCtiD,IAAKyiD,EACLe,MAAM,cACNrsD,KAAK,YACLssD,QAASrB,EACTsB,GAAIn1D,EAAKI,SAEX,kBAACqzD,GAAD,CACE7vC,UAAWowC,IAAaF,GAA6B,KAAb9wC,GAAgC,KAAbmwC,GAC3DrzC,IAAI,UACJnF,KAAK,SACLrY,MAAOgP,EAAI,4BACX8jD,QAAStB,EACTnzD,KAAK,SACLiL,UAAQ,4BAEV,kBAAC8nD,GAAD,CACEpxD,MAAOgP,EAAI,gCACXtN,QAAS,kBAAM+9C,EAAWqR,IAC1BxnD,UAAQ,iCExJT,ICOD3G,GAAoB,CACxB88C,aACAkR,cACAC,cACAxrC,MDHmB,SAAC1E,EAAUmwC,EAAUkC,GAArB,MAAuC,CAC1D10D,KAPmB,cAQnBC,QAAS,CACPoiB,WACAmwC,WACAkC,mBCUJ,UAAenwD,cATS,SAAAnF,GAAK,MAAK,CAChCijB,SAAUjjB,EAAM2nB,MAAM1E,SACtBmwC,SAAUpzD,EAAM2nB,MAAMyrC,SACtBn0D,QAASe,EAAMu1D,UAAUt2D,QACzB80D,aAAc/zD,EAAMu1D,UAAUxB,aAC9BD,WAAY9zD,EAAM2nB,MAAMmsC,WACxBE,mBAAoBh0D,EAAMu1D,UAAUvB,sBAGE9uD,GAAxC,EAA2DwD,QAAW8sD,K,iOCjB/D,IAAMC,GAAsB92D,kBAAmB,SAAA2E,GAAK,MAAK,CAC9D1C,KAAM,cAD2BjC,CAAH,KAI1B40D,MAIOmC,GAA6B/2D,SAAH,KAEjC80D,MCiCN,SA3CsB,SAAAnwD,GACpB,IAAMqyD,EAAYryD,EAAM5D,WACJuN,IAAhB3J,EAAMmrB,MACF,KACAnrB,EAAMmrB,MACJxO,uBACAA,sBACN,KAEJ,OACE,kBAAC6lB,EAAA,EAAD,CACEnG,WAAYr8B,EAAM5D,MAClB+F,GAAE,UAAKnC,EAAMsI,KAAX,UACFu7B,WAA8B,IAAnB7jC,EAAMoyB,SACjBnzB,MAAOe,EAAMf,MACbqzD,OAAQD,GAER,kBAACD,GAAD,CAA4BvuB,WAA8B,IAAnB7jC,EAAMoyB,UAC3C,kBAAC+/B,GAAD,CACEhwD,GAAE,UAAKnC,EAAMsI,KAAX,UACFlM,MAAO4D,EAAM5D,MACbgb,SAAU,SAAA9I,GAAC,OAAItO,EAAMoX,SAAS9I,EAAEtC,OAAO5P,QACvCmkB,UAA6B,IAAnBvgB,EAAMoyB,SAChByR,WAA8B,IAAnB7jC,EAAMoyB,SACjB/jB,UAAWrO,EAAMqO,UACjBijD,UAAWtxD,EAAMsxD,e,iGC5B3B,SAAej2D,SAAf,KACI0E,MCoCJ,MCtCA,GDEwB,SAAAC,GAAK,OAC3B,kBAACyxD,EAAA,QAAD,KACGzxD,EAAMuyD,MAAMx2D,KAAI,SAACy2D,EAAM5hD,GACtB,IAAI8gD,EAAY,KAEZ/1D,EAAU62D,EAAK72D,QAEnB,GAAIqE,EAAMkpB,OAAQ,CAChB,IAAMwZ,EAAQ1iC,EAAMkpB,OAAOspC,EAAKlqD,OAClB,IAAVo6B,EACFgvB,EAAY/0C,sBACc,iBAAV+lB,GAChBgvB,EAAY/0C,sBACZhhB,EAAU+mC,GAEVgvB,EAAY/0C,uBAIhB,OACE,kBAAC80C,EAAA,QAAD,CACEC,UAAWA,EACXr1D,IAAKuU,EACL3R,MAAOtD,SE3BV,IAEMsxC,GAAW,CACtBwlB,oBAAqB,iDACrBC,iBAAkB,+CCmBpB,MCrBA,GDSuB,SAAA1yD,GAAK,OAC1B,kBAACyxD,EAAA,QAAD,KACE,kBAACA,EAAA,QAAD,CAAiBC,UAAW/0C,uBAC1B,kBAAC,IAAD,CAAkBxa,IAPJ6mB,EAOmBhpB,EAAMgpB,UANpCikB,GAASjkB,IDRK,2CCOvB,IAAoBA,G,kFEMpB,IAAM2pC,GAA+Bt3D,SAAH,M,GAyDvB,kBAACsoB,GAAA,EAAD,M,GAYF,kBAAC7P,EAAA,MAAD,KAAe,kBAAC,IAAD,CAAkB3R,GAAG,uC,GAEpC,kBAAC2R,EAAA,KAAD,KAAc,kBAAC,IAAD,CAAkB3R,GAAG,8C,GA6C/B,kBAACsvD,EAAA,QAAD,KACD,kBAACA,EAAA,QAAD,CAAiBC,UAAU,SAASzyD,MAAO,kBAAC,IAAD,CAAkBkD,GAAG,2CAgD5E,MChLA,GDe6B,SAAC,GAcxB,IAbJquD,EAaI,EAbJA,WACAoC,EAYI,EAZJA,qBACArD,EAWI,EAXJA,aACA1c,EAUI,EAVJA,YACAl2C,EASI,EATJA,KACAmzD,EAQI,EARJA,SACA+C,EAOI,EAPJA,aACAxD,EAMI,EANJA,qBACAnqD,EAKI,EALJA,UACA4tD,EAII,EAJJA,kBACAC,EAGI,EAHJA,wBACAC,EAEI,EAFJA,kBACAC,EACI,EADJA,gBAEMpC,GAAexjD,eAErB1I,gBAAU,WACRiuD,MACC,KAEHjuD,gBAAU,WACJsuD,GACFpgB,MAED,CAACogB,IAEJ,IAAMnC,EAAY,+BAAG,WAAMxiD,GAAN,0EACnBA,EAAEG,kBAEsB,IAApBykD,IAHe,gCAIYrC,EAAa9iD,QAAQijD,eAJjC,OAIXD,EAJW,OAKjBF,EAAa9iD,QAAQkjD,QACrB4B,EAAa9B,GANI,2CAAH,sDAUZmC,EAAgB,WACpB,QAAKpD,EAASqD,oBAGVrD,EAASsD,cAAgBtD,EAASqD,oBAGlCrD,EAASuD,wBAMTplD,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEtC,IAAK8wD,EACH,UAGF,IAAMK,EAAsBxD,EAASuD,sBAC/BE,GAAwBzD,EAAS0D,aAAenE,GACjDS,EAASuD,sBACRI,GAA6B3D,EAASsD,aACvCtD,EAASuD,uBACRvD,EAAS4D,6BAA+B77C,OAAOzC,KAAK06C,EAAS4D,6BAA6BpyD,OAAS,EAEzG,OAAO,kBAACqyD,GAAD,KACJzuD,GAAS,GAETqqD,GAAY,GAEb,0BAAMvkC,SAAU8lC,IACY,IAAzBzB,GACI,kBAAC,GAAD,MACDpG,SAAU,EACVhqD,MAAOgP,EAAI,2CACX3F,KAAK,cACLlM,MAAO0zD,EAAS0D,YAChBp8C,SAAU47C,EACV5gC,SAAUkhC,EACVhC,WAAS,GACJxB,EAAS8D,sBAA6D,wBAArC9D,EAAS+D,yBAC1C,CAAC1oC,OAAO,KAGjB,kBAAC,GAAD,CACE89B,SAAU,EACVhqD,MAAOgP,EAAI,2CACX3F,KAAK,cACLlM,MAAO0zD,EAASsD,YAChBh8C,SAAU07C,EACV1gC,SAAUmhC,EACVjC,WAAoC,IAAzBjC,EACXlkC,OAAQsoC,IAEV,kBAACd,GAAD,KACE,kBAAC,GAAD,CACEJ,MAAOU,EACP/pC,OAAQ4mC,EAAS4D,4BACjBI,cAAehE,EAASsD,eAG5B,kBAAC,GAAD,CACEnK,SAAU,EACVhqD,MAAOgP,EAAI,iDACX3F,KAAK,oBACLlM,MAAO0zD,EAASqD,kBAChB/7C,SAAU27C,EACV3gC,SAAUqhC,EACVtoC,MAAO+nC,MAIPpD,EAASqD,mBACJrD,EAASsD,cAAgBtD,EAASqD,mBADvC,IAOiC,IAAlCrD,EAAS8D,sBAAiC,kBAAC,GAAD,CAAgB5qC,UAAW8mC,EAAS+D,0BAC/E,kBAACzD,GAAD,CACE2B,QAASjC,EAASuD,sBAClB9yC,UAA8B,IAApB2yC,IACVz2C,IAAI,UACJxd,MAAOgP,EAAI,0CACXqJ,KAAK,SACLha,KAAK,WAENkzD,GAAc,kBAAC,IAAD,CACbpiD,IAAKyiD,EACLe,MAAM,cACNrsD,KAAK,YACLssD,QAASrB,EACTsB,GAAIn1D,EAAKI,YEpJV,ICAMg3D,GAAsB,2CACtBC,GAAsB,2CAItBC,GAAgB,qCAGhBC,GAAW,gCAGXlB,GAAoB,SAAAQ,GAAW,MAAK,CAC/Cl2D,KAAMy2D,GACNx2D,QAAS,CACPi2D,iBAkBSW,GAAiC,SAAAjrC,GAAM,MAAK,CACvD5rB,KA9BgD,0DA+BhDC,QAAS,CACP2rB,YAsBSkrC,GAAsB,SAACprC,EAAWqrC,GAAZ,MAAoC,CACrE/2D,KAnDmC,6CAoDnCC,QAAS,CACPyrB,YACAqrC,wBCnDEzyD,GAAoB,CACxBoxD,qBACAF,kBDM+B,SAAAM,GAAW,MAAK,CAC/C91D,KAAM02D,GACNz2D,QAAS,CACP61D,iBCRFL,wBD0BqC,SAAAI,GAAiB,MAAK,CAC3D71D,KApCwC,kDAqCxCC,QAAS,CACP41D,uBC5BFP,qBCXkC,iBAAO,CACzCt1D,KAJoC,gDDepCu1D,aD+B0B,SAAAb,GAAY,MAAK,CAC3C10D,KAAM22D,GACN12D,QAAS,CACPy0D,kBCjCFnf,YFdyB,iBAAO,CAChCv1C,KAHyB,iBE2B3B,UAAeuE,cARS,SAAAnF,GAAK,MAAK,CAChCozD,SAAUpzD,EAAM43D,eAAexE,SAC/BmD,gBAAiBv2D,EAAM43D,eAAerB,gBACtC5D,qBAAsB3yD,EAAM43D,eAAeC,OAAOlF,qBAClDE,aAAc7yD,EAAM43D,eAAeC,OAAOhF,aAC1CiB,WAAY9zD,EAAM2nB,MAAMmsC,cAGc5uD,GAAxC,EAA2DwD,QAAWovD,K,gbEazD,kBAAC1gD,EAAA,MAAD,KAAe,kBAAC,IAAD,CAAkB3R,GAAG,wC,GACzC,kBAAC2R,EAAA,KAAD,KAAc,kBAAC,IAAD,CAAkB3R,GAAG,+CCvC3C,SDeA,iCACE,WAAYnC,GAAO,0BACjB,cAAMA,IACDtD,MAAQ,CACXijB,SAAU,EAAK3f,MAAM2f,UAAY,IAHlB,EADrB,iDAQerR,GACXA,EAAEG,iBACFrN,KAAKpB,MAAMy0D,gBAAgBrzD,KAAK1E,MAAMijB,YAV1C,2CAauBrR,GACnBlN,KAAKqa,SAAS,CACZkE,SAAUrR,EAAEtC,OAAO5P,UAfzB,+BAmBW,WACP,OACE,kBAACk0D,GAAD,KACGlvD,KAAKpB,MAAMkF,WAAX,GADH,GAIE,0BAAM8lB,SAAU5pB,KAAK0vD,aAAa4D,KAAKtzD,OACrC,kBAACohC,EAAA,EAAD,CACEnG,WAAYj7B,KAAK1E,MAAMijB,SACvBxd,GAAG,iBACHlD,MAAOmC,KAAK6M,IAAI,sCAEhB,kBAACiiD,GAAD,KACE,kBAACF,GAAD,CACE1nD,KAAK,OACL8O,SAAUhW,KAAKuzD,qBAAqBD,KAAKtzD,MACzCwiB,UAAQ,EACRtmB,KAAK,OACLlB,MAAOgF,KAAK1E,MAAMijB,SAClBpX,UAAQ,6BAKd,kBAAC6nD,GAAD,CACE94C,KAAK,SACLiJ,UAAWnf,KAAK1E,MAAMijB,UAAYve,KAAKpB,MAAM+xD,QAC7Ct1C,IAAI,UACJxd,MAAOmC,KAAK6M,IAAI,uCAChB8jD,QAAS3wD,KAAKpB,MAAM+xD,QACpBz0D,KAAK,SACLiL,UAAQ,mCAEV,kBAAC8nD,GAAD,CACE9vC,SAAUnf,KAAKpB,MAAM+xD,QACrB9yD,MAAOmC,KAAK6M,IAAI,4CAChB3F,KAAK,QACL3H,QAAS,kBAAM,EAAKX,MAAM0+C,WAAWqR,IACrCxnD,UAAQ,sCAzDpB,0BAgEMpG,GACF,OAAOf,KAAKpB,MAAMrD,KAAK+J,cAAc,CACnCvE,WAlEN,GAAqCR,eEVrC,IAAMC,GAAoB,CACxB88C,aACA+V,gBxBL6B,SAAA90C,GAAQ,MAAK,CAC1CriB,KAL8B,yBAM9BC,QAAS,CACPoiB,ewBUJ,UAAe9d,cALS,SAAAnF,GAAK,MAAK,CAChCijB,SAAUjjB,EAAM2nB,MAAM1E,SACtBoyC,QAASr1D,EAAMu1D,UAAUxB,gBAGa7uD,GAAxC,EAA2DwD,QAAWwvD,K,+LCb/D,IAAMC,GAAqBx5D,SAAH,KAC3B0E,KAIA+0D,KACE7E,M,GCoBY,kBAACn8C,EAAA,MAAD,KAAe,kBAAC,IAAD,CAAkB3R,GAAG,6B,GAEhD,kBAAC2R,EAAA,KAAD,KAAc,kBAAC,IAAD,CAAkB3R,GAAG,4CAqCzC,MCnEA,GDYyB,SAAC,GAAsE,IAArEwd,EAAqE,EAArEA,SAAUmwC,EAA2D,EAA3DA,SAAU5qD,EAAiD,EAAjDA,UAAWurD,EAAsC,EAAtCA,aAAcsE,EAAwB,EAAxBA,aAAcp4D,EAAU,EAAVA,KAAU,GAC9D0H,cAAS,MADqD,WACvF2wD,EADuF,KAC7EC,EAD6E,KAExFC,GAAS7nD,eAEf8nD,sBAAgB,WACKD,EAAOnnD,QAAQ4H,cAAc,SACrC3H,UACV,IAEH,IAKMC,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QACtC,OAAO,kBAAC0yD,GAAD,KACJ3vD,GAAa,GACd,0BAAM8lB,SARa,SAAA1c,GACnBA,EAAEG,iBACFsmD,EAAap1C,EAAUmwC,EAAUkF,IAMH5mD,IAAK8mD,GAAnC,GAEE,kBAAC1yB,EAAA,EAAD,CACEnG,WAAY24B,EACZ7yD,GAAG,sBACHlD,MAAOgP,EAAI,8CAEX,kBAACiiD,GAAD,KACE,kBAACv2B,GAAA,EAAD,CACEr8B,KAAK,UACLlB,MAAO44D,EACP5yD,OAAQ,CAACgV,SAAU69C,GACnBn8C,QAAS,CAAC0f,OAAQ,UAAW48B,mBAAmB,OAItD,kBAAChF,GAAD,CACE7vC,UAAWy0C,GAAYA,EAAS7tB,WAAW7lC,OAAS,GAAKmvD,EACzDh0C,IAAI,UACJxd,MAAOgP,EAAI,4BACXqJ,KAAK,SACLhP,KAAK,SACLypD,QAAStB,EACTnzD,KAAK,cEtDN,ICMDsE,GAAoB,CACxBmzD,aDJ0B,SAACp1C,EAAUmwC,EAAUkF,GAArB,MAAmC,CAC7D13D,KAJ0B,qBAK1BC,QAAS,CACPoiB,WACAmwC,WACAkF,eCQJ,UAAenzD,cANS,SAAAnF,GAAK,MAAK,CAChCijB,SAAUjjB,EAAM2nB,MAAM1E,SACtBmwC,SAAUpzD,EAAM2nB,MAAMyrC,SACtBW,aAAc/zD,EAAMu1D,UAAUxB,gBAGQ7uD,GAAxC,EAA2DwD,QAAWiwD,K,mBCJpD,kBAACvhD,EAAA,MAAD,KAAe,kBAAC,IAAD,CAAkB3R,GAAG,6BAwBtD,MClCA,GDQ+B,SAAC,GAAwD,IAAvDwd,EAAuD,EAAvDA,SAAUmwC,EAA6C,EAA7CA,SAAUwF,EAAmC,EAAnCA,OAAQpwD,EAA2B,EAA3BA,UAAWw5C,EAAgB,EAAhBA,WACtE,OAAO,6BACJx5C,GAAa,GACd,kBAAC,KAAD,CACEya,SAAUA,EACVmwC,SAAUA,EACVwF,OAAQA,EACRC,QAAQ,EACR90C,UAAW,WACTi+B,EAAWqR,QEdnB,IAAMnuD,GAAoB,CACxB88C,cASF,UAAe78C,cANS,SAAAnF,GAAK,MAAK,CAChCijB,SAAUjjB,EAAM2nB,MAAM1E,SACtBmwC,SAAUpzD,EAAM2nB,MAAMyrC,SACtBwF,OAAQ54D,EAAMq4D,aAAaO,UAGW1zD,GAAxC,CAA2D4zD,I,sICJ3D,IAAMC,IAA4BvyD,QAAH,M,GAa3B,kBAACuyD,GAAD,M,GAUa,kBAACC,GAAD,MAcjB,MC9CA,GDgBc,SAAA11D,GAKZ,OAJA2E,gBAAU,WACR3E,EAAM+yC,eACL,IAEI,uCAEH,WACA,OAAQ/yC,EAAMwzC,aACZ,KAAKuc,EACH,OAAO,kBAAC,GAAD,CAAyB7qD,UAAWlF,EAAMkF,YACnD,KAAK6qD,EACH,OAAO,kBAAC4F,GAAD,CAA0BzwD,UAAWlF,EAAMkF,YACpD,KAAK6qD,EACH,OAAO,kBAAC6F,GAAD,CAAuB1wD,UAAWlF,EAAMkF,YACjD,KAAK6qD,EACH,UACF,QACE,OAAO,kBAAC8F,GAAD,CAAoB3wD,UAAWlF,EAAMkF,aAXhD,KEnBN,IAAMtD,GAAoB,CACxBmxC,W7BUwB,iBAAO,CAC/Bz1C,KAlBwB,sB6Be1B,UAAeuE,cALS,SAACnF,EAAOsD,GAAR,MAAmB,CACzCwzC,YAAaxzC,EAAMwzC,aAAe92C,EAAM2nB,MAAMmvB,YAC9CtuC,UAAWlF,EAAMkF,aAGqBtD,GAAxC,EAA2DwD,QAAWC,K,gECVrDywD,I,YAIQ33D,IAJlB,SAAU23D,KAAV,iEACL,OADK,UACCz4D,SAAIK,sBAAiC,WADtC,wCAIQ,SAAUS,KAAV,iEACb,OADa,UACPR,SAAI,EACRC,SlBXuB,ckBWSk4D,MAFrB,wCCJR,SAASC,GAA6B9oB,GAC3C,IAAM/jB,EAAS,GAIf,OAHA+jB,EAASxyB,SAAQ,SAAA9e,GACfutB,EAAOvtB,EAAQq6D,UAAYr6D,EAAQA,WAE9ButB,E,qkBCPT,IAAMnrB,GAAe,CACnBy1D,YAAa,GACbJ,YAAa,GACbD,kBAAmB,GACnBO,4BAA6B,KAC7BL,uBAAuB,EACvBO,sBAAsB,EACtBC,wBAAyB,MAwDrBh2D,IAAe,aAClB6E,IAtDuB,SAAChG,EAAD,OAASa,EAAT,EAASA,QAAT,gBACrBb,GADqB,IAExB82D,YAAaj2D,EAAQi2D,iBAmDF,OnBhEW,yCmBgBT,SAAC92D,EAAD,OAASa,EAAT,EAASA,QAAT,gBAClBb,GADkB,IAErB02D,YAAa71D,EAAQ61D,iBA8CF,OnB/D6B,2DmBoBX,SAAC12D,EAAD,OAASa,EAAT,EAASA,QAAT,gBAClCb,GADkC,IAErCg3D,4BAA6Bn2D,EAAQ2rB,YAyClB,OnB9DqB,mDmBwBV,SAACxsB,EAAD,OAASa,EAAT,EAASA,QAAT,gBAC3Bb,GAD2B,IAE9By2D,kBAAmB51D,EAAQ41D,uBAoCR,OAKlBzwD,IAtCkB,SAAAhG,GAAK,gBACrBA,GADqB,IAExB22D,uBAAuB,EACvBO,sBAAsB,OA8BH,OnB5DgB,8CmBiCT,SAAAl3D,GAAK,OAC/BqB,MA0BmB,OnB3DgB,8CmBoCT,SAACrB,EAAD,GAAsB,IAAba,EAAa,EAAbA,QACnC,GAAIA,EAAQ82D,mBAAoB,CAC9B,IAAMnrC,EAAS6sC,GAA6Bx4D,EAAQ82D,oBACpD,gBACK33D,GADL,IAEE22D,uBAAuB,EACvBK,4BAA6BxqC,IAG/B,gBACKxsB,GADL,IAEE22D,uBAAuB,EACvBO,sBAAsB,EACtBC,wBAAyBt2D,EAAQyrB,eAUlB,OnBzDwB,sDmBoDX,SAACtsB,EAAD,KAASa,QAAT,gBAC7Bb,GAD6B,IAEhCk3D,sBAAsB,OAGH,IC1DrB,SDqEe,WAA+C,IAA9Bl3D,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,kBEzE5C,SAASu5D,GAAsBnG,EAAUoG,EAAOp+C,EAAKS,GACnD,GAAwB,iBAAbu3C,EACT,OAAO,EAGT,IAEMqG,EAFgBrG,EAASxuD,OACIwuD,EAASpvC,QAAQw1C,EAAO,IAAI50D,OAG/D,OAAQwW,SAAqCq+C,GAAsBr+C,KAC7DS,SAAqC49C,GAAsB59C,GAGnE,IAAM69C,IAAU,aAnByB,wBAoBV,SAAChD,EAAaI,GAAd,MACJ,iBAAhBJ,GAAmD,iBAAhBI,GAA4BJ,IAAgBI,KAF1E,OAlBW,UAqBV,SAACJ,EAAaI,EAAahB,GAA3B,MACU,iBAAhBY,SACiBzpD,IAApB6oD,EAAKpqC,OAAOtQ,KAAyC,OAApB06C,EAAKpqC,OAAOtQ,KAAgBs7C,EAAY9xD,QAAUkxD,EAAKpqC,OAAOtQ,YAC3EnO,IAApB6oD,EAAKpqC,OAAO7P,KAAyC,OAApBi6C,EAAKpqC,OAAO7P,KAAgB66C,EAAY9xD,QAAUkxD,EAAKpqC,OAAO7P,QANvF,OAjBqC,oCAwBV,SAAC66C,EAAaI,EAAahB,GAA3B,OACvCyD,GAAsB7C,EAAa,SAAUZ,EAAKpqC,OAAOtQ,IAAK06C,EAAKpqC,OAAO7P,QAR9D,OAhBqC,oCAyBV,SAAC66C,EAAaI,EAAahB,GAA3B,OACvCyD,GAAsB7C,EAAa,SAAUZ,EAAKpqC,OAAOtQ,IAAK06C,EAAKpqC,OAAO7P,QAV9D,OAfiC,gCA0BV,SAAC66C,EAAaI,EAAahB,GAA3B,OACnCyD,GAAsB7C,EAAa,SAAUZ,EAAKpqC,OAAOtQ,IAAK06C,EAAKpqC,OAAO7P,QAZ9D,IAiChB,SAlBA,SAAkB66C,EAAaI,EAAaP,GAC1C,IAAM/pC,EAAS,GAcf,OAZI+pC,GACFA,EAAgBx4C,SAAQ,SAAA+3C,GACtB,IAAM1pB,EAAYstB,GAAW5D,EAAKlqD,MAC9BwgC,KAEY,IADAA,EAAUsqB,EAAaI,EAAahB,KAEhDtpC,EAAOspC,EAAKlqD,OAAQ,OAMrB4gB,G,gBC7CImtC,GAAa,SAACvkD,GAAD,IAAO6/C,EAAP,8DAA6B,CACrDr0D,KALyB,oBAMzBC,QAAS,CACPuU,OACA6/C,cAIS2E,GAAa,eAACvE,EAAD,8DAAsB,CAC9Cz0D,KAZyB,oBAazBC,QAAS,CACPw0D,a,qlBCcawE,I,YAIAC,I,YAkBAC,I,YAIAC,I,YAMAC,I,YAQAC,I,YAKAC,I,YAKAC,I,YAYAC,I,YAgCAC,I,YAQAC,I,YAKAlkB,I,YAKQv2C,IA9HZwwC,GAAuB,SAACtwC,EAAOL,GAAR,OAAgBK,EAAMC,KAAKswC,SAAS5wC,IAAQA,GACnE66D,GAAgB,SAAAx6D,GAAK,OAAIA,EAAM2nB,OAErC,SAAS6Q,GAAUt2B,EAAKka,GAC7B,OAAO,IAAIuB,SAAQ,SAAAC,GACjB4zB,MAAMtvC,EAAKka,GACR3S,MAAK,SAAAgjC,GAAI,OAAIA,EAAKiF,OAAOjoC,MAAK,SAAAioC,GAAI,OAAI9zB,EAAQ8zB,SADjD,OAES,SAAA9/B,GACLqF,aAAuB,4BAA6BrF,GACpDgM,EAAQ,CAACkG,SAAS,UAKnB,SAAU+1C,GAAez6D,GAAzB,iEACE,OADF,UACQmB,SAAKi4B,GAAD,UAAer2B,GAAf,gBAA8Ci7B,GAAWh+B,IADrE,gFAIA,SAAU06D,KAAV,iEACE,OADF,UACQv5D,SAAKi4B,GAAD,UAAer2B,GAAf,kBAAgDi7B,MAD5D,gFAIP,SAASA,KAAsB,IAAXh+B,EAAW,uDAAJ,GACzB,MAAO,CACLqB,OAAQ,OACRwrB,QAAS,IAAIwuC,QAAQ,CACnB,eAAgB,qDAElBhpB,YAAa,UACbp1B,KAAMlB,OAAOzC,KAAKtZ,GACfgO,QAAO,SAAA65C,GAAC,QAAM7nD,EAAK6nD,MACnBvzC,OACArU,KAAI,SAAA4nD,GAAC,gBAAOnlD,mBAAmBmlD,GAA1B,YAAgCnlD,mBAAmB1C,EAAK6nD,QAAOhkD,KAAK,MAIzE,SAAU82D,KAAV,iEACL,OADK,UACCp5D,SAAIqhD,EAAWqR,IADhB,wCAIA,SAAU2G,GAAgC76D,GAA1C,uEAEL,OADMu7D,EAAoBv7D,EAASk0D,GAD9B,UAEC1yD,Sd7C4B,CAClCC,KAZwB,mBAaxBC,QAAS,CACP+3D,Oc0CkB8B,KAFf,OAGL,OAHK,UAGC/5D,SAAIqhD,EAAWqR,IAHhB,wCAMA,SAAU4G,KAAV,uEACS,OADT,UACe/5D,SAAOs6D,IADtB,OAEL,OADM7yC,EADD,iBAEChnB,SAAI21D,GAAkB3uC,EAAMyrC,WAF7B,OAGL,OAHK,UAGCzyD,SAAImyD,EAAgBnrC,EAAM1E,WAH3B,OAIL,OAJK,UAICtiB,SAAIiyD,GAAgB,IAJrB,OAKL,OALK,WAKCjyD,SAAIqhD,EAAWqR,IALhB,yCAQA,SAAU6G,KAAV,uEACQ,OADR,UACch6D,SAAOowC,GAAsB,6BAD3C,OAEL,OADMl7B,EADD,iBAECzU,SAAIg5D,GAAWvkD,GAAM,IAFtB,wCAKA,SAAU+kD,KAAV,uEACQ,OADR,UACcj6D,SAAOowC,GAAsB,4BAD3C,OAEL,OADMl7B,EADD,iBAECzU,SAAIg5D,GAAWvkD,GAAM,IAFtB,wCAKA,SAAUglD,GAAsBj7D,GAAhC,uEACgB,OADhB,UACsBoB,SAAKN,2BAD3B,kCAGH,OAHG,UAGGM,SAAKQ,cAHR,8BAKH,OALG,WAKGR,SAAKQ,oBALR,QAOL,OAPK,WAOCJ,SAAIwyD,EAAY,KAPjB,QASL,OADM5qD,EAAUpJ,EAASoJ,SA1EI,GAkExB,WASC5H,SAAIK,sBAAiC,eAAgB,CAACuH,aATvD,yCAYA,SAAU8xD,GAAV,sFAQL,OAR0Bx5D,EAArB,EAAqBA,QACnBoiB,EAA8CpiB,EAA9CoiB,SAAUmwC,EAAoCvyD,EAApCuyD,SAAUkC,EAA0Bz0D,EAA1By0D,aAAcgD,EAAYz3D,EAAZy3D,SACnCqC,EAFD,OAGH13C,WACAmwC,YACIkC,GAAgB,CAACA,iBACjBgD,GAAY,CAACA,aANd,UAQC33D,SAAIi5D,IAAW,IARhB,OAUY,OAVZ,UAUkBr5D,SAAKs5D,GAAgBc,GAVvC,YAUCx7D,EAVD,QAWQ2kB,QAXR,iBAYH,OAZG,WAYGvjB,SAAK65D,GAAuBj7D,GAZ/B,gCAcH,OAdG,WAcGwB,SAAIqhD,EAAWqR,IAdlB,YAeCl0D,EAASy7D,QAfV,iBAgBD,OAhBC,WAgBKj6D,SDxF4B,CACtCC,KAlBgC,iCCyF3B,oCAiBQzB,EAAS07D,aAjBjB,iBAkBD,OAlBC,WAkBKt6D,SAAKw5D,GAA4B56D,GAlBtC,oCAmBQA,EAAS27D,wBAnBjB,iBAoBD,OApBC,WAoBKv6D,SAAK05D,IApBV,oCAqBQ96D,EAAS47D,cArBjB,iBAsBD,OAtBC,WAsBKx6D,SAAK25D,IAtBV,oCAuBQ/6D,EAAS67D,wBAvBjB,iBAwBD,OAxBC,WAwBKz6D,SAAKy5D,GAAiC76D,GAxB3C,gCA0BD,OA1BC,WA0BKoB,SAAK45D,IA1BV,QA4BH,OA5BG,WA4BGx5D,SAAIi5D,IAAW,IA5BlB,yCAgCA,SAAUU,KAAV,uEACY,OADZ,UACkB/5D,SAAKu5D,IADvB,YACC36D,EADD,QAGQ2kB,QAHR,gBAIH,OAJG,UAIGvjB,SAAK65D,GAAuBj7D,GAJ/B,wCAQA,SAAUo7D,KAAV,uEACY,OADZ,UACkBh6D,SAAKC,0BADvB,OAEL,OADMmuB,EADD,iBAEChuB,SzC3GoC,CAC1CC,KAxB6B,wBAyB7BC,QAAS,CACPizD,WyCwGmCnlC,EAASmlC,cAFzC,wCAKA,SAAUzd,KAAV,iEACL,OADK,UACC91C,SAAK+5D,IADN,OAEL,OAFK,UAEC/5D,SAAKg6D,IAFN,wCAKQ,SAAUz6D,KAAV,iEACb,OADa,UACPmB,SAAI,EACRC,SpC7IiB,coC6ISm5D,KAC1Bn5D,SpChJsB,mBoCgJSm1C,MAHpB,wC,gBC7HE4kB,I,YAkBAC,I,YAmBA9E,I,YAKA+E,I,YAqBAhF,I,YA2BAiF,I,YAUAC,I,YAYAC,I,YAIQ75D,I,qkBA3HlB,I,GAAM85D,GAA0B,SAAAv7D,GAAK,OAAIA,EAAM43D,eAAerB,iBACxD3W,GAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAC/Bo2D,GAAuB,SAAAx7D,GAAK,OAAIA,EAAM43D,eAAeC,OAAO9E,cAC5D0I,GAAmB,SAAAz7D,GAAK,OAAIA,EAAM43D,eAAexE,UACjDsI,GAAqB,SAAA17D,GAAK,OAAIA,EAAM43D,eAAeC,OAAO8D,YAC1D57D,GAAe,SAAAC,GAAK,OAAIA,EAAMC,MAEpC,SAAUg7D,GAAclI,EAAc3zD,EAAMk2D,GAA5C,yEAWU,OAVTl5C,EAAU,CACd3b,OAAQ,OACRm7D,oBAAqB,CAAC,KACtBv/C,KAAM,SACDjd,GADD,IAEFk2D,kBANC,mBAWgB/0D,SAAKC,iBAAD,qBAAiCuyD,EAAjC,oBAAiE32C,GAXrF,cAWGqwB,EAXH,yBAYIA,EAAKovB,GAAK,CAAC71B,MAAO,MAAQ,CAACA,MAAOyG,EAAKpwB,OAZ3C,yDAcI,CAAC2pB,MAAO,CAAC1Z,UAAW,mBAAoB+a,UAAS,QAdrD,sDAkBA,SAAU6zB,GAAenI,EAAc3zD,GAAvC,6EACY,OADZ,UACkBc,SAAOH,IADzB,OAUU,OAVV,SACEM,EADF,EACEA,OAED+b,EAAU,CACd3b,OAAQ,OACR4b,KAAMjd,EACNuwB,YAAa,CAACtvB,WANX,mBAUgBE,SAAKC,iBAAD,qBAAiCuyD,EAAjC,wBAAqE32C,GAVzF,cAUGqwB,EAVH,yBAWIA,EAAKpwB,MAXT,2DAeI,CAACoS,OAAO,EAAM4Y,UAAS,OAf3B,uDAmBA,SAAU+uB,GAAkB70D,GAA5B,iEACL,OADK,UACCZ,SxB7BsC,CAC5CC,KAxB8B,wCAyB9BC,QAAS,CACP61D,YwB0B+Bn1D,EAAOV,QAAQ61D,eAD3C,OAEL,OAFK,UAEC/1D,SxBUuB,CAC7BC,KAAM42D,KwBbD,wCAKA,SAAU2D,KAAV,mFACmB,OADnB,UACyBj7D,SAAOq7D,IADhC,OAEY,OADXhF,EADD,iBAEkBr2D,SAAOu7D,IAFzB,UAECrI,EAFD,OAIC5mC,EAASsvC,GAAc1I,EAASsD,YAAatD,EAAS0D,YAAaP,GN9D7CwF,EMgETvvC,EN9DmB,IAA/BrR,OAAOzC,KAAKqjD,GAAQn3D,QAAgBm3D,EAAOC,cAAgB7gD,OMwD7D,iBAOH,OAPG,WAOGxa,SAAIqF,GAAuCwmB,IAP9C,gCASkB,OATlB,WASwBtsB,SAAOs7D,IAT/B,QAUU,OADPzI,EATH,kBAUgBxyD,SAAK66D,IAVrB,QAWY,OADTh8D,EAVH,kBAWkBmB,SAAK26D,GAAgBnI,EAAc3zD,GAXrD,YAYkB,KADfK,EAXH,QAYQgvB,MAZR,iBAaD,OAbC,WAaK9tB,SAAIqF,GAAuC,KAbhD,gCAgBD,OADMwmB,EAAS6sC,GAA6B55D,EAAOk4D,oBAflD,WAgBKh3D,SAAIqF,GAAuCwmB,IAhBhD,kCN1DA,IAAuBuvC,IM0DvB,IAqBA,SAAU5F,GAAV,kFACgB,OADkBb,EAAlC,EAAwBz0D,QAAUy0D,aAAlC,UACsBp1D,SAAOs7D,IAD7B,OAEQ,OADPzI,EADD,iBAEcxyD,SAAK66D,IAFnB,OAGU,OADTh8D,EAFD,iBAGgBmB,SAAK06D,GAAelI,EAAc3zD,EAAMk2D,GAHxD,YAGC71D,EAHD,QAKMumC,MALN,qBAMwB,IAAvBvmC,EAAOumC,MAAMvX,MANd,iBAOD,OAPC,WAOK9tB,SAAIqF,GAA4B,KAAMvG,EAAOumC,MAAM2xB,qBAPxD,gCASD,OATC,WASKh3D,SAAIqF,GAA4BvG,EAAOumC,MAAM1Z,YATlD,gCAYgB,OAZhB,WAYsBpsB,SAAOw7D,IAZ7B,oCAcD,OAdC,WAcK/6D,SAAIK,sBAAiC,UAAW,CACpD01D,YAAat3D,EAAKs3D,eAfnB,gCAkBiB,OAlBjB,WAkBuBn2D,SAAK86D,IAlB5B,QAmBD,OADMV,EAlBL,kBAmBKh6D,SAAIwyD,EAAYwH,EAAU95D,QAAQuyD,WAnBvC,QAoBD,OApBC,WAoBK7yD,SAAK85D,GAAWM,GApBrB,QAuBH,OAvBG,WAuBGh6D,SxBjDgC,CACxCC,KAhDmC,+CwByE9B,yCA2BA,SAAUw6D,KAAV,yEACS,OADT,UACel7D,SAAO0/C,IADtB,OAEY,OADXx6C,EADD,iBAEkBlF,SAAOu7D,IAFzB,cAECrI,EAFD,yBAIE,CACL0D,YAAa1xD,EAAM0xD,YAAc1xD,EAAM0xD,YAAc1D,EAAS0D,YAC9DJ,YAAatD,EAASsD,cANnB,wCAUA,SAAU2E,KAAV,yEACY,OADZ,UACkBn7D,SAAOu7D,IADzB,OAEgB,OADfrI,EADD,iBAEsBlzD,SAAOs7D,IAF7B,cAECzI,EAFD,yBAIE,CACLlyD,QAAS,CACPoiB,SAAU8vC,EACVK,SAAUA,EAASqD,qBAPlB,wCAYA,SAAU6E,KAAV,iEACL,OADK,UACC36D,SxB5DwC,CAC9CC,KA7D2C,uDwBuHtC,wCAIQ,SAAUa,KAAV,iEACb,OADa,UACPR,SAAI,EACRC,SAAW8E,GAA6BowD,KACxCl1D,SAAW8E,GAAkBm1D,KAC7Bj6D,SAAW8E,GAAuBmwD,KAClCj1D,SAAW8E,GAA6Bs1D,KACxCp6D,SAAW8E,GAA6Bs1D,KACxCp6D,SxBvIsC,kDwBuISo6D,MAPpC,wC,qkBClIf,IAAMj6D,GAAe,CACnBsxD,sBAAsB,EACtBE,cAAc,EACd8I,YAAY,EACZ5I,aAAc,IAGVkJ,GAAwB,SAAAC,GAC5B,OAAO,SAACl8D,EAAD,GAAsB,IACrB0oC,EADqB,EAAb7nC,QACMq7D,GACpB,gBACKl8D,GADL,UAEGk8D,EAAgBxzB,MAKjBvnC,IAAe,a7CnBgB,6C6CoBF86D,GAAsB,yBADpC,O7CjBY,yC6CmBFA,GAAsB,iBAFhC,O7ClBS,sC6CqBFA,GAAsB,eAH7B,O7ChBa,0C6CoBFA,GAAsB,iBAJjC,ICjBrB,SDwBe,WAA+C,IAA9Bj8D,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,GE1B5C,IAAMmB,GAAkB,OzBDY,6CyBEF,SAACnB,EAAOuB,GAAR,OAAmBA,EAAOV,QAAQg1D,SCKpE,SDAe,WAA+C,IAA9B71D,EAA8B,uDAFzC,KAEiCuB,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,gBEF3Bm8D,I,YAOAjG,I,YAQQz0D,IAlBZ+5D,GAAuB,SAAAx7D,GAAK,OAAIA,EAAM43D,eAAeC,OAAO9E,cAC5DhzD,GAAe,SAAAC,GAAK,OAAIA,EAAMC,MAEpC,SAAUk8D,GAAoBpJ,GAA9B,uFAGsB,OAHsB1yD,EAA5C,+BAAqD,GACpDyvB,EADD,qBAC0BijC,EAD1B,6BAG4BxyD,SAAKC,iBAAkBsvB,EAAU,CAACH,YAAa,CAACtvB,YAH5E,cAGC+7D,EAHD,yBAIEA,EAAmB//C,MAJrB,wCAOA,SAAU65C,KAAV,6EACgB,OADhB,UACsBh2D,SAAOs7D,IAD7B,OAEY,OADXzI,EADD,iBAEkB7yD,SAAOH,IAFzB,OAIY,OAJZ,SAEEM,EAFF,EAEEA,OAFF,UAIkBE,SAAK47D,GAAqBpJ,EAAc1yD,GAJ1D,OAKL,OADMlB,EAJD,kBAKCwB,S3BboC,CAC1CC,KAPkC,4CAQlCC,QAAS,CACPg1D,M2BUmC12D,EAAS02D,SALzC,yCAQQ,SAAUp0D,KAAV,iEACb,OADa,UACPR,SAAI,EACRC,S3BzBkC,8C2ByBSg1D,MAFhC,wCClBf,UACE2B,UACAzE,YACAmD,oBAGK,I,GAAM90D,GAAQ,CACnB3B,GACAu8D,GACAC,I,ilBCTF,IAwBMn7D,IAAe,ajD7BM,qBiDKR,SAACnB,EAAD,GAAsB,IAChCw2C,EADgC,EAAb31C,QACnB21C,KACP,gBACKx2C,GADL,IAEE82C,YAAaN,OAoBI,OjD5BO,sBiDYR,SAACx2C,EAAD,GAAsB,IACjCijB,EADiC,EAAbpiB,QACpBoiB,SACP,gBACKjjB,GADL,IAEEijB,gBAYiB,OjD3BO,sBiDmBR,SAACjjB,EAAD,GAAsB,IACjCozD,EADiC,EAAbvyD,QACpBuyD,SACP,gBACKpzD,GADL,IAEEozD,gBAIiB,OjD1BU,wBiD8BFhyD,2BAAkC,eAJ1C,IAOfC,GAAe,CACnBy1C,YAAauc,EACbpwC,SAAU,GACVmwC,SAAU,GACVU,WAAY,MCtCd,SDyCe,WAA+C,IAA9B9zD,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,4kBE3C5C,IAqBMmB,IAAe,aXvBM,qBWER,SAACnB,EAAD,GAAsB,IAAba,EAAa,EAAbA,QACnBuU,EAAkBvU,EAAlBuU,KAAM6/C,EAAYp0D,EAAZo0D,SACb,gBACKj1D,GADL,IAEEf,QAAS,CACPmW,OACA6/C,iBAee,OXtBM,qBWYR,SAACj1D,EAAD,OAASa,EAAT,EAASA,QAAT,UAAC,MACfb,GADc,IAEjB+zD,aAAclzD,EAAQw0D,aAQH,OXrBa,gCWgBR,SAAAr1D,GAAK,gBAC1BA,GAD0B,IAE7Bg0D,oBAAoB,OAGD,IAMf3yD,GAAe,CACnBpC,QAAS,GACT80D,cAAc,EACdC,oBAAoB,GC9BtB,SDiCe,WAA+C,IAA9Bh0D,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,gBE/B3Bu8D,I,YAKQ76D,IALlB,SAAU66D,GAAYC,GAAtB,iEACL,OADK,UACC77D,SAAIi5D,IAAW,IADhB,OAEL,OAFK,UAECr5D,SAAK85D,GAAWmC,GAFjB,wCAKQ,SAAU96D,KAAV,iEACb,OADa,UACPT,SAAI,EACRC,S1BbwB,qB0BaSq7D,MAFtB,wCCPf,IAAMp7D,GAAkB,O3BHE,mB2BIFC,2BAAkC,WAGpDC,GAAe,CACnBu3D,OAAQ,M,gBCJOn3D,IAAV,SAAUA,KAAV,iEACL,OADK,UACCR,SAAI,EACRqiD,SAAKmZ,MAFF,wCAMP,SDCe,WAA+C,IAA9Bz8D,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,gBEJ3B08D,I,YAUAC,I,YAMQ3+C,IAlBZsyB,GAAuB,SAAAtwC,GAAK,OAAIA,EAAMC,KAAKswC,UAEjD,SAAUmsB,GAAV,4EACL,OADoC77D,EAA/B,EAA+BA,QAA/B,UACCF,SAAIi5D,IAAW,IADhB,OAEL,OAFK,UAECr5D,SAAKC,iBAAD,qBAAiCK,EAAQoiB,SAAzC,mBAAoE,CAACxiB,OAAQ,SAFlF,OAGL,OAHK,UAGCE,SAAIuyD,EAAYryD,EAAQoiB,WAHzB,OAIsB,OAJtB,UAI4B/iB,SAAOowC,IAJnC,OAKL,OADMssB,EAJD,kBAKCj8D,SAAIg5D,GAAWiD,EAAmB,yCALnC,QAML,OANK,WAMCj8D,SAAIqhD,EAAWqR,IANhB,QAOL,OAPK,WAOC1yD,SAAIi5D,IAAW,IAPhB,yCAUA,SAAU+C,GAAV,wEAC2B,IAD3B,EAA+B97D,QACxBoyD,gBADP,gBAEH,OAFG,UAEGtyD,SAAIqhD,EAAWqR,IAFlB,wCAMQ,SAAUr1C,KAAV,iEACb,OADa,UACP/c,SAAI,EACRC,SzD5B4B,yByD4BSw7D,KACrCx7D,SzD5B4B,yByD4BSy7D,MAH1B,wC,qkBCxBf,IAQMx7D,GAAkB,O1DRI,sB0DAR,SAACnB,EAAD,GAAsB,IACjCijB,EADiC,EAAbpiB,QACpBoiB,SACP,gBACKjjB,GADL,IAEEijB,gBAQE5hB,GAAe,CACnB4hB,SAAU,I,gBCVKxhB,IAAV,SAAUA,KAAV,iEACL,OADK,UACCR,SAAI,EACRqiD,SAAKmZ,MAFF,wCAMP,MCFA,IACE90C,SACA4tC,aACAtC,gBFMa,WAA+C,IAA9BjzD,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,GEP1C43D,gBAAgBljB,SAAgBmoB,IAChCxE,iBAGK,IAAM52D,GAAQ,CACnB3B,GACAg9D,GACAC,IAHgB,YAIbC,K,8+BCVL,IAEM13D,GAAkB,CACtB,eACA,UAGI23D,GAAe,SAACx3D,EAAIL,EAAOM,EAAQC,EAAYu3D,GACnD,I9DA2BvB,E8DArB31D,EAAU,CACd4xD,GAAuC,I9DDd+D,G8DEI,E9DFW,CAC1C/6D,KAnB4B,sCAoB5BC,QAAS,CACP86D,gB8DAA1I,IAAqC7tD,EAAM6tD,iBAC3CtrC,EAAkBviB,EAAM6d,WAGpBza,IAAcpD,EAAMoD,UACpB5C,EAAU,kBAACu3D,GAAD,CAAgB30D,UAAWA,IAErC3C,EAAQC,gBAAuBs3D,GAAe37D,GAAO2D,EAlBzC,SAuBlB,OAJApE,eAA0B6E,EAAOH,GACjCmnB,eAAwBhnB,GAAO,EAAM,CAAC,UAAW,WACjD9E,eAAiB8E,GAEVC,cAvBW,QAyBhBF,EACAC,EACA,CACET,QACAY,UACAL,aACAM,oBAAqB,CAAC,SACtBi3D,iBAKAG,GAAwB,SAAC53D,EAAIL,EAAOM,EAAQC,EAAYu3D,GAC5D,IAAM10D,IAAcpD,EAAMoD,UACpBqqD,IAAiBztD,EAAMytD,aAEvBjtD,EAAU,kBAACu3D,GAAD,CAAgBrmB,YAAY,kBAAkBtuC,UAAWA,IAEzE,GAA8B,iBAAnBpD,EAAM6d,UAAmD,IAA1B7d,EAAM6d,SAASre,OAAzD,CAKA,IAAMoB,EAAU,CACd4xD,EAA+BxyD,EAAM6d,UACrC20C,EAA+B/E,IAGS,kBAA/BztD,EAAMutD,sBACf3sD,EAAQ6iB,KAAK+uC,EAAuCxyD,EAAMutD,uBAG5D,IAAM9sD,EAAQC,gBAAuBs3D,GAAe37D,GAAO2D,EAzDzC,SA6DlB,OAHApE,eAA0B6E,EAAOH,GACjCmnB,eAAwBhnB,GAAO,EAAM,CAAC,UAAW,WAE1CC,cAAA,UA7DW,QA6DX,mBAELF,EACAC,EACA,CACET,QACAY,UACAL,aACAM,oBAAqB,CAAC,SACtBi3D,gBA1BFjmD,aAAuB,6DAiG3B,SArCMqmD,Y,qBACJ,WAAYh6D,GAAO,mBACjB,cAAMA,IACD8B,MAAQ,CACXoD,UAAWlF,EAAMkF,UACjBnI,OAAQiD,EAAMjD,OACd4yD,gBAAiB3vD,EAAM2vD,gBACvBhwC,SAAU3f,EAAM2f,UAAY,IAG9B,IAAMvd,EAASJ,GAAgBa,QAAO,SAACT,EAAQU,GAI7C,OAHI9C,EAAM8C,KACRV,EAAOU,GAAS9C,EAAM8C,IAEjBV,IACN,IAdc,OAgBjB,EAAKW,IAAM42D,GAAa,EAAM,EAAK73D,MAAOM,GAhBzB,E,6CAoBjB,OAAOhB,KAAK2B,IAAIC,c,EArBdg3D,CAAiBr4D,eAuCvB,IAAMs4D,GAAkC,CACtC,UACA,UAGWC,GAAoB,SAAAl6D,GAAS,OAClBqE,cAAS,MADS,WACjCtB,EADiC,KAC5Bo3D,EAD4B,KAUxC,OARAx1D,gBAAU,WACR,IAAMvC,EAAS63D,GAAgCp3D,QAAO,SAACT,EAAQU,GAAT,UAAC,MACjDV,GAAYpC,EAAM8C,IAAN,OAAkBA,EAAQ9C,EAAM8C,OAC/C,IAEHq3D,EAAOJ,GAAsB,EAAmB/5D,EAAOoC,MACtD,IAEIW,EAAMA,EAAIC,UAAY,MAG/Bk3D,GAAkBtmD,UAAlB,IACE+L,SAAU9L,WACV3O,UAAW2O,SACXw7C,qBAAsBx7C,SACtB2/C,YAAa3/C,YACVomD,GAAgCp3D,QAAO,SAAC+Q,EAAW9Q,GAAZ,UAAC,MAA0B8Q,GAA3B,UAAuC9Q,EAAQ+Q,aAAkB,M,iSC5JhGumD,EAAsB,SAAA3xB,GAAgB,MAAK,CACtDnrC,KApBmC,mCAqBnCC,QAAS,CACPkrC,sBCpBE5qC,EAAkB,ODFa,mCCGFC,0BAAkC,qBAG/DC,EAAe,CACnB0qC,iBAAkB,MCLpB,QDQe,WAA+C,IAA9B/rC,EAA8B,uDAAtBqB,EAAcE,EAAQ,uCACtDC,EAAUL,EAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,G,mrBEHnByB,G,WAWR40C,G,WAOAsnB,G,WAKAC,G,WAKAC,G,WASPC,GAxCGle,EAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAG7B,SAAU3D,IAAV,iEACb,OADa,UACPR,QAAI,EACRkb,QHboC,sCGaQk6B,IAC5Cl6B,QHVkB,oBGUQwhD,IAC1BxhD,QHVkB,oBGUQyhD,IAC1B18D,QAAW68D,KAAQF,IACnB38D,QAAW88D,KAAoBH,IAC/B38D,QAAW+8D,KAAYJ,KAPZ,uCAWR,SAAUxnB,IAAV,+EAC6C,OAD7C,UACmDn2C,QAAO0/C,GAD1D,OAEoB,OAFpB,SACE5xB,EADF,EACEA,KAAqBkwC,EADvB,EACQpmC,cADR,UAE0Bv3B,QAAK49D,wBAA8BnwC,GAF7D,OAGqB,OADpB+d,EAFD,kBAG2BxrC,QAAK49D,qBAA2BpyB,GAH3D,QAIL,OADMuU,EAHD,kBAIC3/C,QAAIuwC,eAnBI,aAmBJ,OAAoCoP,GAAsB4d,KAJ/D,wCAOA,SAAUP,IAAV,uEACU,OADV,SACgBG,IADhB,OAEL,OADMzzC,EADD,iBAEC1pB,QAAIK,sBAAiC,WAAY,CAACqpB,YAFnD,uCAKA,SAAUuzC,IAAV,uEACU,OADV,SACgBE,IADhB,OAEL,OADMzzC,EADD,iBAEC1pB,QAAIK,sBAAiC,WAAY,CAACqpB,YAFnD,uCAKA,SAAUwzC,IAAV,yEACU,OADV,SACgBC,IADhB,OAES,OADRzzC,EADD,iBAEenqB,SAAOk+D,OAlCb,eAgCT,OAGL,OADM3vC,EAFD,iBAGC9tB,QAAIK,sBAAiC,WAAY,CACrDqpB,SACAoE,WALG,uCASP,SAAUqvC,IAAV,iEACwB,OADxB,KACS3iD,OADT,UAC8Bjb,SAAO+/C,OA1CrB,eAyChB,iDACgBxgC,QADhB,gBAEKtZ,QAAO,SAACgG,EAAD,kBAAOxM,EAAP,KAAYD,EAAZ,mBAEDyM,GAFC,UAGHxM,EAAIqkB,QAAQ,KAAM,KAAOtkB,MAE3B,KAPP,uCC5CA,SACE2+D,WAAYC,EACZtwC,UAGK,IAAMvsB,GAAQ,CACnB88D,G,sPCPK,IAAMC,GAAuB7/D,UAAH,KAI7B0E,MC2EJ,MChFA,IDgFe4mD,QAAU,CAACj8B,KA1EF,aA0EyBk8B,kBAAkB,GAAnE,EAxEa,SAAC,GAcR,IAbJuU,EAaI,EAbJA,eACAx+D,EAYI,EAZJA,KAAMixB,EAYF,EAZEA,SACN5C,EAWI,EAXJA,SACcowC,EAUV,EAVJtK,aACMp+C,EASF,EATJgY,KACAiH,EAQI,EARJA,eACAjF,EAOI,EAPJA,WACAsT,EAMI,EANJA,YACA7Y,EAKI,EALJA,KACAuE,EAII,EAJJA,UACAiY,EAGI,EAHJA,WACA03B,EAEI,EAFJA,WACAC,EACI,EADJA,WAEMrtD,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAUtC,OAJAwC,gBAAU,WACRw2D,MACC,IAGD,0BAAMnwC,SAAUowC,GAPG,kBAFPG,EAEmB,IAFb,IAAIlhD,SAAQ,SAAAC,GAAO,OAAIkhD,WAAWlhD,EAASihD,OAEzBp1D,MAAK,kBAAM6kB,OAFnC,IAAAuwC,MAUV,kBAAC,gBAAD,CACE95D,YAAQkI,EACR+I,SAAUA,EACVif,eAAgBA,EAChBjF,WAAYA,EACZwW,iBAAkBlD,GAAe,WACjC7Y,KAAMA,KAENuE,GACC,kBAACwvC,GAAD,KACD,kBAAC7wD,GAAA,EAAD,CACEkW,SAAUojB,EACVlnB,IAAI,UACJxd,MAAOo8D,GAAcptD,EAAI,gCACzB8jD,QAASpuB,EACTrmC,KAAK,WAEP,kBAAC+M,GAAA,EAAD,CACEkW,SAAUojB,EACV1kC,MAAOq8D,GAAcrtD,EAAI,oCACzBtN,QA/Ba,kBAAMitB,YEnB7B,IAAMhsB,GAAoB,CACxBu5D,eRD4B,iBAAO,CACnC79D,KARsC,sCAStCC,QAAS,KQATytB,SRIoB,iBAAO,CAC3B1tB,KAVoB,sBQMpBswB,SROoB,iBAAO,CAC3BtwB,KAboB,uBQqBtB,UAAeuE,eAbS,SAACnF,EAAOsD,GAAR,MAAmB,CACzC0rB,UAAWhvB,EAAMoF,MAAM4pB,UACvBhwB,MAAOgB,EAAMoF,MAAMpG,MACnByuB,YAAaztB,EAAMoF,MAAMqoB,YACzBkxC,WAAY3+D,EAAMoF,MAAMu5D,WACxBC,WAAY5+D,EAAMoF,MAAMw5D,WACxB3pC,eAAgBj1B,EAAMoF,MAAM4oB,KAC5BmtC,UAAmC,IAAzBn7D,EAAMoF,MAAM+1D,SAAqBntC,mBAAoBhuB,EAAMq+D,WAAWtyB,kBAAoB,aACpGxd,QAASvuB,EAAMoF,MAAMmpB,QACrB+U,YAAatjC,EAAMoF,MAAMk+B,YACzB7Y,KAAMzqB,EAAMoF,MAAMqlB,QAGoBvlB,GAAxC,EAA2DwD,SAAWq2D,K,yaClBtE,IAEMz5D,GAAkB,CACtB,WACA,WACA,WACA,cAGIE,GAAU,SAACC,EAAIL,GAAmC,IAA5BM,EAA4B,uDAAnB,GAAIC,EAAe,uCAChDC,EAAU,kBAACo5D,GAAD,CAAezwC,QAASnpB,EAAMmpB,UAExC1oB,EAAQC,gBAAuBC,EAAUtE,GAAO2D,EAZpC,eAalBuR,eAAyB9Q,EAAOH,EAAOiQ,YACvC3U,eAA0B6E,EAAOH,GACjC4qB,eAAoBzqB,EAAO,CAACzG,KAAMgG,EAAMkrB,SAAU/B,QAASnpB,EAAMmpB,UACjE9R,eAAwB5W,GAAO,GAE/B,IAAMQ,EAAMP,cAlBM,cAoBhBF,EACAC,EACA,CACET,QACAM,SACAM,QAAS,CACP03D,EAAoB1vC,wBAAyB5oB,EAAM4oB,QAErDroB,aACAM,oBAAqB,CAAC,YAAa,YAWvC,OAAOI,GAyDT,SAhCM8rD,Y,qBACJ,WAAY7uD,GAAO,kBACjB,cAAMA,GAEN,IAAMoC,EAASJ,GAAgBa,QAAO,SAACT,EAAQU,GAI7C,OAHI9C,EAAM8C,KACRV,EAAOU,GAAS9C,EAAM8C,IAEjBV,IACN,IARc,OAUjB,EAAKW,IAAMb,GAAQ,KAAMlC,EAAOoC,GAVf,E,6CAcjB,OAAOhB,KAAK2B,IAAIC,c,EAfd6rD,CAAsBltD,gB,sZCrErB,IAAMg6D,GAAYC,QAAH,KAClBt0D,SACO9L,UAAY,QAGVA,UAAY,SACF,qBAAE+jB,QAAuB,OAAS,eAOlC,qBAAEA,QAAuB,OAAS,eAKlC,qBAAEA,QAAuB,OAAS,e,sECjBzD,SAAelkB,QAAO0P,KAAtB,KACI4wD,I,ioCCAG,IAAMhiD,EAAoBte,SAAH,KACR,SAAA2E,GAAK,OAAIA,EAAM67D,iBAAmBrgE,UAAY,wBAAZA,CAAqCwE,MAYhF87D,GAAwBzgE,QAAO8W,IAAP9W,CAAH,IACjBG,eAAiB,SAEvB,qBAAEwB,QAAsBxB,UAAY,aAG5BA,eAAiB,SAEvB,qBAAEwB,QAAsBxB,UAAY,aAMpCA,UAAY,kBAOZA,UAAY,YAKZugE,EAAyB1gE,UAAH,IAClBG,eAAiB,SAEvB,qBAAEwB,QAAsBxB,UAAY,aAG5BA,eAAiB,SAEvB,qBAAEwB,QAAsBxB,UAAY,aAKpCA,UAAY,Y,ECRS,kBAAC,IAAD,CAAMC,KAAK,S,EACV,kBAAC,IAAD,CAAMA,KAAK,uB,EAOG,kBAAC,IAAD,CAAMA,KAAK,kBAvCtDqe,EAAc,SAAC,GAAyE,IAAxEG,EAAwE,EAAxEA,WAAY+hD,EAA4D,EAA5DA,gBAAiBjiD,EAA2C,EAA3CA,YAAa8hD,EAA8B,EAA9BA,gBAAiBl7D,EAAa,EAAbA,QACzEs7D,EAAc,GAAH,WACXD,GAAmB,IADR,IAEXjiD,EAAc,CAACA,GAAe,KAGpC,GAA2B,IAAvBkiD,EAAY36D,OACd,OAAO,KAST,OAAO,kBAACqY,EAAD,CAAmBkiD,gBAAiBA,GACzC,kBAACt3C,EAAA,GAAD,CAAQC,OAAO,GACb,+BAzBW,SAAAw3C,GAAe,OAC9BA,EACGtY,MAAMsY,EAAgB16D,OAAS,GAC/BvF,KAAI,SAAAmgE,GAAU,OAAIA,EAAWxgE,OAASwgE,EAAWliD,WACjDmiD,UACAx8D,KAAK,OAoBIm3B,CAASmlC,KAEnB,kCACEA,EAAYlgE,KAAI,SAACuU,EAAG5O,GAClB,IAZc06D,EAYRpiD,EAAU1J,EAAE0J,SAAW,GACvBqiD,EAAO36D,IAAQu6D,EAAY36D,OAAS,EAAIy6D,EAAyBD,EACvE,OAAO,kBAAChoD,EAAA,QAAD,CAAiBzX,IAAG,yBAAoBqF,IAC7C,kBAAC26D,EAAD,KACE98C,QAAQ,QACH7d,IAAQu6D,EAAY36D,OAAS,GAAK,CAACtE,OAAQ,aACzB,IAAXsT,EAAEgS,KAAuB,CAACvW,GAAI,GAAF,OAAKkO,EAAL,YAAmB3J,EAAEgS,OAAU,GAHzE,CAIE3hB,SAnBUy7D,EAmBW9rD,EAnBQ,WACjC3P,GACFA,EAAQy7D,OAmBU,SAAX9rD,EAAEhT,MAAF,EACW,UAAXgT,EAAEhT,MAAF,EACA0c,OAIJnX,QAAO,SAACugC,EAAMC,EAAM3hC,GAAb,MACN,CAAC0hC,EACC,kBAACtvB,EAAA,QAAD,CAAiBzX,IAAK,OAASqF,GAA/B,WACA2hC,SAMZvpB,EAAYooB,aAAe,CACzBjoB,WAAY,IAsBd,W,qGChFMqiD,EAAc36D,gBAAiB,SAAC3B,EAAOoO,GAAR,OACnC,kBAAC,IAAD,CAAmBA,IAAKA,GACrBpO,EAAMoI,aAIXk0D,EAAY1oD,UAAY,CAItBxL,SAAUyL,UAGZ,W,+dCEA,QAnB0BxY,SAAH,IAGb0E,M,6NCkBV,SAAeqF,SAnBQ,SAAApF,GACrB,IAAYmC,EAEZ,OACE,yBAAUnC,EAAMu8D,WACd,kBAAC1xD,EAAA,EAAD,CACEpP,KAAK,QACLwtD,UAAW,EACXxiD,cAPMtE,EAOU,0CAPJnC,EAAMrD,KAAK+J,cAAc,CAACvE,c,eCgB9C,QAjB0B,SAAAnC,GACxB,OAAQA,EAAMw8D,YAAYC,YAAc,kBAAC,EAAAjnD,EAAA,kBAAiCxV,EACxE,kBAAC6K,EAAA,EAAD,CACEpP,KAAMuE,EAAMw8D,YAAYE,WAAa,aAAe,eACpDzT,UAAW,M,eCHX0T,EAAuB,SAACnhC,EAAoBp/B,GAArB,OAA+B,SAAA0G,GAC1D04B,EAAmBp/B,GACnB0G,EAAMo0B,oB,EAqBA,kBAACrsB,EAAA,EAAD,CACEpP,KAAK,SACLwtD,UAAW,I,EASb,kBAACp+C,EAAA,EAAD,CACEpP,KAAK,OACLwtD,UAAW,IA8BrB,QAxD4B,SAAAjpD,GAAS,IALhB48D,EAKgB,EAC0C58D,EAAMw8D,YAA5EhhC,EAD4B,EAC5BA,mBAAoBK,EADQ,EACRA,iBAAkB4gC,EADV,EACUA,WAAY7gC,EADtB,EACsBA,iBAEzD,OACE,kBAAC,KAAD,KACE,kBAAC,EAAApmB,EAAA,oBAAmCxV,EACjCA,EAAMoI,SACNozB,IACCihC,GACD,0BACDI,WAAY,SAAAvuD,GAAC,OAAIA,EAAE4oB,mBACnB3iB,YAAa,SAAAjG,GAAC,OAAIA,EAAE4oB,mBACpB4lC,UAAWH,EAAqBnhC,EAAoBx7B,EAAM5D,QAHzD,GASAw/B,IACG6gC,GACD,0BACDI,WAAY,SAAAvuD,GAAC,OAAIA,EAAE4oB,mBACnB3iB,YAAa,SAAAjG,GAAC,OAAIA,EAAE4oB,mBACpB4lC,WA5BWF,EA4Ba/gC,EA5BC,SAAA/4B,GACjC85D,IACA95D,EAAMo0B,qBAuBG,M,iBCjCoB,8BAAM,kBAAC,IAAD,CAAgB3xB,KAAK,YAE1D,QAFyB,qB,MCEI,8BAAvBw3D,EAAiB,qB,EAWnB,kBAACA,EAAD,MAoBJ,QA7Ba,SAAA/8D,GAAK,OAChB,kBAAC,KAAD,CACEg9D,WAAW,WACXC,iBAAiB,cACjBC,YAAa,CAAC,CACZnxD,GAAI,SACJixD,WAAY,cALhB,EASE,6BACE,kBAAC,KAAD,OACO/gD,IAAMjc,EAAO,CAAC,aADrB,CAEEm9D,aAAcn9D,EAAMw8D,YAAYW,aAChCC,cAAep9D,EAAMw8D,YAAYY,gBAChCp9D,EAAMoI,aCOf,QAxBiB,SAAApI,GAAS,IACjBw8D,EAAgCx8D,EAAhCw8D,YAAap0D,EAAmBpI,EAAnBoI,SAAU5M,EAASwE,EAATxE,MACvBu/B,EAAkDyhC,EAAlDzhC,qBAAsBY,EAA4B6gC,EAA5B7gC,yBAC7B,OACE,kBAAC,EAAAnmB,EAAA,SAAwBxV,EACtBoI,EACA2yB,GACE,kBAAC,KAAD,CAA4BsiC,iBAAkB7hE,GAC9CmgC,K,6KCZT,QAAetgC,UAAf,KCuCA,QAhC+B,SAAA2E,GAAS,IAC/BlE,EAAQkE,EAARlE,KAD+B,EAEMkE,EAAMw8D,YAA3C1hC,EAF+B,EAE/BA,SAAUW,EAFqB,EAErBA,YAAa3W,EAFQ,EAERA,WACxBqmB,EAAU5qC,IAAKu6B,EAAUh/B,EAAKO,IAAK,MAEnCiG,EAAUwiB,EACZ,kBAACw4C,EAAD,CAAkB/oD,YAAa,SAAAjG,GAC/BA,EAAE4oB,kBACF5oB,EAAEG,mBAEF,kBAACqW,EAAD,CAAY7S,UAAWnW,EAAKO,KAAK,kBAAC,EAAAmZ,EAAA,gBAA+BxV,KAEjE,kBAAC,EAAAwV,EAAA,gBAA+BxV,GAEpC,OACE,kBAACgqD,EAAA,EAAD,CAAS1nD,QAAS6oC,EAAU,yBAAK9rB,wBAAyB,CAACC,OAAQi+C,iBAAkBpyB,MAAe,MAClG,0BAAMqyB,YAAa,kBAAM/hC,IAAgB0P,GAAW1P,EAAY3/B,EAAKO,OAClEiG,KCiCT,QAjD2B,SAAAtC,GAAS,IAEhClE,EAIEkE,EAJFlE,KACA0gE,EAGEx8D,EAHFw8D,YACAC,EAEEz8D,EAFFy8D,WACAr0D,EACEpI,EADFoI,SAGA0yB,EAGE0hC,EAHF1hC,SACAW,EAEE+gC,EAFF/gC,YACA3W,EACE03C,EADF13C,WAEIqmB,EAAU5qC,IAAKu6B,EAAUh/B,EAAKO,IAAK,MACnCiG,EAAUwiB,EACZ,kBAACw4C,EAAD,CAAkB/oD,YAAa,SAAAjG,GAC/BA,EAAE4oB,kBACF5oB,EAAEG,mBAEF,kBAACqW,EAAD,CAAY7S,UAAWnW,EAAKO,KAAM+L,IAElCA,EAEJ,OACE,kBAAC,EAAAoN,EAAA,YAA2BxV,EAC1B,kBAAC,KAAD,CACEw9D,YAAa,kBAAM/hC,IAAgB0P,GAAW1P,EAAY3/B,EAAKO,MAC/DogE,WAAYA,GAEZ,kBAACzS,EAAA,EAAD,CAAS1nD,QAAS6oC,EACd,yBAAK9rB,wBAAyB,CAACC,OAAQi+C,iBAAkBpyB,MACzD,MACD7oC,MC4LX,SAAesgB,SAhNA,SAAC,GAoBV,IAnBJqY,EAmBI,EAnBJA,aACA94B,EAkBI,EAlBJA,GACA0hC,EAiBI,EAjBJA,UACA7I,EAgBI,EAhBJA,UACA+C,EAeI,EAfJA,QACAtC,EAcI,EAdJA,YACAV,EAaI,EAbJA,qBACAY,EAYI,EAZJA,yBACAD,EAWI,EAXJA,cACAtkB,EAUI,EAVJA,SACAokB,EASI,EATJA,mBACA1iB,EAQI,EARJA,QACAwiB,EAOI,EAPJA,cACA9/B,EAMI,EANJA,MACAs/B,EAKI,EALJA,SACA1+B,EAII,EAJJA,MACA0oB,EAGI,EAHJA,WACA8W,EAEI,EAFJA,iBACAC,EACI,EADJA,iBAEM4hC,GAAkBpwD,YAAO,MACzBqwD,GAAgBrwD,YAAO,MAmBvBswD,EACFriC,EAAgBsiC,IAAUtiC,EA/CR,KA+C0C,aAE1D6hC,EAAeO,EAAc3vD,QAAU2vD,EAAc3vD,QAAQ8vD,YAAc,IAC3ET,EAAgBM,EAAc3vD,QAAU2vD,EAAc3vD,QAAQgT,aAAe,GAEnF,OACE,yBACEkoC,SAAS,KACT9mD,GAAIA,EACJqvD,QAAS,WACPiM,EAAgB1vD,QAAQC,SAE1B8Q,MAAO,CACLg/C,aAAc,OACdC,OAAQl6B,EAAY,cAAgB,YAEtC,yBAAKz1B,IAAKsvD,EAAe5+C,MAAO,CAACg/C,aAAc,SAC7C,kBAAC,KAAD,KACEE,eAAgB,SAAAC,GAAM,OAAIA,EAAOjkD,SACjCkkD,eAAgB,SAAAD,GAAM,OAAIA,EAAO5hE,KACjC8gE,aAAcA,EACdC,cAAeA,EACfe,WAAY,CACVC,iBACAC,mBACAC,kBAAmBA,EACnBC,oBAAqBA,EACrBC,mBAAoB,KACpB/sD,KAAMA,EACNgtD,SAAUA,EACVC,kBACAC,eAEFC,iBAAkB,kBAAOljC,GAAiB,OAC1CqC,QAASA,EACT8gC,mBAAoB9gC,EACpB+gC,cAAY,GACPxjC,EAAgB,CAACyjC,aAAc,kBAAO,IAAS,GApBtD,CAqBEC,aAAW,EACXC,eAAgB,kBAAM,MACtB9vD,YAAY,GACZ+vD,0BAA0B,EAC1B5N,WAAW,EACXl1D,MAAOA,GAAS,KAChBgb,SAAUA,EACV+nD,cA7DkB,SAAC5jC,EAAYz4B,GACjCw4B,GAAiBC,GACnBoiC,EAAuBpiC,GAEN,KAAfA,GAAsC,iBAAjBz4B,EAAM7E,QAC7Bg9B,KAyDIniB,QAhEW,IAAWA,GAAW,IAiEjCkiB,UAAWA,EACXyhC,WAAY54B,EACZz1B,IAAKqvD,EACL2B,WAzDe,WACjBnkC,GACFA,KAwDIvc,QAAQ2gD,QAAkB7jE,GAC1BA,MAAO,SAAA8jE,GAAW,OAAIjC,QAAiBiC,EAAa9jE,IACpDigC,YAAaA,EACbX,SAAUA,EACVhW,WAAYA,EACZ0W,mBAAoBA,EACpBT,qBAAsBA,EACtBY,yBAA0BA,EAC1B4jC,mBAAmB,EACnB3jC,iBAAkBA,EAClBC,iBAAkBA,UCnF5B,QApCqB,SAAA77B,GAAK,OACxB,kBAAC,EAAD,KACEmC,GAAInC,EAAMmC,GACV0hC,UAAW7jC,EAAM6jC,UACjB9F,SAAS,EACT3mB,SAAUpX,EAAMoX,SAChBhb,MAAO4D,EAAM5D,MACbojE,iBAAe,GACXx/D,EAAM8Y,WCuBd,QA/BoB,SAAA9Y,GAAK,OACvB,kBAAC,EAAD,KACEmC,GAAInC,EAAMmC,GACV47B,SAAS,EACT8F,UAAW7jC,EAAM6jC,UACjBzsB,SAAUpX,EAAMoX,SAChBhb,MAAO4D,EAAM5D,MACbojE,iBAAe,GACXx/D,EAAM8Y,W,6GCDd,QARyBzd,kBAAmB,SAAA2E,GAAK,MAAK,CACpD1C,KAAM,UADiBjC,CAAH,IAIhB40D,MCmBN,QAAewP,eApBI,SAAAz/D,GAAK,OACtB,kBAAC,KAAD,CAAuB6jC,UAAW7jC,EAAM6jC,WACtC,kBAAC,EAAD,CACEtjB,SAAUvgB,EAAM6jC,UAChB1hC,GAAInC,EAAMmC,GACVmG,KAAMtI,EAAMsI,KACZ8O,SAAU,SAAA9I,GAAC,OAAItO,EAAMoX,SAAS9I,EAAEtC,OAAO5P,QACvCynC,UAAW7jC,EAAM6jC,UACjBznC,MAAO4D,EAAM5D,OAAS,SCb5B,QCFwB,WAAM,MACtBsjE,GAAqB,QAAT,EAAAC,iBAAA,eAAWD,YAAa,GAC1C,MAAO,iCAAiCn4B,KAAKm4B,I,qmBCE/C,IAAME,IAAahE,QAAH,KACZ3L,MAOS4P,GAAoBxkE,SAAH,KASxBukE,IAOOE,GAAiBzkE,cAAH,KACvBukE,ICGJ,SA1ByB,SAAC,GAAD,IAAExjE,EAAF,EAAEA,MAAOgb,EAAT,EAASA,SAAU9O,EAAnB,EAAmBA,KAAMnG,EAAzB,EAAyBA,GAAIoe,EAA7B,EAA6BA,SAAUsjB,EAAvC,EAAuCA,UAAvC,OACrB,kBAACg8B,GAAD,CAEEE,wBAAuBL,IAAuB,GAAKtjE,GAEnD,kBAAC0jE,GAAD,CACE1jE,MAAOA,EACPkM,KAAMA,EACNnG,GAAIA,EACJiV,SAAUA,EACVmJ,SAAUA,EACVsjB,UAAWA,EACXm8B,KAAK,QCWb,SAAeP,eAtBE,SAAAz/D,GAAK,OACpB,kBAAC,KAAD,CAAuB6jC,UAAW7jC,EAAM6jC,WACtC,kBAAC,GAAD,CACE1hC,GAAInC,EAAMmC,GACV0hC,UAAW7jC,EAAM6jC,UACjBo8B,QAAS,GACT33D,KAAMtI,EAAMsI,KACZ8O,SAAU,SAAA9I,GAAC,OAAItO,EAAMoX,SAAS9I,EAAEtC,OAAO5P,QACvCmkB,SAAUvgB,EAAM6jC,UAChBm8B,KAAM,EACN5jE,MAAO4D,EAAM5D,Y,onBCVZ,IAAM8jE,GAA0B7kE,WAAH,KAE9B40D,MAIOkQ,GAAiC9kE,SAAH,MAC9B,qBAAEwoC,UAA2B,EAAI,aAGjCu8B,GAA4B/kE,SAAH,KAEhC80D,MAGW,qBAAEtsB,UAA2B,OAAS,WAGpC,qBAAEA,UAA2B,QAAU,U,s/BCVpDw8B,e,sBAIJ,WAAYrgE,GAAO,0BACjB,cAAMA,GADW,yBAHP,MAGO,qCAFI,GAEJ,oBA6Bb,SAAAmC,GAAE,OAAI,EAAKnC,MAAMrD,KAAK+J,cAAc,CAACvE,UA7BxB,oCA+BG,SAAAm+D,GACpB,IAAMvjE,EAAS,EAAKwjE,UAAU,EAAKvgE,MAAMrD,KAAKI,QAE9C,EAAK+b,QAAL,OACE0nD,MAAM,EACNppD,SAAU,EAAKqpD,eACfC,UAAU,EACVC,cAAe,GACfC,YAAa,EAAK5gE,MAAM6jC,UACxBg9B,YAAa,EAAK7gE,MAAM5D,OACpBW,EAAS,CAACA,UAAU,IACpB,EAAKiD,MAAM8Y,QAAU,EAAK9Y,MAAM8Y,QAAQigB,iBAAmB,IAGjE,EAAKunC,UAAY,IAAI,EAAKQ,UAAU,EAAKC,QAAQhzD,QAAS,EAAK+K,SAC/D,EAAKwnD,UAAUU,kBAAkBC,UAAUxoC,IAAI,kBAC/C,EAAK6nC,UAAUU,kBAAkBliD,MAAMoiD,WAAa1lE,gBAAiB,UAAjBA,CAA4B,EAAKwE,OACrF,EAAKsgE,UAAUU,kBAAkB1iD,iBAAiB,UAAW,EAAK6iD,kBAE9D,EAAKnhE,MAAM6yC,aACb,EAAK7yC,MAAM6yC,cAEb,EAAKp3B,SAAS,CAACilD,SAAU,EAAKJ,UAAUI,SAAStkE,WArDhC,0BAwDP,SAAAglE,GACV,GAAI,EAAKb,UAAW,CAClB,IAAIxjE,EAAS,EAAKwjE,UAAUa,GAM5B,OAHKrkE,GAAU,EAAK+jE,YAClB/jE,EAAS,EAAK+jE,UAAUO,MAAMC,IAEzBvkE,EAET,OAAO,QAlEU,+BAmGF,SAAAwkE,GACf,IAAMC,EAAaD,EAAcxlE,KAAI,SAAAq9B,GAAI,OAAIA,EAAKqoC,iBAClD,EAAKhmD,SAAS,CAACilD,SAAU,EAAKJ,UAAUI,SAAStkE,SAC7C,EAAKigC,YAAoC,IAAtBmlC,EAAWlgE,SAChC,EAAKtB,MAAMoX,SAASoqD,MAvGL,yBA2GR,WACT,OAAO,EAAKxhE,MAAM5D,OAAS,EAAK4D,MAAM5D,MAAMkF,OAAS,GAAK,EAAKtB,MAAM5D,MAAMgrD,OAAM,SAAAlrC,GAAC,OAAIA,QA5GrE,6BA+GJ,WACb,GAAI,EAAKlc,MAAMi9B,OAAQ,CACrB,IAAMykC,EAAW,EAAKpB,UAAUI,SAAStkE,MACzC,EAAK4D,MAAMi9B,OAAOykC,EAAU,EAAKpB,UAAUiB,eAAe,SAAAvgC,GAAC,OAAI,EAAKs/B,UAAUqB,QAAQ3gC,GAAG,UAlH1E,iCA8HA,SAAA1yB,IACXA,EAAEtC,OAAOi1D,UAAU5iD,SAAS,mBAA+B,QAAV/P,EAAEjS,KAAkBiS,EAAEszD,WAAuB,UAAVtzD,EAAEjS,MAC1F,EAAKwlE,aACL,EAAKC,eACLtG,YAAW,WACT,EAAK8E,UAAUxgE,YAGL,UAAVwO,EAAEjS,MACJiS,EAAEG,iBACFH,EAAE4oB,sBAtIJ,EAAK6pC,QAAUp/D,gBAEf,EAAKjF,MAAQ,CAACgkE,SAAU,IAGxB,kCAEArmD,QAAQ1c,IAAI,CACV,kCACA,kCACA,kCACA,oCACCwI,MAAK,SAAAtK,GACD,EAAKkmE,uBACR,EAAKjB,UAAYjlE,EAAS,GAAT,QACjB,EAAK0kE,UAAY,CACf,QAAS1kE,EAAS,GAAGmmE,OACrB,GAAMnmE,EAAS,GAAGmmE,OAClB,GAAMnmE,EAAS,GAAGomE,OAClB,GAAMpmE,EAAS,GAAGqmE,SAGpB,EAAKC,0BAxBQ,E,wDAqEAlhE,EAAWC,EAAWC,GAAU,WACjD,GAAIC,KAAK0/D,WAAa1/D,KAAKk/D,UAAW,CACpC,IAAM8B,EAActmD,gBAAc1a,KAAKpB,MAAM8Y,QAAQigB,iBAAkB93B,EAAU6X,QAAQigB,kBAQzF,GAPIlhB,OAAOzC,KAAKgtD,GAAa9gE,OAAS,IACpCuW,OAAOsE,QAAQimD,GAAa3nD,SAAQ,YAAkB,gBAAhBpe,EAAgB,KAAXD,EAAW,KACpD,EAAKkkE,UAAU+B,IAAIhmE,EAAKD,MAE1BgF,KAAKk/D,UAAUgC,WAGZ78B,KAASxkC,EAAUtE,KAAKI,OAAQqE,KAAKpB,MAAMrD,KAAKI,QAAS,CAC5D,IAAMA,EAASqE,KAAKmhE,UAAUnhE,KAAKpB,MAAMrD,KAAKI,QAC9CqE,KAAK0/D,UAAU0B,SAASzlE,GACxBqE,KAAKk/D,UAAU+B,IAAI,SAAUtlE,GAC7BqE,KAAKk/D,UAAUgC,SAEZ78B,KAASxkC,EAAU7E,MAAOgF,KAAKpB,MAAM5D,SACxCgF,KAAKk/D,UAAUqB,QAAQvgE,KAAKpB,MAAM5D,OAAO,GACzCgF,KAAKk/D,UAAUgC,a,6CAMnBlhE,KAAK2gE,sBAAuB,EACxB3gE,KAAKk/D,WACPl/D,KAAKk/D,UAAUmC,Y,mCAyBjB,IAAMC,EAAethE,KAAK2/D,QAAQhzD,QAAQ4H,cAAc,8CACpD+sD,GACFA,EAAa10D,U,+BAkBR,WACP,OACE,oCACE,kBAACmyD,GAAD,CACEt8B,UAAWziC,KAAKpB,MAAM6jC,UACtB1hC,GAAIf,KAAKpB,MAAMmC,GACf8mD,SAAS,KACTuI,QAAS,WACP,EAAKqQ,aACLrG,YAAW,WACL,EAAK8E,WACP,EAAKA,UAAUthE,WAIrBqP,UAAWjN,KAAK+/D,kBAEhB,kBAACf,GAAD,CACEuC,aAAA,EACA1lC,OAAQ77B,KAAK0gE,aACbj+B,UAAWziC,KAAKpB,MAAM6jC,UACtBz1B,IAAKhN,KAAK2/D,SAEV,kBAACb,GAAD,OACM9+D,KAAKpB,MAAM6jC,UAAY,CAACtjB,SAAU,YAAc,GADtD,CAEEjjB,KAAK,OACLslE,cAAA,EACA/+B,UAAWziC,KAAKpB,MAAM6jC,WACjBziC,KAAKpB,MAAM8Y,QAAU,CAAC3J,YAAa/N,KAAKpB,MAAM8Y,QAAQ+pD,iBAAmB,KAEhF,kBAAC3C,GAAD,CACE3/C,UAAQ,EACRsjB,UAAWziC,KAAKpB,MAAM6jC,UACtBznC,MAAOgF,KAAK1E,MAAMgkE,YAElBt/D,KAAKpB,MAAM6jC,WAAaziC,KAAKpB,MAAM5D,MAAM0N,QAAO,SAAAuc,GAAC,OAAIA,KAAG/kB,OAAS,GAAK,kBAACuJ,EAAA,EAAD,CACtEpP,KAAK,QACLwtD,UAAW,EACXxiD,aAAYrF,KAAK6M,IAAI,gDACrBsG,YAAa,SAAAjG,GACXA,EAAEG,iBACF,EAAKzO,MAAMoX,SAAS,gB,EAzL9BipD,CAAqB1+D,eAmN3B,UAAeihB,SAAUxd,QAAWi7D,K,0BChOvByC,GAAY,SAAAC,GACvB,GAAKA,GAA0B,IAAjBA,EAAMzhE,OAEb,IAAqB,IAAjByhE,EAAMzhE,OACf,OAAOyhE,EAAM,GAEb,MAAM,IAAI9yC,MAAJ,8CAAiD8yC,EAAMpjE,KAAK,QAJlE,OAAO,MAsCEqjE,GAA8B,SAAAxqC,GAazC,OAHAyI,KATsB,CACpBgiC,EAAG,KACH58D,EAAG,KACH68D,EAAG,OACHC,EAAG,IACHC,EAAG,KACHC,EAAG,IACHh9C,EAAG,OAEkB,SAACnK,EAAGynC,GACzBnrB,EAASA,EAAO9X,QAAQxE,EAAGynC,MAEtBnrB,G,skBCYT,SA3DwB,SAAC,GAAsD,IAArDphB,EAAqD,EAArDA,SAAU0B,EAA2C,EAA3CA,QAAS3W,EAAkC,EAAlCA,GAAI/F,EAA8B,EAA9BA,MAAOynC,EAAuB,EAAvBA,UAAWzhC,EAAY,EAAZA,OAE3DzF,GAAO2mE,UAEPC,EAAwB,kBAAMjrC,OAASv7B,OAAOJ,EAAKI,QAAQymE,QAAQC,eAAe,MAElFC,EAAY,SAAAl1C,GAChB,IAAMm1C,EAAarrC,KAAO9J,EAAG,CAAC+0C,IANZ,eAOlB,OAAOI,EAAW7I,UAAY6I,EAAWC,SAAW,MAgBhD7qC,EAAmB,IACvB8qC,UAAWb,GAA4BO,KACvCO,WAAYd,GAzBM,cA0BlBe,YAAY,EACZL,UAAWA,GACP5qD,EAAUA,EAAQigB,iBAAmB,IAG3C,OACE,kBAAC,GAAD,CACE52B,GAAIA,EACJ/F,MAAO,CAACA,GACR6gC,OAnBW,SAAC+mC,EAAYj9C,EAAQk9C,GAClC,IAAMC,EAASR,EAAUM,GACrBj9C,EAAO,GAAKm9C,GAAW,GACzBD,EAASC,IAiBT9sD,SA1BiB,SAAA+sD,GACnB,IAAMC,EAAWtB,GAAUqB,GACrB/qC,EAAOgrC,EDHgB,SAAAhrC,GAC/B,GAAY,MAARA,EACF,OAAO,KAGT,IAAMirC,EAAU,IAAI1vC,KAAKyE,GAEnBkrC,EAAOD,EAAQE,cACfC,EAAQH,EAAQI,WAAa,EAC7BC,EAAML,EAAQM,UAEpB,MAAO,CACLL,GACCE,EAAQ,EAAI,GAAK,KAAOA,GACxBE,EAAM,EAAI,GAAK,KAAOA,GACvB/kE,KAAK,KCZmBilE,CAAkBR,GAAY,KACtDhtD,EAASgiB,IAwBPtgB,QAAO,SAAMA,GAAN,IAAeigB,qBACtB8K,UAAWA,EACXzhC,OAAQA,K,skBCgBd,UAAegD,SAxDa,SAAApF,GAC1B,IAAM6kE,EAAmBvsC,OAASv7B,OAAOiD,EAAMrD,KAAKI,QAAQymE,QAAQC,eAAe,KAC7EqB,EAAmBxsC,OAASv7B,OAAOiD,EAAMrD,KAAKI,QAAQymE,QAAQC,eAAe,MAC7EsB,EAAgB/B,GAA4B6B,GAC5CG,EAAgBhC,GAA4B8B,GAE5CpB,GAAY/1D,cAAQ,kBAAM,SAAA6gB,GAC9B,IAAMm1C,EAAarrC,KAAO9J,EAAG,CAAC,eAAgBq2C,EAAkBC,IAChE,OAAOnB,EAAW7I,UAAY6I,EAAWC,SAAW,QACnD,IASG7qC,EAAmB,IACvBksC,YAAY,EACZC,WAAW,EACXnB,YAAY,EACZL,UAAWA,EACXG,UAAW,GAAF,OAAKkB,EAAL,YAAsBC,GAC/BlB,WAAY,wBACR9jE,EAAM8Y,QAAU9Y,EAAM8Y,QAAQigB,iBAAmB,IAKvD,OACE,kBAAC,GAAD,CACE38B,MAAO,CAAC4D,EAAM5D,OACdgb,SALiB,SAAA+sD,GAAK,OAAInkE,EAAMoX,SAAS0rD,GAAUqB,KAMnDlnC,OAvBW,SAAC+mC,EAAYj9C,EAAQk9C,GAClC,IAAMC,EAASR,EAAUM,GACrBj9C,EAAO,GAAKm9C,GAAW,GACzBD,EAASC,IAqBTrgC,UAAW7jC,EAAM6jC,UACjB/qB,QAAO,SAAM9Y,EAAM8Y,SAAZ,IAAqBigB,qBAC5B32B,OAAQpC,EAAMoC,Y,uFCjCpB,SARuB/G,kBAAmB,SAAA2E,GAAK,MAAK,CAClD1C,KAAM,UADejC,CAAH,KAId40D,MC8CN,SA5CiB,SAAAjwD,GACf,IAQMmlE,IAAc1mE,OAAO2mE,QAErBC,EAAkBrlE,EAAM5D,QAAU4D,EAAM6jC,YAAcshC,EAEtD/oE,EAAQ4D,EAAM5D,OAAS,GAE7B,OACE,kBAAC,KAAD,CAAuBynC,UAAW7jC,EAAM6jC,WACtC,kBAAC,GAAD,CACEtjB,SAAUvgB,EAAM6jC,UAChB1hC,GAAInC,EAAMmC,GACV0hC,UAAW7jC,EAAM6jC,UACjBv7B,KAAMtI,EAAMsI,KACZ8O,SArBe,SAAA9I,GACnBtO,EAAMoX,SAAS9I,EAAEtC,OAAO5P,QAqBpBA,MAAOA,IAERipE,GAAmB,kBAAC,KAAD,KAClB,kBAACx6D,EAAA,EAAD,CACEpP,KAAK,QACLkF,QAvBW,WACjBX,EAAMoX,SAAS,OAuBT6xC,UAAW,O,mFCnCrB,IAAMqc,GAAiBjqE,SAAH,MAiCpB,SA7BiB,SAAA2E,GAOf,OACE,kBAACslE,GAAD,KACE,2BACEhoE,KAAK,WACL6Z,QAASnX,EAAM5D,QAAS,EACxBkM,KAAMtI,EAAMsI,KACZ8O,SAZe,SAAA9I,GACftO,EAAMoX,UACRpX,EAAMoX,SAAS9I,EAAEtC,OAAOmL,UAWtBhV,GAAInC,EAAMmC,GACVoe,SAAUvgB,EAAM6jC,c,0bClBjB,IAAM0hC,GAAalqE,SAAH,KAGNC,YAAa,IAGjB4/D,GAAuB7/D,SAAH,KAI7B0E,KAGWzE,YAAa,IC0C5B,SAnDa,SAAC,GAA6D,IAA5Dc,EAA4D,EAA5DA,MAAOuiC,EAAqD,EAArDA,cAAekF,EAAsC,EAAtCA,UAAW2hC,EAA2B,EAA3BA,SAAUC,EAAiB,EAAjBA,YAClDC,EAAoBtpE,EAAMsyC,YAActyC,EAAMsyC,WAAWG,WAAW,SAE1E,OACE,kBAAC02B,GAAD,CAAYI,UAAU,cACpB,kBAACC,GAAA,EAAD,KACE3hE,IAAK7H,EAAMypE,UACPH,GAAqB,CAACI,QAAS1pE,EAAMypE,UAF3C,CAGEA,SAAUzpE,EAAMypE,SAChBE,cAAc,OACdC,cAAc,OACdC,OAAQ7pE,EAAMsyC,WACdw3B,aAAc9pE,EAAMwyC,iBAEtB,kBAACssB,GAAD,MACIr3B,GACC,kBAACx5B,GAAA,EAAD,CACD5O,KAAK,QACLkF,QAAS,kBAAM6kE,EAAS,OACxBvc,UAAW,EACXvtD,MAAO+pE,GAAe,WAGxB,kBAACp7D,GAAA,EAAD,KACE,kBAACU,GAAA,EAAD,CACEwU,SAAO,EACP9jB,KAAK,kBACL2tB,SAAUhtB,EAAMypE,SAChBlnE,KAAMyqB,oBAAwBhtB,EAAMsyC,YACpCua,UAAW,EACXvtD,MAAOijC,GAAiB,iBCvC7B,I,6dCKA,IAAMwnC,GAAuB9qE,SAAH,KAEdC,YAAa,IAMnB8qE,IAA2B/qE,QAAOmI,MAAPnI,CAAH,MAE/BiM,QAAY,CAACua,SAAUvmB,WAAY,MAI5B+qE,GAAkChrE,SAAH,KAOvBC,YAAa,ICalC,SA1BuB,SAAA0E,GAAK,OAC1B,kBAACmmE,GAAD,KACE,kBAACP,GAAA,EAAD,CACEE,QAAS9lE,EAAM+tC,KAAKzlC,KACpBy9D,cAAc,OACdC,cAAc,OACdC,OAAQjmE,EAAM+tC,KAAKY,QACnBu3B,aAAclmE,EAAM+tC,KAAKzwC,KAAKuxC,WAAW,SAAW7uC,EAAM+tC,KAAKY,QAAU,OAE3E,kBAAC03B,GAAD,KACE,kBAAC,IAAD,CAAgBxlE,SAAU8b,wBAC1B,kBAACypD,GAAD,KAA2BpmE,EAAM8R,MAAQ,YAAzC,MFxBqBw0D,EEwB+CtmE,EAAM+tC,KAAKxoC,KFtB7E8gB,EAAI/N,KAAKiuD,MAAMjuD,KAAKkuD,IAAIF,GAAShuD,KAAKkuD,IAAI,OAChD,UAAmD,GAAxCF,EAAQhuD,KAAKmuD,IAAI,KAAMpgD,IAAIqgD,QAAQ,GAA9C,YAFc,CAAC,QAAS,KAAM,KAAM,KAAM,MAEoBrgD,KEqB1D,OFxBqB,IAAAigD,EAEnBjgD,G,oLGeR,SAR0BhrB,SAAH,MACnBiM,WACQ,SAAAtH,GAAK,OAAIA,EAAM6jC,UAAY,cAAgB,YACjCroC,WAAY,UACvB,SAAAwE,GAAK,OAAIA,EAAM6jC,UAAY8iC,YAAoB3mE,GAAS2mE,YAAoB3mE,KAC1E1E,YAAa,I,gVCRnB,IAAMC,GAAoBF,SAAH,KAC1B0E,KAEQzE,YAAa,KAGVA,YAAa,KAAQA,YAAa,IAIpCsrE,IAAiBvrE,QAAOwrE,KAAPxrE,CAAH,MCuB3B,SA9BoB,SAAC,GAA0C,IAAjCyrE,EAAiC,EAAzCzyD,OAAoBwvB,EAAqB,EAArBA,UAAW/xB,EAAU,EAAVA,KAGnD,OACE,kBAAC,GAAD,CAAmB+xB,UAAWA,GAC5B,kBAAC+iC,GAAD,CACErmD,SAAUsjB,EACV7F,UAAU,EACV3pB,OAPS,SAAA0yD,GAAK,OAAID,EAAWC,EAAM,KAQnCrrE,MAAOoW,GAAQ,0BAEf,kBAACvW,GAAD,KACE,kBAAC8O,GAAA,EAAD,KACE,kBAAC,KAAD,CACE5O,KAAK,eACLoF,SAAU8b,6BCbjB,IAAMqqD,GAAS,SAAAhnE,GAAS,IAE3B5D,EAGE4D,EAHF5D,MACA6qE,EAEEjnE,EAFFinE,cACAzB,EACExlE,EADFwlE,SAJ2B,GAMDnhE,cAAS,CACnC6iE,aAAa,EACbC,YAAa,OARc,YAMtBC,EANsB,KAMdC,EANc,KA8B7B,OANA1iE,gBAAU,WACH8gC,KAASrpC,IATdirE,EAAU,CAACH,aAAa,EAAOC,YAAa,SAY3C,CAAC/qE,IAEAA,GAASA,EAAMsyC,WACV,kBAAC,GAAD,OAAU1uC,EAAV,CAAiBylE,YAAawB,EAAa,OAAStoC,cAAesoC,EAAc79C,YAC/Eg+C,EAAOF,YACT,kBAAC,GAAD,KAAgBn5B,KAAMq5B,EAAOD,YAAar1D,KAAMm1D,EAAcK,WAAetnE,IAE/E,kBAAC,GAAD,OAAiBA,EAAjB,CAAwBqU,OAhBhB,SAAA05B,IARW,SAAAA,GACxBs5B,EAAU,CAACH,aAAa,EAAMC,YAAap5B,IAQ3Cw5B,CAAkBx5B,GAClBy3B,EAASz3B,QAiBbi5B,GAAO9kC,aAAe,CACpB+kC,cAAe,IA8BjB,YC3EA,IAAMO,GAAW,SAAAxnE,GAaf,OACE,kBAAC,GAAD,CACEwlE,SAda,SAAAz3B,GACF,OAATA,EACE/tC,EAAMoX,UACRpX,EAAMoX,SAAS,MAGbpX,EAAM8Y,QAAQuhB,QAChBr6B,EAAM8Y,QAAQuhB,OAAO0T,IAQvBlK,UAAW7jC,EAAM6jC,UACjBojC,cAAe,CACb5sC,OAAQr6B,EAAM8Y,QAAQyhB,WACtB+sC,UAAWtnE,EAAM8Y,QAAQ0hB,cACzBitC,OAAQznE,EAAM8Y,QAAQ4hB,WACtBtR,SAAUppB,EAAM8Y,QAAQ2hB,cAE1Br+B,MAAO4D,EAAM5D,MAAQ4D,EAAM5D,MAAQ,QAKzCorE,GAAStlC,aAAe,CACtBppB,QAAS,IAgBX,Y,yrBC3CA,IAAM4uD,GAAiBrsE,SAAH,MAOZ,SAAA2E,GAAK,OAAI2nE,QAAkB3nE,EAAO,Y,GAuCd,4BA9BtB4nE,e,sBAGJ,WAAY5nE,GAAO,0BACjB,cAAMA,GADW,yBAFP,MAEO,6BAWJ,SAAC5D,EAAOyrE,EAAOx4C,GAC5B,GAAI,EAAKrvB,MAAMoX,UAAuB,SAAXiY,EAAmB,CAC5C,IAAMnT,EAAc,gBAAV9f,EAA0B,GAAKA,EACzC,EAAK4D,MAAMoX,SAAS8E,OAVtB,oCAEA,oCAEA,EAAK4rD,WAAYC,WAAK,kBAAM,uCARX,E,8CAmBjB,OAAI3mE,KAAKpB,MAAM6jC,UACN,kBAAC/vB,GAAA,QAAD,KACL,yBAAKuL,wBAAyB,CAACC,OAAQi+C,iBAAkBn8D,KAAKpB,MAAM5D,WAKtE,kBAACsrE,GAAD,KACE,kBAAC,EAAAM,SAAD,CAAUC,SAAQ,IAChB,uBAAMH,UAAN,CACEx/D,KAAMlH,KAAKpB,MAAMsI,KACjB8O,SAAUhW,KAAK8mE,aACf/lE,GAAIf,KAAKpB,MAAMmC,GACf3G,MAAM,OACNwf,aAAc5Z,KAAKpB,MAAM5D,MACzBo2B,QAAS,CACP21C,UAAW,CACTC,aAAa,Y,EAvCvBR,CAAiBjmE,eAiDvBimE,GAAS1lC,aAAe,CACtB9lC,MAAO,IAWT,YCvCA,SAxCqB,SAAA4D,GAAK,OACxB,kBAAC,EAAD,KACEmC,GAAInC,EAAMmC,GACV47B,SAAS,EACT8F,UAAW7jC,EAAM6jC,UACjBzsB,SAAUpX,EAAMoX,SAChBhb,MAAO4D,EAAM5D,OACT4D,EAAM8Y,WCkCd,SAzC0B,SAAA9Y,GAAK,OAC7B,kBAAC,EAAD,KACEmC,GAAInC,EAAMmC,GACV47B,SAAO,EACP8F,UAAW7jC,EAAM6jC,UACjBzsB,SAAUpX,EAAMoX,SAChBhb,MAAO4D,EAAM5D,OACT4D,EAAM8Y,WC4Bd,SAnCyB,SAAA9Y,GAAK,OAC5B,kBAAC,EAAD,KACE6jC,UAAW7jC,EAAM6jC,UACjBzsB,SAAUpX,EAAMoX,SAChBhb,MAAO4D,EAAM5D,OACT4D,EAAM8Y,W,uFCEd,SARsBzd,kBAAmB,SAAA2E,GAAK,MAAK,CACjD1C,KAAM,SADcjC,CAAH,KAIb40D,MC0CN,SAAewP,eA9BC,SAAAz/D,GAAK,OACnB,kBAAC,KAAD,CAAuB6jC,UAAW7jC,EAAM6jC,WACtC,kBAAC,GAAD,CACEtjB,SAAUvgB,EAAM6jC,UAChB1hC,GAAInC,EAAMmC,GACV0hC,UAAW7jC,EAAM6jC,UACjBv7B,KAAMtI,EAAMsI,KACZ8O,SAAU,SAAA9I,GAAC,OAAItO,EAAMoX,WAfzBxY,GADmBA,EAgB4B0P,EAAEtC,OAAO5P,OAf9CqN,eACFwd,QAAQ,KAAO,IAAM,kBAAkBsgB,KAAK3oC,KAClDA,EAAM,WAAH,OAAcA,IAGZA,IANY,IAAAA,GAiBfxC,MAAO4D,EAAM5D,QAEd4D,EAAM5D,OAAS,kBAAC,KAAD,KACd,kBAAC2O,GAAA,EAAD,CACEpM,KAAMqB,EAAM5D,MACZX,KAAK,gBACL6b,KAAK,OACL2xC,UAAW,EACXj9C,OAAO,SACPuT,SAAO,S,yICzBf,SARwBlkB,kBAAmB,SAAA2E,GAAK,MAAK,CACnD1C,KAAM,SADgBjC,CAAH,KAIf40D,M,k/BCiHN,SA7GMoY,Y,wBAIJ,WAAYroE,GAAO,mBACjB,cAAMA,GADW,qCAHI,GAGJ,wCAFQ,MAER,0CAmBS,SAACsoE,EAAKC,GAChC,IAAMC,EAASF,EAAIhiD,UAAU,EAAGiiD,EAAgB,GAAG3uD,MAAM,OACzD,OAAO4uD,EAASA,EAAOlnE,OAAS,KArBf,gCAwBD,SAAClF,EAAOqsE,EAAeF,GACvC,GAAIA,GAAiBnsE,EAAMkF,SAAWinE,EAAe,CACnD,IAAMG,EAAoB,IAAI,EAAKhsE,MAAMisE,eAAeC,UAAU,EAAKlsE,MAAMohC,gBAAgBh8B,MAAM2mE,GAC7FI,EAAmB,IAAI,EAAKnsE,MAAMisE,eAAeC,UAAU,EAAKlsE,MAAMohC,gBAAgBh8B,MAAM1F,GAE5F0sE,EAAiB,EAAKC,0BAA0BL,EAAmBH,GAGnE1qD,EAFgB,EAAKkrD,0BAA0BF,EAAkBN,GAExCO,EAE/BrqE,OAAOuqE,sBAAsB,WAC3B,IAAMC,EAAQV,EAAgB1qD,EAC9Bzc,KAAK8nE,kBAAkBD,EAAOA,IAC9BvU,KAAK,EAAKgO,aAAa30D,cArCV,6BAyCJ,SAAAu6D,GAAG,OAAIA,EAAI5nD,QAAQ,MAAO,OAzCtB,6BA2CJ,SAAApS,GACb,IAAM66D,EAAW76D,EAAEtC,OAAO5P,MACnBusE,EAAkB,EAAKjsE,MAAvBisE,eACDS,EAAeT,EAAiBA,EAAeU,YAAYF,EAAU,EAAKzsE,MAAMohC,gBAAkBqrC,EAElGG,EAAkBra,IAASma,GAC7B,EAAKG,aAAa,IAAI,EAAK7sE,MAAMisE,eAAeC,UAAU,EAAKlsE,MAAMohC,gBAAgBh8B,MAAMqnE,IAC3FR,EAAea,aAAaJ,EAAc,SAE9C,EAAKppE,MAAMoX,SAASkyD,GAEpB,IAAMG,EAAuBn7D,EAAEtC,OAAO09D,eACtC,EAAKC,gBAAgBR,EAAU,EAAKnpE,MAAM5D,MAAOqtE,MAvDhC,sCA0DK,WACtB,OAAI,EAAKzpE,MAAM5D,OAAS,EAAKM,MAAMisE,gBAAkB,EAAKjsE,MAAMisE,eAAeC,UACtE,IAAI,EAAKlsE,MAAMisE,eAAeC,UAAU,EAAKlsE,MAAMohC,gBAAgBh8B,MAAM,EAAK9B,MAAM5D,OAGtF,EAAK4D,MAAM5D,OAAS,MA7D3B,IAAM0hC,EAAiBv9B,IAAKP,EAAO,2BAA6B,EAAK4pE,yBAFpD,OAGjB,EAAKltE,MAAQ,CAACisE,eAAgB,KAAM7qC,kBACpC,EAAK+rC,uBACL,EAAKnH,aAAe/gE,gBALH,E,yKASY,+B,OAAvBgnE,EAAiBA,EAAjBA,KACDvnE,KAAK2gE,sBACR3gE,KAAKqa,SAAL,SAAkBra,KAAK1E,OAAvB,IAA8BisE,oB,0IAKhCvnE,KAAK2gE,sBAAuB,I,+BAmD5B,IAAM+H,EAAe1oE,KAAK2oE,wBAE1B,OACE,kBAAC,KAAD,CAAuBlmC,UAAWziC,KAAKpB,MAAM6jC,WAC3C,kBAAC,GAAD,CACEtjB,SAAUnf,KAAKpB,MAAM6jC,YAAcziC,KAAK1E,MAAMisE,eAC9CxmE,GAAIf,KAAKpB,MAAMmC,GACfmG,KAAMA,KACN8O,SAAUhW,KAAK8mE,aACfrkC,UAAWziC,KAAKpB,MAAM6jC,YAAcziC,KAAK1E,MAAMisE,eAC/Cv6D,IAAKhN,KAAKshE,aACVtmE,MAAO0tE,IAERA,GAAgB,kBAAC,KAAD,KACf,kBAAC/+D,GAAA,EAAD,CACEpM,KAAI,cAASyC,KAAKpB,MAAM5D,OACxBX,KAAK,QACLwtD,UAAW,EACX1pC,SAAO,U,EAzFb8oD,CAAkB1mE,e,wrBCFxB,IAAMqoE,GAAqB3uE,WAAH,KAElB40D,MAMAga,GAA8B5uE,WAAH,KAQXC,YAAa,IAIpB,SAAA0E,GAAK,OAAIA,EAAM6jC,WACZqmC,SAAsB3pE,IAAKP,EAAMxE,MAAO,gBACxCA,WAAY,WACd,SAAAwE,GAAK,OAAIA,EAAM6jC,UAAY,cAAgB,aAKrDsmC,GAA2B9uE,UAAH,M,s/BC1BxB+uE,e,sBACJ,WAAYpqE,GAAO,0BACjB,cAAMA,GADW,uCAUM,SAAAqqE,GACvB,IAAKA,GAAiC,IAAjBA,EACnB,MAAO,CAACC,MAAO,GAAIC,QAAS,IAG9B,IAAMA,EAAUxyD,SAAUsyD,EAAe,IAAe,IAExD,MAAO,CAACC,MADMvyD,SAAUsyD,EAAe,KAAoB,IAC5CE,cAjBE,kCAoBC,WAClB,EAAK9uD,SAAS,CACZ+uD,WAAY,EAAKC,YAAY18D,QAAQk0B,YACrCyoC,aAAc,EAAKC,cAAc58D,QAAQk0B,iBAvB1B,mCA2BE,SAAChhC,EAAWC,GAC3B,EAAKxE,MAAM4tE,QAAUppE,EAAUopE,OACjC,EAAK7uD,SAAS,CAAC+uD,WAAY,EAAKC,YAAY18D,QAAQk0B,cAElD,EAAKvlC,MAAM6tE,UAAYrpE,EAAUqpE,SACnC,EAAK9uD,SAAS,CAACivD,aAAc,EAAKC,cAAc58D,QAAQk0B,iBAhCzC,iCAoCA,SAAA3zB,GACjB,IAAMg8D,EAAQh8D,EAAEtC,OAAO5P,MAAMskB,QAAQ,UAAW,IAChD,EAAKjF,SAAL,SAAkB,EAAK/e,OAAvB,IAA8B4tE,WAC9B,EAAKpC,aAAaoC,EAAO,SAvCR,yCA0CQ,SAAAt+D,GACzB,IAAIu+D,EAAUv+D,EAAO5P,MAAMskB,QAAQ,UAAW,IAkB9C,OAhBK1U,EAAO4+D,SAASz/C,QACnBo/C,EAAU,GAGR,UAAGA,GAAUjpE,OAAS,IACxBipE,EAAU,UAAGA,GAAU7mB,MAAM,EAAG,IAG9B6mB,EAAU,KACZA,EAAU,GAGRA,EAAU,IACZA,EAAU,IAGLA,KA7DU,oCAgEG,SAAAj8D,GACpB,IAAMi8D,EAAU,EAAKM,yBAAyBv8D,EAAEtC,QAChD,EAAKyP,SAAL,SAAkB,EAAK/e,OAAvB,IAA8B6tE,aAE9B,EAAKrC,aAAa,KAAMqC,GAEU,IAA9BA,EAAQpjC,WAAW7lC,QAA4B,IAAZipE,GACrCj8D,EAAEtC,OAAOpP,YAvEM,6BA2EJ,SAAC0tE,EAAOC,GACrB,IAAMO,EAA2B,OAAZP,EAAmBA,EAAU,EAAK7tE,MAAM6tE,QACvDQ,EAAwB,OAAVT,EAAiBA,EAAQ,EAAK5tE,MAAM4tE,MACnC,KAAjBQ,GAAsC,KAAfC,EAI3B,EAAK/qE,MAAMoX,SzBjBsB,SAACkzD,EAAOC,GAC3C,OAAKD,GAAUC,EAG0B,IAAdD,GAAS,GAAU,IACD,KAAhBC,GAAW,GAH/B,KyBeaS,CAAsBD,EAAYD,IAHpD,EAAK9qE,MAAMoX,SAAS,SA/EL,6BAqFJ,kBAAM,EAAKqE,SAAS,CACjCwvD,UACC,EAAKvuE,MAAM4tE,MAAMnjC,WAAW7lC,QAAU,GAAK,EAAK5E,MAAM6tE,QAAQpjC,WAAW7lC,QAAU,OAvFnE,8BA0FH,kBAAM,EAAKma,SAAS,CAACwvD,WAAW,OA1F7B,kCA4FC,SAAAnoE,GACZA,EAAMooE,UAAY,IAAMpoE,EAAMooE,UAAY,IAC9CpoE,EAAM2L,oBA5FR,EAAKg8D,YAAc9oE,gBACnB,EAAKgpE,cAAgBhpE,gBACrB,EAAKjF,MAAL,SACK,EAAKyuE,uBAAuBnrE,EAAM5D,QADvC,IAEE6uE,UAAWjrE,EAAM5D,OAAS,IANX,E,8CAmGjB,OACE,kBAAC,KAAD,CACE6gC,OAAQ77B,KAAK0gE,aACbj+B,UAAWziC,KAAKpB,MAAM6jC,UACtB/kB,MAAO,CAACssD,UAAW,SACnB,kBAACnB,GAAD,CAA6BpmC,UAAWziC,KAAKpB,MAAM6jC,WACjD,kBAACmmC,GAAD,CACEzpD,SAAUnf,KAAKpB,MAAM6jC,UACrBA,UAAWziC,KAAKpB,MAAM6jC,UACtB/rB,IAAK,EACLV,SAAU,aACVo6C,QAASpwD,KAAKiqE,cACdC,QAASlqE,KAAKmqE,iBACdC,WAAYpqE,KAAKqqE,kBACjBpkC,QAAQ,OACRqkC,KAAM,EACN5sD,MAAO,CAAC3f,MAAOiC,KAAK1E,MAAM8tE,YAC1BltE,KAAK,SACLlB,MAAOgF,KAAK1E,MAAM4tE,QAEnBlpE,KAAK1E,MAAMuuE,WAAa,kBAACn3D,GAAA,QAAD,KAAkB1S,KAAKpB,MAAM8Y,QAAQojB,aAEhE,kBAAC+tC,GAAD,CAA6BpmC,UAAWziC,KAAKpB,MAAM6jC,WACjD,kBAACmmC,GAAD,CACEzpD,SAAUnf,KAAKpB,MAAM6jC,UACrBA,UAAWziC,KAAKpB,MAAM6jC,UACtBzsB,SAAU,aACVo6C,QAASpwD,KAAKiqE,cACdC,QAASlqE,KAAKuqE,oBACdH,WAAYpqE,KAAKqqE,kBACjBpkC,QAAQ,OACRqkC,KAAM,EACN5sD,MAAO,CAAC3f,MAAOiC,KAAK1E,MAAMguE,cAC1BptE,KAAK,SACLlB,MAAOgF,KAAK1E,MAAM6tE,UAEnBnpE,KAAK1E,MAAMuuE,WAAa,kBAACn3D,GAAA,QAAD,KAAkB1S,KAAKpB,MAAM8Y,QAAQqjB,eAEhE,kBAACguC,GAAD,CAA0B/7D,IAAKhN,KAAKqpE,aAAcrpE,KAAK1E,MAAM4tE,OAC7D,kBAACH,GAAD,CAA0B/7D,IAAKhN,KAAKupE,eAAgBvpE,KAAK1E,MAAM6tE,c,EA3IjEH,CAAqBzoE,eAiJ3ByoE,GAAaloC,aAAe,CAC1BppB,QAAS,CACPojB,WAAY,MACZC,aAAc,QAgBlB,Y,6HCpKA,UANyB9gC,SAAO,cAAEwoC,UAAF,IAAgB3mC,EAAhB,6BAA0B,kBAAC,KAAiBA,KAAnD7B,CAAH,KAEhB40D,M,skBCCC,IASD2b,GAAyB,SAAA5vC,GAAM,OAAe,IAAXA,EAAe1jB,KAAKwxC,KAAKxxC,KAAKuzD,MAAMvzD,KAAKwzD,IAAI9vC,GAAU,IAAM,GAEhG+vC,GAAW,SAAA/vC,GAAM,OAAIA,UAA4CgwC,MAAMC,WAAWjwC,KAElFkwC,GAAkB,SAAChyC,EAAUC,EAAU/9B,GAC3C,OAAK2vE,GAAS3vE,MAIV2vE,GAAS5xC,IAAa/9B,EAAQ+9B,MAI9B4xC,GAAS7xC,IAAa99B,EAAQ89B,IAOvBiyC,GAAiB,SAACjyC,EAAUC,GAAX,OAAwB,YAAkB,IAAhBiyC,EAAgB,EAAhBA,WACtD,OAAIR,GAAuBQ,GAAcR,GAAuB1xC,IAIzDgyC,GAAgBhyC,EAAUC,EAAUiyC,KAiF7C,UAAehnE,QAAWq6D,eA9EP,SAAAz/D,GAAS,I3BeUiwC,E2BfV,G3BeUA,E2BdiCjwC,EAAMrD,KAAKI,O3BkBzE,CAACsvE,kBAHmB,MAAMC,eAAer8B,GAAavvB,QAAQ,KAAM,IAGhD6rD,iBAFD,IAAKD,eAAer8B,GAAavvB,QAAQ,KAAM,M2BhBlE2rD,EADmB,EACnBA,kBAAmBE,EADA,EACAA,iBADA,EAYtBvsE,EAAM8Y,SAAW,GATnBmhB,EAHwB,EAGxBA,eACAD,EAJwB,EAIxBA,gBACAE,EALwB,EAKxBA,SACAC,EANwB,EAMxBA,SACAC,EAPwB,EAOxBA,cACAuD,EARwB,EAQxBA,kBACA6uC,EATwB,EASxBA,OACAC,EAVwB,EAUxBA,OACAj0C,EAXwB,EAWxBA,OAGIk0C,EAnDyB,SAACzyC,EAAgBD,EAAiBG,GACjE,GAAIF,EAAgB,CAClB,IAAMyyC,EAAqB,SAAC,GAAMzyC,IAAmBD,EAAmB,EAAI,KAAJ,IAAK,GAAMA,GAAoB,GACvG,OAAOG,GAAYA,EAAWuyC,EAAqBvyC,EAAWuyC,EAGhE,OAAOvyC,EA6CoBwyC,CAAkB1yC,EAAgBD,EAAiBG,GACxEyyC,EAAsB,OAC1BC,UAAWV,GAAejyC,EAAUwyC,GACpCtyC,gBAAiBA,GACZ4xC,MAAMhyC,GAAqD,GAAlC,CAAC8yC,aAAc9yC,IAHtB,IAIvB2D,oBAAqBA,IAiBvB,OACE,kBAAC,KAAD,CAAuBkG,UAAW7jC,EAAM6jC,WACtC,kBAAC,GAAD,KACE0oC,iBAAkBA,EAClBhsD,SAAUvgB,EAAM6jC,UAChB1hC,GAAInC,EAAMmC,GACV4qE,iBAAiB,EACjBzkE,KAAMtI,EAAMsI,KACZ0kE,cAtBe,SAAAjmD,GACf/mB,EAAMoX,UAAY80D,GAAgBhyC,EAAUwyC,EAAoB3lD,EAAOqlD,aACzEpsE,EAAMoX,cAA+BzN,IAAtBod,EAAOqlD,WAA2BrlD,EAAOqlD,WAAa,OAqBnEvoC,UAAW7jC,EAAM6jC,UACjBwoC,kBAAmBA,EACnBjwE,MAAO4D,EAAM5D,MACbowE,OAAQA,EACRC,OAAQA,GACJG,EAZN,CAaEp0C,OAAQA,EACRyE,OAxBa,SAAAn6B,GACjB,I3BJiCmqE,E2BI3BC,I3BJ2BD,E2BIanqE,EAAMkJ,OAAO5P,Q3BH7C4vE,MAAMiB,GAAe,KAAOhB,WAAWgB,G2BIjDjtE,EAAMoX,WAAa80D,GAAgBhyC,EAAUwyC,EAAoBQ,KAEnEpqE,EAAMkJ,OAAO5P,MAAQ,aA8C2B,MCjEtD,SAAeqjE,eApDK,SAAC,GAAoD,IAAnDrjE,EAAmD,EAAnDA,MAAOgb,EAA4C,EAA5CA,SAAU0B,EAAkC,EAAlCA,QAAS+qB,EAAyB,EAAzBA,UAAWv7B,EAAc,EAAdA,KAAMnG,EAAQ,EAARA,GAAQ,EAMnE2W,GAAW,GAJbohB,EAFqE,EAErEA,SACAC,EAHqE,EAGrEA,SACA3B,EAJqE,EAIrEA,OACA48B,EALqE,EAKrEA,kBAcF,OACE,kBAAC,KAAD,CAAuBvxB,UAAWA,GAChC,kBAAC,GAAD,CACEgpC,UANY,SAAC,GAAD,IAAET,EAAF,EAAEA,WAAF,QACbjyC,GAAYiyC,EAAajyC,GAAcD,GAAYkyC,EAAalyC,IAM/DE,eAAe,EACf0yC,aAAc,EACdvsD,SAAUsjB,EACV1hC,GAAIA,EACJmG,KAAMA,EACN0kE,cApBe,SAAC,GAAwB,IAAvB5wE,EAAuB,EAAvBA,MAAOgwE,EAAgB,EAAhBA,WACxBjD,EAAW/T,EAAoBh5D,EAAQgwE,OAC1BziE,IAAbw/D,IACFA,EAAW,MAEb/xD,EAAS+xD,IAgBL/sE,MAAOA,EACPg5D,kBAAmBA,EACnB58B,OAAQA,OAqB4B,K,wsCC7CrC,IAAM20C,GAAqB9xE,SAAH,KAEzB80D,KAMkB70D,YAAa,GAUfA,YAAa,IACpB,gBAAEuoC,EAAF,EAAEA,UAAWroC,EAAb,EAAaA,MAAb,OAAwBqoC,GACrBqmC,SAAsB3pE,IAAK/E,EAAO,gBAClC+E,IAAK/E,EAAO,iBAItBy0D,KAMkBz0D,WAAY,SACVA,WAAY,oBACdA,WAAY,mBAsBZ,gBAAEA,EAAF,EAAEA,MAAF,OAAaqU,SAAWtP,IAAK/E,EAAO,gBAAiB,M,4aC1DxE,I,GAwEyE,kBAACsY,GAAA,QAAD,U,GAajC,kBAAC,IAAD,CAAgBvO,KAAK,WCvE7D,IAAMxJ,GAAM,CACjB,QAAWqxE,GACX,KAAQC,GACR,SAAYC,GACZ,SAAY9F,GACZ,SAAY4C,GACZ,KAAQxC,GACR,QAAW2F,GACX,SDTIC,Y,4MACkB,SAAAhkE,GAAI,OAAI,SAAA0mC,GAAU,OAAIA,EAAW1mC,O,iCAEpC,SAAA0mC,GACjB,IAAMu9B,EAAev9B,EAAWxzC,MAAX,YAAwBwzC,EAAWxzC,OAAU,GAC5DgxE,EAAgBx9B,EAAW3S,QAAX,YAA0B2S,EAAW3S,QAAQvjB,SAAY,GAE/E,OAAO,kBAAClG,GAAA,QAAD,KAAkBo8B,EAAW1T,SAA7B,IAAwC0T,EAAW3T,KAAnD,IAA0DkxC,EAA1D,IAAyEC,M,yBAGvE,SAAAzjD,GAAK,OAAI,SAACnnB,EAAD,GAAuB,IAAdqmE,EAAc,EAAdA,SAC3B,EAAKnpE,MAAMoX,SAAX,QAAsB6S,EAAQk/C,Q,qCAGT,SAACrmE,EAAD,GAAyB,IAAhBotC,EAAgB,EAAhBA,WAC9B,EAAKlwC,MAAMoX,SAAS84B,M,iDAGa,SAAAjmB,GAAK,OAAI,YAAa,IAAX7tB,EAAW,EAAXA,MAC5C,EAAK4D,MAAM8Y,QAAQwkB,iBAAnB,QAAsCrT,EAAQ7tB,GAAQ,EAAK4D,MAAM5D,MAAMmhC,a,4CAG3C,e,+BAEb,SAAAnhC,GAAK,SAAOA,EAAMmgC,OAAQngC,EAAMogC,a,gDAExC,WACDmxC,EAAgB,CACpBxrE,GAAIf,KAAKpB,MAAMmC,GACf/F,MAAOgF,KAAKpB,MAAM5D,MAAMogC,UAAY,GACpCplB,SAAUhW,KAAKgW,SAAS,YACxBmJ,SAAUnf,KAAKpB,MAAM6jC,WAGjB+pC,EAAiB,CACrBxxE,MAAOgF,KAAKpB,MAAM5D,MAAMmgC,MAAQ,GAChCnlB,SAAUhW,KAAKgW,SAAS,QACxBmJ,SAAUnf,KAAKpB,MAAM6jC,WAGvB,OACE,kBAAC,KAAD,MACG,YAAuB,IAvDIgqC,EAG5BxhD,EAoDGyhD,EAAqB,EAArBA,QAASC,EAAY,EAAZA,OACV,OAAO,kBAACZ,GAAD,CACLtpC,UAAW,EAAK7jC,MAAM6jC,UACtBv7B,KAAM,EAAKtI,MAAMsI,KACjB8F,IAAK2/D,GAEL,kBAAC,KAAD,CACEtwC,YAAa,EAAKz9B,MAAM8Y,QAAQ2kB,aAAe,GAC/CuwC,4BAA6B,EAAKC,iCAAiC,YACnEC,mBAAoB,EAAKC,oBAAoB,YAC7CC,iBAAkB,EAAKA,iBACvBC,4BAA6B,EAAKA,4BAClCC,WAAYX,EACZY,qBAAsB,EAAKA,qBAC3BC,6BAA6B,EAC7BC,wBAAyB,SAAAvyD,GAAC,OAAIA,IAAM,EAAKlc,MAAM6jC,cAE/CiqC,GAAW,EAAK9tE,MAAM5D,MAAMmgC,MAAQ,EAAKv8B,MAAM5D,MAAMogC,WAAtD,GACD,kBAAC,KAAD,CACEiB,YAAa,EAAKz9B,MAAM8Y,QAAQ2kB,aAAe,GAC/CuwC,4BAA6B,EAAKC,iCAAiC,QACnEC,mBAAoB,EAAKC,oBAAoB,QAC7CC,iBAAkB,EAAKA,iBACvBC,4BAA6B,EAAKA,4BAClCC,WAAYV,EACZW,qBAAsB,EAAKA,qBAC3BC,6BAA6B,EAC7BC,wBAAyB,SAAAvyD,GAAC,OAAIA,IAAM,EAAKlc,MAAM6jC,aAEjD,kBAAC,KAAD,KACG,EAAK7jC,MAAM8Y,QAAQkiB,WAAnB,GACA,EAAK0zC,eAAe,EAAK1uE,MAAM5D,QAC3B,kBAAC2O,GAAA,EAAD,CACDpM,MAxFkBkvE,EAwFS,EAAK7tE,MAAM5D,MArFhDiwB,EAAcwhD,EAChBh2D,OAAOkP,OAAO8mD,GACX/jE,QAAO,SAAA1N,GAAK,OAAIA,KAChBL,KAAI,SAAAK,GAAK,MAAsB,WAAjB,KAAOA,IAAsBA,EAAM4d,QAAW5d,EAAM4d,QAAU5d,KAC5EuD,KAAK,KACR,GAEJ,UATwB,oDASxB,OAA4B0sB,IA+EZ5wB,KAAK,aACLwtD,UAAW,EACXj9C,OAAO,SACP68C,OAAO,EACPntD,MAAO,EAAKsE,MAAM8Y,QAAQ4kB,gBAAkB,cAC5Cne,SAAO,a,EAjFnBiuD,CAAqB7rE,eCUzB,eAAgBgtE,GAChB,eAAgBC,EAChB,OAAUC,GACV,MAASxG,GACT,OAAUyG,GACV,gBAAiBC,GACjB,gBAAiBC,EACjB,OAAUC,EACV,KAAQC,GACR,IAAOC,GACP,KAAQC,IAkDV,SA/C0B,SAAC,GAAyD,IAAxD9xE,EAAwD,EAAxDA,KAAMlB,EAAkD,EAAlDA,MAAO0c,EAA2C,EAA3CA,QAAS3W,EAAkC,EAAlCA,GAAIC,EAA8B,EAA9BA,OAA8B,IAAtBgwB,gBAAsB,SAClF,GAAIr2B,GAAIuB,GAAO,CACb,IAII+xE,EAJErnE,EAAYjM,GAAIuB,GAKtB,GAAI8E,GAAUA,EAAO66B,OAAQ,CAC3B,IAAMA,EAAS76B,EAAO66B,OACtB76B,EAAO66B,OAAS,WACd,OAAOA,OAAqBtzB,IAAd0lE,EAA0BA,EAAYjzE,IAIxD,OACE,+BAAS6f,IAAM7Z,EAAQ,YAAvB,CAAoCmG,UAAQ,eAC1C,kBAACP,EAAD,KACE5L,MAAOA,EACPgb,SAAU,SAAA8E,GACRmzD,EAAYnzD,EACZ9Z,EAAOgV,SAAS8E,KAEb+yC,IAASn2C,GAAW,GAAK,CAACA,WANjC,CAOE3W,GAAIA,EACJ0hC,UAAWzR,EACXhwB,OAAQA,MAQhB,OADAktE,QAAQ9I,IAAI,kCAAmClpE,GACxC,MCpCT,SAnCsB,SAAA0C,GAAK,OACzB,kBAAC80D,EAAA,GAAD,KACE,kBAAC,GAAsB90D,M,giGCJ3B,IAAMmwD,GAA2ByL,QAAH,KAElB,qBAAE/3B,UAA2B,cAAgB,aAInD0rC,EAAwBl0E,WAAH,IAIrB80D,GAIAF,GAAiB2L,QAAH,KAGR,qBAAE/3B,UAA2B,cAAgB,aAMrD,kBAAMv8B,OAAY,CAClB9B,MAAOhK,UAAY,YAuBQA,UAAY,SAenC,qBAAEqoC,WAA4B,oBAMhB,qBAAEA,UAA2B,OAAS,UAItD2rC,GAA2B5T,QAAH,KAKxB6T,EAAwBp0E,SAAH,IAErBm0E,GAIO1a,EAAsBz5D,UAAH,IAyEfG,UAAY,wB,4xGC/J7B,IACMwO,EAAiBxO,UAAY,kBAC7BuO,EAAYvO,UAAY,aACxBwoB,EAAQxoB,UAAY,SACpBk0E,EAAUl0E,eAAiB,WAC3Bm0E,EAAYr0E,WAAa,GAElBs0E,GAAyB1sE,QAAH,KAG3BoE,SAVc,IAYI0C,EAUGA,EAKHA,EAQL2lE,EACEA,EACCA,EArCF,YA6CDD,EAKU1rD,EAIHA,EAKT1oB,UAAY,GACVo0E,EA5DC,IAoEA3lE,EACDvO,eAAiB,QAOfm0E,EACFD,EAUK1lE,EACXga,EAuBWja,EACJA,EAeIC,EACJA,EACPga,EAKAA,EACDA,EAGGja,EACDA,G,ECzIZ,kBAAC6lE,EAAD,MAIJ,QANqB,WACnB,OAAO,yC,yRCOT,QARwBv0E,SAAH,IAKFC,UAAY,O,8ICiD/B,QAjDiB,SAAC,GAAoC,IAAnCkW,EAAmC,EAAnCA,YAAa6O,EAAsB,EAAtBA,OAAQjY,EAAc,EAAdA,SAChCynE,GAASxiE,YAAO,MAD8B,GAEpBhJ,eAAS,GAFW,WAE7C0I,EAF6C,KAEnC+V,EAFmC,QAGZze,eAAS,GAHG,WAG7CyrE,EAH6C,KAG/BC,EAH+B,KAmBpD,OAAO,oCACL,kBAAC,IAAD,OAAUv+D,EAAV,CAAuB7Q,QAfL,SAAA2N,GAClBwU,GAAa/V,GACbuB,EAAE4oB,kBAEE7W,IAAWyvD,IACbzvD,IACA0vD,GAAgB,KAS2B3hE,IAAKyhE,KACjD9iE,GAAY,kBAAC,IAAD,CACXkR,iBAAkB4xD,EAAO9hE,QACzB/O,KAAM+N,EACNijE,QATgB,WAClBltD,GAAY,KAUT1a,M,yLCmEP,QA5FmB,SAAApI,GAAS,IAExBqgB,EAMErgB,EANFqgB,OACAjY,EAKEpI,EALFoI,SACAzH,EAIEX,EAJFW,QACA6Q,EAGExR,EAHFwR,YACAvS,EAEEe,EAFFf,MACAxD,EACEuE,EADFvE,KAEIwiB,GAAmB5Q,YAAO,MATN,GAUMhJ,eAAS,GAVf,WAUnB0I,EAVmB,KAUT+V,EAVS,QAWcze,eAAS,GAXvB,WAWnByrE,EAXmB,KAWLC,EAXK,KAapBE,EAAc,WAClBntD,GAAa/V,GACTsT,IAAWyvD,IACbzvD,IACA0vD,GAAgB,KAIdG,EAAc,WAClBptD,GAAY,IAGRqtD,EAAcpjE,EAAW,aAAe,eAExCqjE,EAAW,kBAAM,kBAAC,IAAD,CACrBnyD,iBAAkBA,EAAiBlQ,QACnC/O,KAAM+N,EACNijE,QAASE,GAER9nE,IAGH,OAAIzH,EACK,oCACL,kBAAC,IAAD,CAAayN,IAAK6P,GAChB,kBAAC,IAAD,OAAYzM,GAAe,GAA3B,CAA+B7Q,QAASA,EAAS1B,MAAOA,EAAOsJ,UAASvI,EAAM,WAAYvE,KAAMA,KAChG,kBAAC,KAAD,KAAyBA,KAAM00E,EAAaxvE,QAASsvE,GAAiBz+D,GAAe,MAEtFzE,GAAY,kBAACqjE,EAAD,OAIV,oCACL,kBAAC,IAAD,KACE7nE,UAASvI,EAAM,YACXwR,GAAe,GAFrB,CAEyBpD,IAAK6P,EAC5Btd,QAASsvE,EACTx0E,KAAMA,IAEN,kBAAC,IAAD,KAAqBwD,GACrB,kBAAC,KAAD,KACE,kBAAC,IAAD,CAAMxD,KAAM00E,MAGfpjE,GAAY,kBAACqjE,EAAD,S,iKCwBjB,QAjFa,SAAC,GAKR,IAJJnyD,EAII,EAJJA,iBACA+xD,EAGI,EAHJA,QACAhxE,EAEI,EAFJA,KACAoJ,EACI,EADJA,SAEMioE,GAAShjE,YAAO,MADlB,GAEsChJ,cAAS,MAF/C,WAEG6Z,EAFH,KAEkBoyD,EAFlB,QAGwBjsE,cAAS,GAHjC,WAGGksE,EAHH,KAGWC,EAHX,KAKEC,GAAqBn7D,kBAAY,SAAAhH,GACjC+hE,GAAUA,EAAOtiE,UAAYsiE,EAAOtiE,QAAQsQ,SAAS/P,EAAEtC,SACtDkS,IAAkBA,EAAcG,SAAS/P,EAAEtC,SAC3CiS,IAAqBA,EAAiBI,SAAS/P,EAAEtC,SACpDgkE,MAED,CAAC/xD,EAAkBC,EAAe8xD,KAErCrrE,gBAAU,WAMR,OALI0rE,EAAOtiE,SACTyiE,EAAUH,EAAOtiE,QAAQ2iE,wBAAwBH,QAGnD1hE,SAASyP,iBAAiB,YAAamyD,GAChC,WACL5hE,SAAS0P,oBAAoB,YAAakyD,MAE3C,CAACA,IAtBA,OA2BAjyD,OAAUP,EAAkBC,EAAe,CAC7CyyD,UAAW,eACXlyD,UAAW,CACT,CACEnW,KAAM,SACNwQ,QAAS,CACP+E,OAAQ,CAAC,EAAG,QARlBa,EAzBE,EAyBFA,OACAC,EA1BE,EA0BFA,WAYF,OAAK3f,EAKH,kBAAC,KAAD,CAAqBoP,IAAKiiE,GACvBjoE,GAAYyW,iBACX,kBAAC,KAAD,KACEzQ,IAAKkiE,EACLxxD,MAAOJ,EAAOK,QACVJ,EAAWI,OAHjB,CAIE6xD,WAAYL,IACX5uE,iBAAmByG,GAAU,SAAAC,GAAK,OAAIA,GAAS1G,iBAAmB0G,EAAO,CAAC2nE,QAASA,QAEtFnhE,SAASkK,OAbN,O,irBC9CX,IAAMrR,EAAW,SAAC,GAQZ,IAPJU,EAOI,EAPJA,SACAzH,EAMI,EANJA,QACAqvE,EAKI,EALJA,QACAzvD,EAII,EAJJA,SACAswD,EAGI,EAHJA,aACAn1E,EAEI,EAFJA,MACA6L,EACI,EADJA,MAEMupE,EAAcnvE,qBAAuByG,GAAU0B,OAAOD,SACtDknE,EAAUD,EAAYxvE,OAAS,EAC/B0vE,EAAannE,QAAQlJ,GAarBswE,EAAWH,EAAY/0E,KAAI,SAACsM,EAAO3G,GACvC,IAAMwvE,EAAM3pE,EAAQA,IAAU,EAC9B,OAAIc,EAAM/K,MAAmC,aAA3B+K,EAAM/K,KAAK6zE,YACpBxvE,iBAAmB0G,EAAnB,OACFA,EAAMrI,OADJ,IAELgwE,QAASA,EACTa,aAAcA,EACdtpE,MAAO2pE,EACP70E,IAAK,aAAF,OAAeqF,EAAf,YAAsBwvE,MAGtB,kBAAC,KAAD,CACL70E,IAAG,0BAAqBqF,EAArB,YAA4BwvE,GAC/BF,WAAYA,EACZD,QAASA,EACTr1E,MAAOA,EACP6kB,SAAUA,EACVjJ,KAAK,SACL/P,MAAOA,GAENc,MAIL,OACE,kBAAC,KAAD,CAAgB1H,QApCE,SAAA2N,GACd0iE,IAAezwD,IACjB5f,IAEIkwE,GAAgBb,GAClBA,KAGJ1hE,EAAE4oB,mBA4BoC3vB,MAAOA,GAC1C0pE,IAKPvpE,EAASw6B,aAAe,CACtB2uC,cAAc,GAGhBnpE,EAASypE,YAAc,WAiCvB,W,umCC/FO,IAAM51E,EAAoBF,SAAH,IACbC,WAAa,KACXA,WAAa,MAGnB81E,GAA0B/1E,QAAOgP,IAAPhP,CAAH,IAClBC,WAAa,IACZA,WAAa,KAGnB+1E,EAAsBh2E,SAAH,KAInB8hB,EAAe9hB,SAAH,KACT,gBAAEu1E,EAAF,EAAEA,WAAF,6BAAkCA,EAAa,GAA/C,SAIAp1E,UAAY,SAENA,UAAY,kBAE9BkP,KAGS4mE,EAAiBj2E,SAAH,KAKditD,EAAkBjtD,SAAH,KAChB,qBAAE21E,WAA6B,UAAY,aACnD1pE,SACAiqE,IAEEj2E,WAAa,GACbA,WAAa,IACbA,WAAa,GACRA,WAAa,KAAU,mBAA4B,GAA5B,EAAEiM,OAAqB,GAAS,QACjD,qBAAEwpE,QAAuBv1E,eAAiB,QAAUA,eAAiB,e,+EC1ChFg2E,EACK,UADLA,EAEW,gBAFXA,EAGO,YAmDb,MCvDA,EDUsB,SAAC,GAAiC,IAAhCp1E,EAAgC,EAAhCA,MAAO+F,EAAyB,EAAzBA,GAAIiV,EAAqB,EAArBA,SAAUnY,EAAW,EAAXA,MACrCmO,GAAUC,YAAO,MAcvB,OALA8nD,sBAAgB,WACd/nD,EAAQW,QAAQ0jE,cAAiBr1E,IAAUo1E,EAC3CpkE,EAAQW,QAAQoJ,QAAW/a,IAAUo1E,IACpC,CAACp1E,IAEG,2BACLgS,IAAKhB,EACLgK,SAfqB,SAAA9I,GAEnB8I,EADEhb,IAAUo1E,EACHA,EAEAljE,EAAEtC,OAAOmL,QAAUq6D,EAAyBA,IAYvDrvE,GAAIA,EACJ7E,KAAK,WACLo0E,eAAwB,YAAVt1E,EACdqK,aAAYxH,M,ySElBhB,QARoB5D,SAAH,IAEOG,UAAY,UAE5B,qBAAEorC,SAAyB,QAAU,UACrC,gBAAEprC,EAAF,EAAEA,MAAF,OAAao/C,QAAQ,IAAMp/C,EAAMyhB,OAAOnL,SCgEhD,QAnEc,SAAC,GAOT,IANJ1J,EAMI,EANJA,SAMI,IALJw+B,gBAKI,SAJJ+qC,EAII,EAJJA,iBAII,IAHJC,qBAGI,aAFJnnB,oBAEI,SADJonB,EACI,EADJA,SACI,GACwBxtE,cAASutE,GADjC,WACGtsE,EADH,KACWwsE,EADX,KAGEC,EAAyC,kBAArBJ,EAEpBK,EAAkB,WAClBvnB,IACEsnB,EACsB,mBAAbF,GACTA,GAAUF,GAGZG,GAAWxsE,KAKjB,OACE,kBAAC,EAAD,CACEshC,SAAUA,GAGRjlC,iBAAmByG,GAAU,SAAAC,GAAK,OAChC1G,iBAAmB0G,EAAO,CACxBu+B,WACAthC,OAAQysE,EAAaJ,EAAmBrsE,EACxCmlD,eACAunB,gBAAiBA,S,8TC5B7B,QAVyB32E,SAAH,IACHC,UAAY,GAGR22E,EACA32E,WAAa,I,waC8BpC,QAnCM42E,Y,wLACI,CACNC,eAAgB,EAAKnyE,MAAMmyE,iB,uBAGlB,SAACvhE,EAAO5R,GACjB,EAAKyc,SAAS,CACZ02D,gBAAyB,IAATnzE,EAAgB4R,OAAQjH,O,+CAInC,WACP,OACE,kBAAC,EAAD,KAEIhI,iBAAmBP,KAAKpB,MAAMoI,UAAU,SAACC,EAAOge,GAAR,OACtC1kB,iBAAmB0G,EAAO,CACxBspE,iBAAkB,EAAKj1E,MAAMy1E,iBAAmB9rD,EAChDwrD,SAAU,EAAKA,SAASnd,KAAK,EAAMruC,a,EAlB3C6rD,CAAmBvwE,e,oNCWzB,QAdwBtG,SAAH,KAEJ,qBAAEurC,SAAyB,OAAS,KACtC,qBAAEthC,OAAqB,QAAU,UAG/B,qBAAEshC,SAAyB,OAAS,KCwBrD,QAvBkB,SAAC,GAAD,IAAEx+B,EAAF,EAAEA,SAAUw+B,EAAZ,EAAYA,SAAUthC,EAAtB,EAAsBA,OAAtB,OACd,kBAAC,EAAD,CACEshC,SAAUA,EACVthC,OAAQA,GAER,6BACG8C,K,gfCVT,IA4Ca7M,EAAoBF,UAAH,IAEfC,SAAW,GAGbE,UAAY,mBA0BzB,QAtBgCH,SAAH,KAId,qBAAEurC,SAAyB,kBAAoB,IAMtDrrC,GAQF,SAAAyE,GAAK,OAvEcxE,GAAD,EAuEMwE,GAvELxE,MAAO8J,EAAsB,EAAtBA,OAAQshC,EAAc,EAAdA,SAChCwrC,EAAY,qDAAH,QAEYviE,QAAWtP,IAAK/E,EAAO,gBAAiB,GAFpD,yCAGYorC,EAAW,QAAU,OAHjC,yFAQS/2B,QAAWtP,IAAK/E,EAAO,gBAAiB,GARjD,sCASSorC,EAAW,QAAU,OAT9B,gBAcb,kBACIwrC,EAFF9sE,EACF,oKAYA,6MA3BmB,IAAC,EAAC9J,EAAO8J,EAAQshC,EAChCwrC,K,eCIFC,EAAoB,SAAC,GAAD,IACxBjqE,EADwB,EACxBA,SACAw+B,EAFwB,EAExBA,SACAthC,EAHwB,EAGxBA,OACAmlD,EAJwB,EAIxBA,aACA6nB,EALwB,EAKxBA,YACAN,EANwB,EAMxBA,gBACAl5D,EAPwB,EAOxBA,QAPwB,OASxB,kBAAC,EAAD,CACE8tB,SAAUA,EACVthC,OAAQA,EACR3E,QAASqxE,GAET,6BACGrwE,iBAAmByG,GAAU,SAAAC,GAAK,OAAI1G,iBAAmB0G,OAE3DoiD,GACE6nB,GACA,kBAAC/2E,EAAD,KACD,kBAAC,IAAD,CACEE,KAAM6J,EAAS,aAAe,eAC9B3E,QAASqxE,EACTt2E,MAAO4J,EAASwT,EAAQy5D,mBAAqBz5D,EAAQ05D,sBAO7DH,EAAkBnwC,aAAe,CAC/BowC,aAAa,EACbx5D,QAAS,CACPy5D,mBAAoB,mBACpBC,iBAAkB,0BAkCtB,MChEA,GACEC,OACAC,OD8DF,EC7DEC,QACAhyD,OD4DF,EC3DEiyD,Y,mGCHF,QATe,SAAC,GAAD,IAAEx2E,EAAF,EAAEA,MAAF,OAAa,kBAAC,IAAD,CAASA,MAAOA,EAAOy2E,SAAS,U,qnBCDrD,IAAM3oE,EAAkB7O,SAAH,IAERC,UAAY,GACdA,WAAa,KACZA,WAAa,KAE1Bw3E,KAG2Bt3E,UAAY,SAchCu3E,EAAuB13E,kBAAmB,SAAA2E,GAAK,MAAK,CAC/D1C,KAAM,YAD4BjC,CAAH,IAI3B40D,O,+ICzBAjhD,EAAYrN,gBAAiB,SAAC3B,EAAOoO,GAAQ,IAE/ChS,EAIE4D,EAJF5D,MACA6S,EAGEjP,EAHFiP,eACAC,EAEElP,EAFFkP,SACAC,EACEnP,EADFmP,YAL+C,GAOb9K,cAASjI,GAAS,IAPL,WAO1C42E,EAP0C,KAO9BC,EAP8B,KAkBjD,OACE,kBAAC/oE,EAAA,EAAD,KACE,kBAACs4B,EAAA,EAAD,CACEnG,SAAUxyB,QAAQmpE,GAClB/zE,MAAOkQ,GAEP,kBAAC,KAAD,KACE,kBAACjF,EAAA,EAAD,CACE3B,UAAQ,gBACR6F,IAAKA,EACLgJ,SAnBO,SAAA9I,GACf,IAAM66D,EAAW76D,EAAEtC,OAAO5P,MAC1B62E,EAAc9J,IAEU,IAApBA,EAAS7nE,QAAgB6nE,EAAS7nE,QAAU2N,IAC9CC,EAASi6D,IAeH/sE,MAAO42E,EACPvsE,aAAY0I,UAQxBH,EAAUkzB,aAAe,CACvBgxC,SAAU,IACVjkE,eAAgB,GAsBlB,MCnEA,EDmEewwD,cAAgBzwD,EAAW,IAAK,a,+aE5D/C,IAAMmkE,GAAM,WACTx2D,mBAAwB,WADf,MAETA,qBAA0BnhB,UAAY,uBAF7B,MAGTmhB,uBAA2B,SAAA3c,GAAK,OAAI6P,QAAWtP,IAAKP,EAAMxE,MAAO,kBAAmB,MAH3E,MAITmhB,sBAA2BnhB,UAAY,wBAJ9B,MAKTmhB,sBAA2BnhB,UAAY,wBAL9B,MAMTmhB,mBAAwBnhB,UAAY,qBAN3B,GAcN43E,GAAuB/3E,QAAOq/C,KAAPr/C,CAAH,KAEb,SAAA2E,GAAK,OAPD,SAAAA,GAEf,OADcmzE,EAAOnzE,EAAM0xD,YACX,UAKI2hB,CAASrzE,MAgB/BozE,EAAqBx/D,UAAY,CAC/B89C,UAAW/0C,uBAA0Bw2D,IAGvC,W,kOCpCA,SANyB93E,QAAOyb,KAAPzb,CAAH,KCatB,QAT0B,SAAA2E,GAAK,OAC7B,kBAAC,EAAD,CAAkBszE,GAAG,MAClB3xE,iBAAmB3B,EAAMoI,UAAU,SAAAC,GAAK,OAAI1G,iBAAmB0G,Q,2DCH9DkrE,GAAK,WACR52D,oBAAwB,GADhB,MAERA,uBAA2B,GAFnB,MAGRA,qBAA0B,SAHlB,MAIRA,sBAA2B,SAJnB,MAKRA,sBAA2B,wBALnB,MAMRA,mBAAwB,QANhB,G,EAcA,2BAAI,KAOT62D,EAAiB,SAAAxzE,GAAK,OAC1B,kBAACozE,EAAA,EAAD,CAAsB1hB,UAAW1xD,EAAM0xD,WAbzB,SAAA1xD,GACd,IAAMvE,EAAO83E,EAAMvzE,EAAM0xD,WACzB,OAAIj2D,EACK,kBAAC,IAAD,CAAMA,KAAMA,EAAMoF,SAAU8b,oBAEnC,EASC82D,CAAQzzE,GACRA,EAAMf,MACN0C,iBAAmB3B,EAAMoI,UAAU,SAAAC,GAAK,OAAI1G,iBAAmB0G,QAGpEmrE,EAAetxC,aAAe,CAC5BwvB,UAAW/0C,oBAmBb,MC7CA,GACEowC,OACA2mB,KD2CF,I,kKErBA,QA7BkB,SAAA1zE,GAChB,IAAKA,EAAM0iC,MACT,OAAO,KAGT,IAAMixC,EAAc,GAKpB,OAJA97D,OAAOzC,KAAKpV,EAAM0iC,OAAOjoB,SAAQ,SAAApe,GAC/Bs3E,EAAYpuD,KAAZ,MAAAouD,EAAW,IAAS3zE,EAAM0iC,MAAMrmC,QAIhC,kBAACo1D,EAAA,QAAD,KACGkiB,EAAY53E,KAAI,SAACK,EAAOsF,GAAR,OACf,kBAAC+vD,EAAA,QAAD,CACEC,UAAU,SACVr1D,IAAKqF,EACLzC,MAAO7C,S,0BCwIjB,QA/HoB,SAAA4D,GAAS,IAEzBoI,EAcEpI,EAdFoI,SACA+hB,EAaEnqB,EAbFmqB,YACAsY,EAYEziC,EAZFyiC,MACA9H,EAWE36B,EAXF26B,SACAiJ,EAUE5jC,EAVF4jC,UACAlB,EASE1iC,EATF0iC,MACArG,EAQEr8B,EARFq8B,SACAl6B,EAOEnC,EAPFmC,GACAlD,EAMEe,EANFf,MACA8b,EAKE/a,EALF+a,UACA+oB,EAIE9jC,EAJF8jC,eACAD,EAGE7jC,EAHF6jC,UACAH,EAEE1jC,EAFF0jC,QACQkwC,EACN5zE,EADFsyD,OAGIhuD,GAAau/B,GAAaH,GAAWhB,GAAS7qB,OAAOzC,KAAKstB,GAAOphC,OAAS,EAC1EuyE,EAAW,GAAH,OAAM/3D,uBAAsB7c,IAA5B,OAAqC8b,GAAa+oB,EAAb,YAAmCA,GAAmB,IACnGwuB,EAASshB,GAlCI,SAACnxC,EAAO8F,EAAUxtB,EAAWshB,GAChD,OAAIkM,EACK5rB,qBACE8lB,EACF9lB,mBACE5B,IAAcshB,EAChB1f,2BADF,EA6BsBm3D,CAAarxC,EAAOn+B,EAAWyW,EAAWshB,GApB5C,EAsDZ,kBAAC03C,EAAA,GAAD,KAA+B5pD,GAtDnB,EAuDH,kBAAC4pD,EAAA,GAAD,KACZ,kBAAC,EAAD,CAAWrxC,MAAOA,KAlC9B,OACE,kBAAC,IAAD,MACG,YAAuB,IAArBorC,EAAqB,EAArBA,QAASC,EAAY,EAAZA,OACJiG,GAAsBnwC,GAAaiqC,GAAYzxC,GAAYuH,GAAajJ,EAC9E,OACE,kBAACo5C,EAAA,GAAD,CACE3lE,IAAK2/D,EACLiG,kBAAmBA,GACnB,kBAACD,EAAA,GAAD,CACEpO,UAAU,uBACVtpC,SAAUA,EACVwH,UAAWA,EACXD,UAAWA,EACX0uB,OAAQA,GACPlqD,EACAnJ,GAAS,kBAAC,KAAD,KACR,kBAAC80E,EAAA,GAAD,QACOnwC,IAAcC,GAAa,CAACowC,QAAS9xE,GAD5C,CAEEk6B,SAAUA,EACVoG,MAAOA,EACP/mC,MAAOm4E,EACPG,kBAAmBA,EACnBnwC,UAAWA,EACXD,UAAWA,EACX0uB,OAAQA,IAER,0BAAMjzC,wBAAyB,CAACC,OAAQ,GAAF,OAAKi+C,iBAAkBt+D,IAAvB,OAAgC8b,EAAY,KAAO,UAK9FoP,GAAW,EAEX7lB,GAAa,Q,g4DCzE1B,IAqDM4vE,EAAgB,SAAC,GAAD,IACpBtwC,EADoB,EACpBA,UACAC,EAFoB,EAEpBA,UAFoB,yBAGHD,GAAaC,EAAa,cAAgB,OAHvC,MAKTswC,EAAqB94E,SAAH,IACRC,UAAY,KAGtB84E,EAAyB/4E,WAAH,KAE7BiM,OAAY,CACZua,SAAUvmB,SAAW,GACrB+4E,WAAY,qBAAE5xC,MAAmBjnC,eAAiB,QAAUA,eAAiB,YAC7E84E,WAAY,IAEM94E,UAAY,UACvB,SAAAwE,GAAK,OAAI2mE,KApEO,EAoEmB3mE,EAnE9C4jC,EAKI,EALJA,UACAowC,EAII,EAJJA,kBACAnwC,EAGI,EAHJA,UACAyuB,EAEI,EAFJA,OACAj2B,EACI,EADJA,SAEOi2B,EACH,SACAj2B,EACE,WACAuH,GAAaowC,GAAqBnwC,IAAcyuB,EAC9C,SACA1uB,EACEowC,EACI,SACA,SACJA,EACE,SACAnwC,EACE,SACAyuB,EACE,SACA,WA6CsCtyD,GApE5B,IAAC,EAC3B4jC,EACAowC,EACAnwC,EACAyuB,EACAj2B,IAgEU/gC,WAAa,GACNA,SAAW,GACXA,WAAa,IAGnB,qBAAE04E,kBAA2C,OAAS,YAChD14E,SAAW,IAExB,SAAA0E,GAAK,OApCcg0E,EAoCKh0E,EApCLg0E,mBAAuBpY,QAAxB,IAElBoY,IAAqBpY,QAAJ,IAEJtgE,UAAY,IACVA,UAAY,MALV,IAAE04E,KAqCnB,SAAAh0E,GAAK,OAAIk0E,EAAcl0E,MACP,qBAAEg0E,kBAA2C,OAAS,UACxD,qBAAEnwC,WAA4B,OAQrCivC,EAAuBz3E,SAAH,IA1Fb,SA4Fe,SAAA2E,GAAK,OAAI0R,KAhEb,EAgE2C1R,EA/DxE6jC,EAII,EAJJA,UACAD,EAGI,EAHJA,UACA0uB,EAEI,EAFJA,OAEI,EADJj1B,QAGI,UACAuG,GAAaC,EACX,cACAyuB,EACE,SACA,WAoDwEtyD,GAhEpD,IAAC,EAC7B6jC,EACAD,EACA0uB,IA8Dah3D,WAAa,GAAMA,WAAa,GAAMA,WAAa,GAAMA,WAAa,IAE/E,SAAA0E,GAAK,OAAKA,EAAM6jC,YAAa0wC,QAAav0E,MAC1C,SAAAA,GAAK,OAAIk0E,EAAcl0E,MACX,qBAAE4jC,WAA4BtoC,WAAa,MACzC,qBAAEuoC,WAA4BvoC,WAAa,MAC5C,gBACbsoC,EADa,EACbA,UACAC,EAFa,EAEbA,UAFa,OAGTD,GAAaC,GAAavoC,WAAa,MAG3B,qBAAEsoC,WAA4B,MAI5C4wC,KACa,qBAAE5wC,WAA4BtoC,WAAa,MAWnDm5E,EAA+Bp5E,OAAH,KAEnCiM,OAAY,CACZua,SAAUvmB,UAAY,MAKfo5E,EAAyBr5E,SAAH,KAEtBs5E,EAA2Bt5E,SAAH,IAEhBC,WAAa,GACfA,WAAa,GAETw3E,EACA2B,EACAC,EACAp5E,WAAa,GAObm5E,EACAC,EACGp5E,WAAa,GApJnB,U,ydCLb,IAAMsU,EAAqBvU,UAAH,KAKf,gBAAEG,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,gBAAiB,MAsBrE,QAhB2B,SAAC,GAAD,IACzB4a,EADyB,EACzBA,OACAnC,EAFyB,EAEzBA,YAFyB,OAGrB,kBAACrE,EAAD,CACJrH,UAAA,sBAAwB6N,EAAOjU,GAA/B,wBACAoS,YAAaN,EAAYmC,M,qvFCT3B,IAAMw+D,EAAc,SAAC,GAAD,IAAEp5E,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,gBAAiB,IACnEq5E,EAAcv5E,WAAa,KAEpBw5E,EAAkBz5E,QAAH,IACfw5E,EACSr5E,UAAY,SACLo5E,GAKhBG,EAAY15E,SAAH,IACTw5E,GAIA,qBAAEG,UAA2B,GAAM,KAGnCC,EAAwB55E,QAAH,IAGZG,UAAY,SAELo5E,GACzBttE,OAAY,CAAC+sE,WAAY74E,eAAiB,WAElC,qBAAE0X,SAAyB,UAAY,UAGjC,gBAAEynC,EAAF,EAAEA,cAAen/C,EAAjB,EAAiBA,MAAjB,OAA4Bm/C,EAAgB,aAAH,OAAgBn/C,EAAMyhB,OAAOnL,MAAS,UAC7F,kBAAiB,kCAAjB,EAAE3P,IAAkD,gBACpD,gBAAE+yE,EAAF,EAAEA,mBAAoB15E,EAAtB,EAAsBA,MAAtB,OAAiC05E,GAAsB,2BAAJ,QAC/BC,QAAe35E,EAAMyhB,OAAO+G,OAAO,GADJ,sBAG/CpU,EAH+C,uCAQnD,gBAAEwlE,EAAF,EAAEA,kBAAmB55E,EAArB,EAAqBA,MAArB,OAAiC45E,GAAD,oDAEVD,QAAe35E,EAAMyhB,OAAO+G,OAAO,GAFzB,wBAI1BpU,EAJ0B,kDAUhC,gBAAEslE,EAAF,EAAEA,mBAAoBhiE,EAAtB,EAAsBA,SAAUmxC,EAAhC,EAAgCA,cAAe7oD,EAA/C,EAA+CA,MAA/C,OAA2D0X,GAMxDgiE,IAAuBhiE,IAAamxC,GAArC,iFANwD,mDAGpC7oD,EAAMyhB,OAAO+G,MAHuB,qBAcjDqxD,EAAoBh6E,SAAH,IAKJu5E,GAGpB9xB,GAAkB8Y,QAAH,KAEjB,qBAAE3jB,WAA4B,qBAG1B68B,GACkB,gBAAEt5E,EAAF,EAAEA,MAAF,OAAa25E,QAAe35E,EAAMyhB,OAAO+G,OAAO,KAKlE8wD,GACkB,gBAAEt5E,EAAF,EAAEA,MAAF,OAAa25E,QAAe35E,EAAMyhB,OAAO+G,OAAO,MAK7DsxD,EAAoBj6E,UAAH,KAKjBk6E,EAAwBl6E,QAAH,IAEjBw5E,GAMJW,EAAgBn6E,QAAH,IAETw5E,GAIbvtE,UAGSmuE,EAAkBp6E,WAAH,IACxBynD,GAGS4yB,GAAiBr6E,QAAH,IACvBynD,GAGoB,gBAAEtnD,EAAF,EAAEA,MAAF,OAAam6E,QAAO,IAAMn6E,EAAMyhB,OAAO+G,UAIlD4xD,GAAkBv6E,WAAH,IACxBynD,GAGE+yB,GAAcx6E,WAAH,KASU,qBAAE6Z,QACnBnZ,KAAI,SAAAqa,GAAM,OAChBA,EAAOjX,MACHiX,EAAOjX,MAAQ,KACfiX,EAAO0iC,gBACL,cACA,yBACNn5C,KAAK,OAGL+K,KAGSorE,GAA2Bz6E,SAAH,KAKxB06E,GAAqB16E,SAAH,IAETG,UAAY,UAerBw6E,GAAkB36E,SAAH,KAM5B,YC7LA,IAAM46E,GAA0B,WAC1BpnE,SAASuf,cACXvf,SAASuf,eAAe8nD,mB,2BCFtBpzB,GAAkB,CACtBC,OAAQ,SACRC,MAAO,QACPxQ,KAAM,QAGuB3+B,UAAgBgE,OAAOzC,KAAK0tC,IAAiB/mD,KAAI,SAAAM,GAAG,OAAIymD,GAAgBzmD,OCUvG,SAfyB,SAAC,GAAD,IAAE68C,EAAF,EAAEA,QAAS5C,EAAX,EAAWA,WAAY6/B,EAAvB,EAAuBA,gBAAvB,OACvB,yBAAKx1E,QAAS,SAAA2N,GAAC,OAAIA,EAAE4oB,oBACnB,2BAAO55B,KAAK,QAAQ6Z,QAASm/B,EAAW4C,EAAQ3B,OAAQngC,SAAU,SAAA9I,GAChE6nE,EAAgBj9B,EAAQ3B,MAAOjpC,EAAEtC,OAAO5P,Y,gBC2B9C,SA3BwB,SAAC,GAAmD,IAAlD88C,EAAkD,EAAlDA,QAAS5C,EAAyC,EAAzCA,WAAY6/B,EAA6B,EAA7BA,gBAAiBC,EAAY,EAAZA,OAI9D,OAAO,yBAAKz1E,QAAS,SAAA2N,GACfA,EAAEszD,UACJuU,EAAgBj9B,EAAQ3B,OAAO,GAAM,GAEvCjpC,EAAE4oB,mBAEQ3uB,UAAQ,2BAElB,kBAAC8tE,GAAA,EAAD,CACEj6E,MAZsB,SAAA88C,GAAO,OAAI5C,EAAW4C,EAAQ3B,OAAS,UAAY,YAYlE++B,CAAkBp9B,GACzB9hC,SAZuB,SAAA8hC,GAAO,OAAI,SAAA98C,GAAK,OAAI+5E,EAAgBj9B,EAAQ3B,MAAiB,YAAVn7C,IAYhEm6E,CAAmBr9B,GAC7Bj6C,MAAK,UAAKi6C,EAAQpsB,QAAb,YAAwBspD,EAAS,GACtCj0E,GAAI,2BAA6B+2C,EAAQ3B,UCM/C,SAtB0B,SAAC,GAAwC,IAAvCz7C,EAAuC,EAAvCA,KAAMw6C,EAAiC,EAAjCA,WAAY6/B,EAAqB,EAArBA,gBACtCK,EAAU16E,EAAKC,KAAI,SAAAuS,GAAC,OAAIA,EAAEipC,SAK1Bk/B,EAAwBD,EAAQpvB,OAAM,SAAAzD,GAAC,OAAIrN,EAAWqN,MACxD,UACA6yB,EAAQz8B,MAAK,SAAA4J,GAAC,OAAIrN,EAAWqN,MAC3B,gBACA,YACN,OAAuB,IAAhB7nD,EAAKwF,OACR,KACA,kBAAC+0E,GAAA,EAAD,CAAej6E,MAAOq6E,EAAuBr/D,SAXlB,SAAA8E,GAC7Bi6D,EAAgBK,EAAe,YAANt6D,OCFtB,IASDw6D,GAAyB,SAACpgC,EAAY6/B,GAAb,MAAkC,CAC/Dh0E,GAAI,mBACJhD,MAAO,GACPK,WAAW,EACX6kD,eAAe,EACfoH,SAAS,EACTj6B,QAAS,CACPte,UAAU,GAEZw4C,eAAgB,kBAAM,MACtBzS,aAAc,SAAAj5C,GAAK,OAAI,kBAAC,GAAD,QAAsBA,EAAtB,CAA6Bs2C,WAAYA,EAAY6/B,gBAAiBA,QAGzFQ,GAAwB,SAACrgC,EAAY6/B,GAAb,MAAkC,CAC9Dh0E,GAAI,kBACJspD,SAAS,EACTjsD,WAAW,EACX6kD,eAAe,EACfllD,MAAO,GACPqyB,QAAS,CACPte,UAAU,GAEZw4C,eAAgB,SAAA1rD,GAAK,OAAI,kBAAC,GAAD,QAAuBA,EAAvB,CAA8Bs2C,WAAYA,EAAY6/B,gBAAiBA,MAChGl9B,aAAc,SAAAj5C,GAAK,OAAI,kBAAC,GAAD,QAAqBA,EAArB,CAA4Bs2C,WAAYA,EAAY6/B,gBAAiBA,Q,oCCf9F,SAlBqB,SAAC,GAAD,IAAE//D,EAAF,EAAEA,OAAF,OACnBA,EAAOob,SAAWpb,EAAOob,QAAQgnB,UAAYpiC,EAAOob,QAAQ4J,MACxD,kBAACk6C,EAAD,KACA,kBAAC,KAAD,CAAM75E,KAAI,eAAmC,QAAzB2a,EAAOob,QAAQ4J,MAAkB,KAAO,UAC3DhlB,EAAOob,QAAQgnB,SAAW,GAAK,8BAAOpiC,EAAOob,QAAQgnB,WAEtD,M,+NCHN,IAAMo+B,GAAY,SAAC,GAAD,IAAExgE,EAAF,EAAEA,OAAQta,EAAV,EAAUA,KAAV,OAChBsa,EAAOs1C,eACH,kBAACt1C,EAAOs1C,eAAR,CAAuBt1C,OAAQA,EAAQta,KAAMA,IAC7C,yBAAKujB,wBAAyB,CAACC,OAAQlJ,EAAOnX,OAAQvD,MAAO0a,EAAOnX,SAyF1E,SAlFoB,SAAAe,GAAS,IAEzBkV,EAOElV,EAPFkV,QACApZ,EAMEkE,EANFlE,KACAywD,EAKEvsD,EALFusD,uBACAF,EAIErsD,EAJFqsD,gBACAwqB,EAGE72E,EAHF62E,QACAC,EAEE92E,EAFF82E,sBACAC,EACE/2E,EADF+2E,qBARyB,EAUG3lE,YAAmBm7C,GAA1Cr2C,EAVoB,EAUpBA,UAAWzB,EAVS,EAUTA,SAKZuiE,GAAe1hE,kBAAY,SAAC1G,EAAD,OAAMzP,EAAN,EAAMA,MAAN,OAAiB23E,EAAsBloE,EAAGzM,GAAIhD,KAAQ,CAAC23E,IAClFG,GAAuB3hE,kBAAY,SAAA1G,GAAE,OAAImoE,EAAqBnoE,EAAGzM,MAAK,CAAC40E,IAhBlD,EAsBvBrhE,gBAViC,SAAAwhE,GAAa,OAChDL,EAAQ9oE,QAAQ4H,cAAhB,6BAAoDuhE,EAAc/0E,GAAlE,SAWA60E,EACAC,GANAhjE,EAnByB,EAmBzBA,YACA2B,EApByB,EAoBzBA,eACApB,EArByB,EAqBzBA,YAMKR,EAA+BQ,EAA/BR,WAAYY,EAAmBJ,EAAnBI,gBAEbuiE,EAAY,SAAA/gE,GAAM,OAAI,SAAA9H,IACrB0F,GAAcoC,EAAOob,SAAWpb,EAAOob,QAAQte,UAClDm5C,EAAgBj2C,EAAOjU,GAAImM,EAAEszD,YAIjC,OAAO,kBAAC6T,EAAoB7/D,EAC1B,kBAAC8/D,GAAD,KACGxgE,EAAQnZ,KAAI,SAAAqa,GACX,IAAM/Z,EAAM,eAAH,OAAkB+Z,EAAOjU,IAClC,OAAO,kBAAC8yE,EAAD,CACL54E,IAAKA,EACLkM,UAASlM,EACT8F,GAAI9F,EACJsE,QAASw2E,EAAU/gE,GACnBg/D,kBAAmBphE,EACnBkhE,mBAAoBlhE,GAAcoC,EAAOjU,MAAOyS,aAAd,EAAcA,EAAiBzS,IACjE+Q,SAAUkD,EAAOob,SAAWpb,EAAOob,QAAQte,SAC3CynC,cAAelmC,EAASE,oBAAsByB,EAAOjU,IAAMsS,EAASoB,oBAAsBO,EAAOjU,IAEjG,kBAAC6zE,GAAD,MACE7zE,GAAE,2BAAsBiU,EAAOjU,IAC/B9F,IAAG,2BAAsB+Z,EAAOjU,MAC1BiU,EAAOiuC,e,mWAAR,EACH/vC,WAAW,GACR4B,EAAUE,EAAOjU,MAGtB,kBAAC4yE,EAAD,CACEC,UAAWvgE,EAASoB,oBAAsBO,EAAOjU,IAEjD,kBAAC,GAAD,CAAciU,OAAQA,IACtB,kBAACwgE,GAAD,CAAWxgE,OAAQA,EAAQta,KAAMA,MAGpCsa,EAAO5W,WAAa,kBAAC,EAAD,CAAoB4W,OAAQA,EAAQnC,YAAaA,W,wCC3E1EmjE,GAAaz1E,UAAW,YAA+B,IAA7ByU,EAA6B,EAA7BA,OAAQ8iC,EAAqB,EAArBA,QAASk9B,EAAY,EAAZA,OAC/C,OAAO,kBAACtB,EAAD,SACuB,IAAxB1+D,EAAO4iC,cAAyB,CAACl6B,MAAO,CAACu4D,UAAW,UADnD,CAEL9uE,UAAQ,cAEP6N,EAAO6iC,aACJ,kBAAC7iC,EAAO6iC,aAAR,CAAqBC,QAASA,EAAS9iC,OAAQA,EAAQggE,OAAQA,IAC/D,kBAACtiE,GAAA,QAAD,KAAkBolC,EAAQ9iC,EAAOjU,SAWnCwZ,GAAW,SAAC1a,EAAW2a,GAC3B,OAAK3a,EAAUmV,OAAOq1C,SAIC,IADV5zC,OAAOzC,KAAK0G,eAAc7a,EAAW2a,IACtCta,QAGd,SAAeK,SAAWy1E,GAAYz7D,I,OCzBV,kBAAC+5D,GAAD,KAC1B,kBAACH,EAAD,KACE,kBAAC,KAAD,CAAgBhwE,KAAK,OACrB,kBAACuO,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,0CAJrBm1E,GAAgB,sB,GASE,kBAAC5B,GAAD,KACtB,kBAACF,EAAD,KACE,kBAAC1hE,GAAA,QAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,qCAHrBo1E,GAAY,sB,GAsBR,kBAACD,GAAD,M,GAuBE,kBAACC,GAAD,MAeZ,SApDkB,SAAC,GAA+F,IAA9Fz7E,EAA8F,EAA9FA,KAAMoZ,EAAwF,EAAxFA,QAASohC,EAA+E,EAA/EA,WAAY6/B,EAAmE,EAAnEA,gBAAiBpqB,EAAkD,EAAlDA,sBAAuBl5C,EAA2B,EAA3BA,WAAYolC,EAAe,EAAfA,UAWjG,OAAO,kBAAC29B,GAAD,KAEH7pB,EAAqB,GAEjBjwD,EAAKwF,OAAS,EACZxF,EAAKC,KAAI,SAACm9C,EAASx3C,GAAV,OACT,kBAACg0E,GAAD,CACEr5E,IAAG,mBAAc68C,EAAQ3B,OACzBouB,UAAS,wBAAmBrvB,EAAW4C,EAAQ3B,QAAU,YACzD52C,SAnBMc,EAmBay3C,EAnBH,SAAA5qC,GACtBA,EAAEszD,SACJuU,EAAgB10E,EAAO81C,OAAO,GAAM,GAC3BjpC,EAAEkpE,SAAWlpE,EAAEmpE,QACxBtB,EAAgB10E,EAAO81C,OACdU,GAAaplC,GACtBA,EAAWpR,EAAO81C,SAcVU,UAAWA,EACX1vC,UAAQ,YAGN2M,EAAQnZ,KAAI,SAAAqa,GAAM,OAChB,kBAAC,GAAD,CACE/Z,IAAG,4BAAuB68C,EAAQ3B,MAA/B,YAAwCnhC,EAAOjU,IAClDigD,SAAU9L,EAAW4C,EAAQ3B,OAC7B2B,QAASA,EACT9iC,OAAQA,EACRggE,OAAQ10E,QA9BR,IAAAD,KAcV,K,sUCpCH,IAAMi2E,GAAmBr8E,SAAH,MAWhBs8E,IAAyBt8E,QAAOgP,KAAPhP,CAAH,KACtBC,WAAa,GAAMA,WAAa,KC8D7C,MC7EA,ID6Ee8J,UApEI,SAAC,GAAkE,IAAjE6mD,EAAiE,EAAjEA,WAAYC,EAAqD,EAArDA,eAAgB1Y,EAAqC,EAArCA,YAAa2Y,EAAwB,EAAxBA,aAAcxvD,EAAU,EAAVA,KACpEi7E,EAAat/D,KAAKwxC,KAAKmC,EAAaC,GACpC+c,EAAQ3wD,KAAKR,KAAK07B,EAAc,GAAK0Y,EAAiB,EAAGD,GACzDlgD,EAAKuM,KAAKR,IAAI07B,EAAc0Y,EAAgBD,GAE5Ch+C,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEtC,OACE,kBAACu1E,GAAD,KACG,kBAACpb,GAAA,EAAD,KACC,kBAACqb,GAAD,CACEp3D,SAA0B,IAAhBizB,EACVv0C,MAAOgP,EAAI,8CACXyO,UAAQ,EACRjhB,KAAK,sBACLkF,QAAS,kBAAMwrD,EAAa,MAC9B,kBAACwrB,GAAD,CACEp3D,SAA0B,IAAhBizB,EACVv0C,MAAOgP,EAAI,4CACXyO,UAAQ,EACRjhB,KAAK,eACLkF,QAAS,kBAAMwrD,EAAa3Y,EAAc,MAC5C,kBAACmkC,GAAD,CACEp3D,SAAUizB,GAAeokC,EACzB34E,MAAOgP,EAAI,6CACXyO,UAAQ,EACRjhB,KAAK,gBACLkF,QAAS,kBAAMwrD,EAAa3Y,EAAc,MAC5C,kBAACmkC,GAAD,CACEp3D,SAAUizB,GAAeokC,EACzB34E,MAAOgP,EAAI,6CACXyO,UAAQ,EACRjhB,KAAK,uBACLkF,QAAS,kBAAMwrD,EAAayrB,OAG/B3rB,EAAa,GACZ,kBAACn4C,GAAA,QAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,mCAAmC4kB,OAAQ,CAC9DkiD,QACAl9D,KACA8rE,MAAO5rB,U,gBEHnB,UAAe7mD,UAzCK,SAAC,GAAwD,IAK/DjD,EALQgqD,EAAuD,EAAvDA,aAAcC,EAAyC,EAAzCA,cAAeJ,EAA0B,EAA1BA,eAAgBrvD,EAAU,EAAVA,KAC3Dm7E,EAAiBjuE,QAAQmiD,GACzB+rB,EAAuC,mBAAlB3rB,EAK3B,OAJmB0rB,GAAkBC,EAQ9B,kBAAC1C,EAAD,KACJyC,GAAkB,kBAAC,GAAD,CACjB3rB,aAAcA,EACd3Y,YAAawY,EAAexY,YAC5ByY,WAAYD,EAAeC,WAC3BC,eAAgBF,EAAeE,iBAEhC6rB,GAAe,kBAACltE,GAAA,EAAD,CACdvN,KAAK,SACL5B,OAfQyG,EAeG,sCAfGxF,EAAK+J,cAAc,CAACvE,QAgBlC1G,KAAK,OACLkF,QAASyrD,KAdJ,Q,qkBCHX,IAAMd,GAAQ,SAAAtrD,GAAS,IAEnB4lB,EAYE5lB,EAZF4lB,UACA9pB,EAWEkE,EAXFlE,KACAuwC,EAUErsC,EAVFqsC,kBACAp5B,EASEjT,EATFiT,eACA+4C,EAQEhsD,EARFgsD,eACAO,EAOEvsD,EAPFusD,uBACAF,EAMErsD,EANFqsD,gBACAN,EAKE/rD,EALF+rD,sBACAl5C,EAIE7S,EAJF6S,WACAolC,EAGEj4C,EAHFi4C,UACAkU,EAEEnsD,EAFFmsD,aACAC,EACEpsD,EADFosD,cAbmB,GAeS/nD,cAASrE,EAAMkV,SAfxB,WAedA,EAfc,KAeL+/B,EAfK,KAgBf4hC,GAAUxpE,YAAO,MAEjB0pE,GAAuBzhE,kBAAY,SAAA0iE,GAAY,MAC7CC,EAAU,UAAG/iE,EAAQ1T,MAAK,SAAAgU,GAAC,OAAIA,EAAErT,KAAO61E,YAA9B,aAAG,EAAsC74E,MACrDa,EAAM6rD,qBACR7rD,EAAM6rD,oBAAoBmsB,EAAUC,KAErC,CAAC/iE,IAEE4hE,GAAwBxhE,kBAAY,SAAC0iE,EAAU74E,GACnD81C,EAAW,IAAI//B,EAAQnZ,KAAI,SAAAyZ,GAAC,OAAIA,EAAErT,KAAO61E,EAAT,SAEvBxiE,GAFuB,IAG1BrW,UAEFqW,SACH,CAACN,IAhCiB,EdLvB,WAAgE,IAAhD0Q,EAAgD,uDAApC,GAAIsyD,EAAgC,uCAAnBzrC,EAAmB,0CACtBpoC,cAAS,MADa,WACvD8zE,EADuD,KACzCC,EADyC,KAGxD9hC,EAAa,SAAAj6C,GAAG,OAAIupB,EAAUlc,SAASrN,IAEvC85E,EAAkB,SAAC95E,EAAKD,EAAOi8E,GACnC,GAAIljE,MAAM4W,QAAQ1vB,GAChBowC,EAAepwC,EAAKD,GACpBg8E,EAAgB,WAEhB,GAAIC,EAAgB,CAClBpC,KAEA,IAAMqC,EAAmBH,EAAeD,EAAYvpE,WAAU,SAAAg1C,GAAC,OAAIA,IAAMw0B,KAAgB,EACnFI,EAAeL,EAAYvpE,WAAU,SAAAg1C,GAAC,OAAIA,IAAMtnD,KACtDowC,EACEyrC,EAAYx0B,MAAMprC,KAAKR,IAAIwgE,EAAkBC,GAAejgE,KAAKC,IAAI+/D,EAAkBC,GAAgB,GACvGn8E,QAGFqwC,EAAe,CAACpwC,GAAMD,IAAUk6C,EAAWj6C,IAC3C+7E,EAAgB/7E,IAKtB,MAAO,CACLi6C,aACA6/B,mBcYEqC,CAAa5yD,EAAW9pB,EAAOA,EAAKC,KAAI,SAAAuS,GAAC,OAAIA,EAAEipC,SAAS,GAAIlL,GADzDiK,EAlCc,EAkCdA,WAAY6/B,EAlCE,EAkCFA,gBAQnB,OALAxxE,gBAAU,WACR,IAAM8zE,ET5CsB,SAACxlE,EAAgBiC,EAASohC,EAAY6/B,GACpE,OAAIljE,GAAkBA,IAAmB6vC,QAChC7vC,IAAmB6vC,SACtB6zB,GAAsBrgC,EAAY6/B,GAClCO,GAAuBpgC,EAAY6/B,GAElC,KSsCmBuC,CAAiBzlE,EAAgBjT,EAAMkV,QAASohC,EAAY6/B,GACpFlhC,EAAW,GAAD,WAAMwjC,EAAkB,CAACA,GAAmB,IAA5C,IAAoDz4E,EAAMkV,aACnE,CAAClV,EAAMkV,QAAS0Q,IAEZ,kBAACmwD,GAAD,KACL,kBAACD,GAAD,KACE,kBAAC,GAAD,CAAa1nE,IAAKyoE,EAAS3hE,QAASA,GAClC,kBAAC,GAAD,CACEA,QAASA,EACTpZ,KAAMA,EACNg7E,sBAAuBA,EACvBC,qBAAsBA,EACtBxqB,uBAAwBA,EACxBsqB,QAASA,EACTxqB,gBAAiBA,IAEnB,kBAAC,GAAD,CACEn3C,QAASA,EACTpZ,KAAMA,EACNw6C,WAAYA,EACZ6/B,gBAAiBA,EACjBpqB,sBAAuBA,EACvBl5C,WAAYA,EACZolC,UAAWA,MAIjB,kBAAC,GAAD,CAAakU,aAAcA,EAAcC,cAAeA,EAAeJ,eAAgBA,MAmErFrwC,GAAW,SAAC1a,EAAW2a,GAE3B,OAAuB,IADV/D,OAAOzC,KAAK0G,eAAc7a,EAAW2a,IACtCta,QAGd,SAAeK,SAAW2pD,GAAO3vC,K,yFClJ3BgrD,EAAe,CACnBgS,OAAQ,gBAAEn9E,EAAF,EAAEA,MAAF,OAAa+E,IAAK/E,EAAO,gBACjCo9E,OAAQ,gBAAEp9E,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,eAAgB,MAC5Dq9E,OAAQ,gBAAEr9E,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,eAAgB,MAC5D82D,OAAQ,gBAAE92D,EAAF,EAAEA,MAAO82D,EAAT,EAASA,OAAT,OAAqB/xD,IAAK/E,EAAD,wBAAyB82D,EAAzB,WACjCj2B,SAAU,gBAAE7gC,EAAF,EAAEA,MAAF,OAAa+E,IAAK/E,EAAO,6BAG/BkW,EAAiB,CACrBinE,OAAQ,gBAAEn9E,EAAF,EAAEA,MAAF,OAAa+E,IAAK/E,EAAO,iBACjCo9E,OAAQ,gBAAEp9E,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,gBAAiB,IAC7Dq9E,OAAQ,gBAAEr9E,EAAF,EAAEA,MAAF,OAAaqU,QAAWtP,IAAK/E,EAAO,gBAAiB,IAC7D82D,OAAQ,gBAAE92D,EAAF,EAAEA,MAAO82D,EAAT,EAASA,OAAT,OAAqB/xD,IAAK/E,EAAD,wBAAyB82D,EAAzB,WACjCj1B,QAAS,gBAAE7hC,EAAF,EAAEA,MAAF,OAAa+E,IAAK/E,EAAO,0BAClCs9E,YAAa,iBAAM,iB,4vBCZrB,IAAMC,EAAa,CACjBC,IAAK,QACLC,MAAO,UACPC,QAAS,aAIEC,EAA6B,CAAC,MAAO,UAAW,QAAS,WAEhEC,EAAqB,SAAC97E,EAAMlB,GAChC,OAAQkB,GACN,IAAK,SACH,OAAOlB,EAAQklC,IAAMllC,EAAO+8E,GAA8B,KAC5D,IAAK,cACH,OAAO/8E,EAAMkF,OAAS,EAAIlF,EAAML,KAAI,SAAAs9E,GAAU,OAAI/3C,IAAM+3C,EAAYF,MAA+B,KACrG,IAAK,QACH,OAAO54E,IAAKnE,EAAO,YACrB,IAAK,YACL,IAAK,WACH,OAAOmE,IAAKnE,EAAO,SACrB,QACE,OAAOA,IAeAk9E,EAAe,SAAfA,EAAgBp9E,GAAD,IAAQq9E,EAAR,uDAAsB,GAAtB,OAC1Bt9E,IACEC,GACA,SAAC2M,EAAKyZ,EAAMk3D,GACV,IAAIC,EAAW,GAcf,OAbIn3D,EAAKlmB,QAELq9E,EADEtkE,MAAM4W,QAAQzJ,EAAKlmB,OACVkmB,EAAKlmB,MAAMyG,QAAO,SAACgG,EAAKqT,GACjC,IAAMw9D,EAAUJ,EAAap9D,EAAEhgB,MAAH,cAAcq9E,GAAd,CAA2BC,KACjDG,EAAqB19E,IAAQy9E,GAAS,SAACE,EAAMx0C,EAAK/oC,GAAZ,cACrCu9E,GADqC,UAC9Bv9E,EAD8B,cACnBwM,EAAIxM,IAAQ,IADO,CACF+oC,QAAQ,IAClD,cAAWv8B,GAAQ8wE,KAClB,IAEQL,EAAah3D,EAAKlmB,MAAMF,MAAZ,cAAuBq9E,GAAvB,CAAoCC,MAI/D,OAAW3wE,GAAX,UAAiB,cAAI0wE,GAAJ,CAAiBC,IAAQ75E,KAAK,KAAOy5E,EAAmB92D,EAAKhlB,KAAMglB,EAAKlmB,QAAWq9E,KAEtG,K,koCC9DJ,IAAMnhC,EAAqB,SAAAjwC,GAAK,OAAKA,EAAMgiB,QAErCkuB,EAAuB,SAACniC,EAAQob,GACpC,IAAM9vB,EAAM8vB,GAAWA,EAAQ7iB,WAAU,SAAA6f,GAAC,OAAIA,EAAEvE,QAAU7T,EAAOjU,MACjE,OAAOT,GAAO,EACV,CACE82C,SAAU92C,EAAM,EAChB05B,MAAO5J,EAAQ9vB,GAAK05B,OAEtB,MAGAqd,EAAoB,CAAC,UAAW,UAAW,SAAU,UAAW,WAAY,OAAQ,YAAa,cACrG,UAAW,SAAU,UAAW,WAE5BohC,EAAiB,SAAAzjE,GAAM,OAC3BA,EAAOhO,UAAuC,IAA3BgO,EAAOhO,SAAS9G,QAAgBm3C,EAAkB/uC,SAAS0M,EAAOhO,SAAS,GAAG8hB,WCZnG,SACE4vD,mBFOgC,CAAC,oBAAqB,mBAAoB,sBAAuB,sBENjGX,6BACAY,iBF4B8B,SAAAt4E,GAAM,2BACnCs3E,EAAWC,IAAMv3E,EAAOpF,KADW,MAEnC08E,EAAWE,MAAQx3E,EAAO6qB,OAFS,MAGnCysD,EAAWG,QAAUz3E,EAAOu4E,SAHO,GAIjCV,EAAa73E,EAAOvF,SE/BvBo9E,eACAW,SF6DsB,SAAChxC,EAAezD,GACtC,IAWMtpC,EAAQ2b,OAAOzC,KAAK6zB,GAAepmC,QAAO,SAACgG,EAAKyZ,GACpD,IAZkB,SAAAA,GAAI,OAAKzK,OAAOkP,OAAOgyD,GAAYrvE,SAAS4Y,IACxDkjB,IAAgBA,EAAYuU,MAAK,SAAAmgC,GAAU,OAAIA,IAAe53D,GAAQ43D,EAAWrrC,WAAWvsB,EAAO,QAWpG63D,CAAY73D,GAAO,CACtB,IAAM83D,EAAI93D,EAAKjK,MAAM,KAAK1Y,KAAK,WAC/B,OAAO06E,IAAKxxE,EAAKuxE,EAXG,SAAlBE,EAAkBl+E,GACtB,OAAI+Y,MAAM4W,QAAQ3vB,GACTA,EAAML,KAAI,SAAAmgB,GAAC,OAAIo+D,EAAgBp+D,MAGjCq+D,IAAUn+E,GAASklC,IAAMllC,EAAO,CAAC,MAAO,UAAW,OAASA,EAM7Ck+E,CAAgBrxC,EAAc3mB,KAEpD,OAAOzZ,IACN,IAEH,MAAO,CACLyjB,MAAO2c,EAAc8vC,EAAWE,OAChC58E,IAAK4sC,EAAc8vC,EAAWC,KAC9BgB,QAAS/wC,EAAc8vC,EAAWG,SAClCh9E,UEpFFs+E,sBCQmC,SAACp9E,EAAUq9E,EAAejlC,GAC7D,IAAM0L,EAAU,GAkBhB,OAjBA9jD,EAASqd,SAAQ,SAAAhZ,GACfg5E,EAAchgE,SAAQ,SAAAwP,GACpB,GAAIxoB,EAAOwoB,GAAQ,CACjB,IAAMywD,EAAaj5E,EAAOwoB,IACX9U,MAAM4W,QAAQ2uD,GAAcA,EAAa,CAACA,IAElDjgE,SAAQ,SAAAre,GAAS,IACfkwB,EAAclwB,EAAdkwB,MAAOjwB,EAAOD,EAAPC,KAxBF,SAACiwB,EAAOjwB,EAAKm5C,GACjC,QAASj1C,IAAKi1C,EAAU,CAAC,kBAAmBlpB,EAAOjwB,GAAM,KAyB5Cs+E,CAAcruD,EAAOjwB,EAAKm5C,IAtBhB,SAAClpB,EAAOjwB,EAAK6kD,GACpC,OAAO3gD,IAAK2gD,EAAS,CAAC50B,GAAQ,IAAI5iB,SAASrN,GAqBUu+E,CAAiBtuD,EAAOjwB,EAAK6kD,IACxEm5B,IAAKn5B,EAAS,CAAC50B,GAAX,cAAuB/rB,IAAK2gD,EAAS,CAAC50B,GAAQ,KAA9C,CAAmDjwB,eAO1D6kD,GD1BP25B,kBCkC+B,SAAAz9E,GAAQ,OACvCA,EAASyF,QAAO,SAACgG,EAAKu8B,GAAN,SAAC,KACZv8B,GADW,UAEbu8B,EAAI9Y,MAFS,cAEIzjB,EAAIu8B,EAAI9Y,QAAU,IAFtB,CAE2B8Y,EAAI/oC,UAE5C,KDtCHq8C,oBDYiC,SAACxjC,EAASsc,EAAS4nB,GAA0B,2BAAT8f,EAAS,iCAATA,EAAS,kBAC9E,OAAKhkD,EAGEA,EACJpL,QAAO,SAAAsM,GAAM,OAAKA,EAAOiU,UACzBvgB,QAAO,SAAAsM,GAAM,OAAIA,EAAOhO,SAAS0B,OAAOwuC,GAAoBh3C,OAAS,KACrEvF,KAAI,SAACyZ,EAAG9T,GAAJ,MACH,CACEA,IAAKA,EACLS,GAAIqT,EAAErT,GACNlD,MAAOuW,EAAEvW,MACTuyB,QAAS,GACPte,SAAUsC,EAAEtC,UACTqlC,EAAqB/iC,EAAGgc,IAE7BppB,SAAUoN,EAAEpN,SAAS0B,OAAOwuC,GAC5B94C,WAAYgW,EAAEujC,WACdC,aAAc6gC,EAAerkE,GAC7ByjC,aAAc,gBAAEC,EAAF,EAAEA,QAAF,SAAW9iC,OAAmBhO,SAASrM,KAAI,SAAAsM,GAAK,OAAI+wC,EAAY,WAAZ,GAAa/wC,EAAO6wC,GAApB,OAAgCggB,YAjB/F,M,0rBGvBX,IAAMn7D,EAAe,CACnB8X,kBAAmB,KACnBlB,kBAAmB,KACnBwB,aAAc,KACd0H,OAAQ,MAGGi9D,EAAe,CAC1BC,IAAK,MACLC,OAAQ,UAGV,MCbA,GAAgBC,ODahB,SAAe32B,GAAkB,OACLjgD,cAAStG,GADJ,WACxBrB,EADwB,KACjB+e,EADiB,KAqD/B,MAAO,CAACvF,UAlDO,SAAAvO,GAAI,MAAK,CACtBuM,YAAa,SAAA5F,GACXmN,EAAS,EAAD,KAAK/e,GAAL,IAAYmZ,kBAAmBlO,KAOvC,IAAMuzE,EAAmB5sE,EAAEtC,OAQvBkvE,GACFA,EAAiB58D,iBAAiB,WARlB,SAAZ68D,EAAYC,GAChB3/D,EAAS1d,GACTq9E,EAAalkD,kBACTgkD,GACFA,EAAiB38D,oBAAoB,UAAW48D,MAIM,GAG1D7sE,EAAE4oB,mBAEJ/iB,YAAa,SAAA7F,GACX,GAAI5R,EAAMmZ,oBAAsB,IAAQnZ,EAAMiY,kBAAmBhN,GAAO,CACtE,IAAM0zE,EAAW/sE,EAAEtC,OAASsC,EAAEtC,OAAO0kE,wBAA0B,GACzD7yD,EAASw9D,EAASC,EAAKD,EAASn8E,OAAS,EAC/Cuc,EAAS,EAAD,KAAK/e,GAAL,IAAYiY,kBAAmBhN,EAAMkW,YAE/CvP,EAAE4oB,mBAEJ9iB,WAAY,SAAA9F,GACV,GAAI5R,EAAMmZ,kBAAmB,CAC3B,IACMM,EADQ7H,EAAEitE,QAAU7+E,EAAMmhB,OAAS,EACZi9D,EAAaE,OAASF,EAAaC,IAIhE,OAHAt/D,GAAS,SAAA/e,GAAK,cAASA,GAAT,IAAgByZ,oBAC9B7H,EAAEG,iBACFH,EAAE4oB,mBACK,IAGX7iB,OAAQ,SAAA/F,GACF5R,EAAMmZ,mBAAqBnZ,EAAMiY,oBACnC2vC,EAAe5nD,EAAMmZ,kBAAmBnZ,EAAMiY,kBAAmBjY,EAAMyZ,cACvEsF,EAAS1d,GACTuQ,EAAE4oB,sBAKmBziB,SAAU/X,IClEfo+E,iB,qGC4BXU,EAAmB,SAAAlT,GAC9B,GAAmB,iBAARA,EACT,OAAO,EAET,IACE,IAAMpE,EAASn1B,KAAK0sC,MAAMnT,GAE1B,MAAgB,oBADHzwD,OAAOqD,UAAUisB,SAASlqC,KAAKinE,GAE5C,MAAOwX,GACP,OAAO,ICtCX,SACEC,gBDuB6B,SAAA12D,GAC7B,IAAM22D,EAAM/1D,QAAsBZ,GAClC,OAAO42D,IAAWD,GAAK,SAAAx/E,GAAK,OAAIo/E,EAAiBp/E,GAAS2yC,KAAK0sC,MAAMr/E,GAASA,MCxB9E0/E,cDS2B,SAAAF,GAC3B,IAAMG,EAAoBF,IAAWD,GAAK,SAAAx/E,GAAK,OAAIm+E,IAAUn+E,GAAS2yC,KAAKC,UAAU5yC,GAASA,KAC9F,OAAOypB,YAA0Bk2D,M,iFETnC,QALoB,SAACC,EAAcC,EAAiBC,GAClD,IAAMrgE,EAAOogE,EAAkBD,EAC/B,OAAO1jE,KAAKC,IAAI,GAAI2jE,EAAcrgE,ICApC,GAAgBsgE,UCYhB,SAAgBC,EAAyBC,EAAgBC,GAA2B,OACpCj4E,cAAS,MAD2B,WAC3EuQ,EAD2E,KAC1D2nE,EAD0D,KAE5EP,GAAe3uE,YAAO,MACtBnP,GAAUmP,cAHkE,GAgB9ChJ,eAAS,GAhBqC,WAgB3E2P,EAhB2E,KAgB/DwoE,EAhB+D,QAiB9Bn4E,eAAS,GAjBqB,WAiB3Eo4E,EAjB2E,KAiBvDC,EAjBuD,KAmB5EloE,GAAc7G,cAAQ,iBAAO,CAACiH,kBAAiBZ,gBAAc,CAACY,EAAiBZ,IAa/E8oD,GAAYxnD,kBAAY,WACxBV,IACF0nE,EAAuB1nE,GACvB8nE,GAAsB,GAOtBlhB,YAAW,WACTghB,GAAc,GACdD,EAAmB,MACnBP,EAAajuE,aAAUpE,IACtB,MAEJ,CAACiL,EAAiB0nE,IAmBfl6E,EAAS,CACbu6E,aAlBkBrnE,kBAAY,SAAAhH,GAC1BsG,GAAmB6nE,IACrBv+E,EAAQ6P,QAAUi7D,uBAAsB,WACtC,GAAIgT,EAAajuE,QAAS,CACxB,IAAM6uE,EAAUR,EAAwBxnE,GAElC1V,EAAS29E,EAAYb,EAAajuE,QAAQutE,EAAGhtE,EAAEitE,QAASqB,EAAQ77D,cAChE5hB,EAAQ09E,EAAYb,EAAajuE,QAAQ+uE,EAAGxuE,EAAEyuE,QAASH,EAAQ/e,aAErEwe,EAAeznE,EAAiB,CAAC1V,SAAQC,UAG3C68E,EAAajuE,QAAU,CAACutE,EAAGhtE,EAAEitE,QAASuB,EAAGxuE,EAAEyuE,eAG9C,CAACnoE,EAAiBynE,EAAgBI,IAInC3f,aAaF,OAVAn4D,gBAAU,WAKR,OAJK83E,GACHO,qBAAqB9+E,EAAQ6P,SAGxB,WACLivE,qBAAqB9+E,EAAQ6P,YAE9B,CAAC0uE,IAEG,CAACjoE,cAAaP,YA7DD,SAAA2oE,GAAO,OAAI,SAAAtuE,GAC7BiuE,EAAmBK,GACnBJ,GAAc,GACdE,GAAsB,GACtBV,EAAajuE,aAAUpE,EAGvB2E,EAAE4oB,kBACF5oB,EAAEG,mBAqD8BmH,eAAgBxT,M,gIC7F9C66E,EAAY,SAAA/gE,GAAC,OAAIA,SAAuC,KAANA,GAoBlDghE,EAAmB,SAAC9gF,EAAO06C,EAAax0B,GAArB,MACvB,cACM26D,EAAU7gF,EAAMimB,MAAQ,CAACy0B,EAAYx0B,EAAMlmB,EAAMimB,KAAM,OAAS,IADtE,IAEM46D,EAAU7gF,EAAM2P,IAAM,CAAC+qC,EAAYx0B,EAAMlmB,EAAM2P,GAAI3P,EAAMy4C,UAAY,IAAM,OAAS,KACxFl1C,KAAK,UAGHw9E,EAAgB,SAAA7/E,GACpB,OAAQA,GACN,IAAK,WACL,IAAK,WACL,IAAK,WACH,OAAO,SAAAlB,GACL,IAAMghF,EAAc9kD,IAAOl8B,EAAO,cAAc,GAChD,OAAIghF,EAAYtiB,UACP,CACLz4C,KAAMjmB,EACN2P,GAAIqxE,EAAY3kD,IAAI,EAAG,KACvBC,cAAc,EACdmc,WAAW,GAGNz4C,GAGb,QACE,OAAO,SAAAA,GAAK,OAAIA,KAIhBy6C,EAAe,SAAAv5C,GACnB,OAAQA,GACN,IAAK,mBACL,IAAK,qBACH,OAAO,SAACglB,EAAMlmB,GAAP,sBAA0BkmB,EAA1B,aAAmClmB,EAAML,KAAI,SAAAmgB,GAAC,OAAIA,EAAE7f,OAAKsD,KAAK,KAA9D,MACT,IAAK,sBACL,IAAK,oBACH,OAAO,SAAC2iB,EAAMlmB,GAAP,gBAAoBkmB,EAApB,kBAAkClmB,EAAMC,MACjD,IAAK,kBACH,OAAO,SAACimB,EAAMlmB,GAAP,MAA0B,gBAATkmB,EAAA,qBACNlmB,EADM,2BACkBA,EADlB,6BAENA,EAFM,cAEKkmB,EAFL,0BAE2BlmB,EAF3B,eAEuCkmB,EAFvC,OAG1B,IAAK,YACL,IAAK,OACL,IAAK,mBACH,OAAO,SAACA,EAAMlmB,EAAOihF,GAAd,gBAA0B/6D,EAA1B,YAAkC+6D,EAAlC,kBAAgDjhF,EAAhD,MACT,IAAK,WACL,IAAK,WACL,IAAK,WACH,OAAO,SAACkmB,EAAMlmB,EAAOihF,GAAd,gBAA0B/6D,EAA1B,YAAkC+6D,EAAlC,sBAAoD/kD,IAAOl8B,GAAOm8B,MAAMC,OAAO,oBAA/E,MACT,IAAK,OACH,OAAO,SAAClW,EAAMlmB,EAAOihF,GAAd,gBAA0B/6D,EAA1B,YAAkC+6D,EAAlC,kBAAgD/kD,IAAOl8B,EAAO,SAASo8B,OAAO,gBAA9E,MACT,IAAK,kBACL,IAAK,SACL,IAAK,aACL,IAAK,aACH,OAAO,SAAClW,EAAMlmB,GAAP,gBAAoBkmB,EAApB,gBAAgClmB,EAAhC,MACT,IAAK,UACH,OAAO,SAACkmB,EAAMlmB,GAAP,OAA2B,IAAVA,EAAkB,KAAlB,UAA4BkmB,EAA5B,eAAuClmB,IACjE,IAAK,UACH,OAAO,SAACkmB,EAAMlmB,GAAP,OAA2B,IAAVA,EAAkB,KAAlB,iBAAmCkmB,EAAnC,MAC1B,QACE,OAAO,SAACA,EAAMlmB,EAAOihF,GAAd,gBAA0B/6D,EAA1B,YAAkC+6D,EAAlC,YAA0CjhF,MAKjDkhF,EAAY,SAAAlhF,GAChB,OAAIm+E,IAAUn+E,IAAUA,EAAMC,IACrB,oBAGL8Y,MAAM4W,QAAQ3vB,IAAUA,EAAMgrD,OAAM,SAAAlrC,GAAC,QAAMA,EAAE7f,OACxC,mBAGF,UCjGT,SAAgBikD,ODGM,SAACh+B,EAAMlmB,EAAOyiC,GAClC,IAAKo+C,EAAU7gF,GACb,OAAO,KAGT,IAAMkB,EAAOuhC,GAAay+C,EAAUlhF,GAG9Bs8B,GAFNt8B,EAAQ+gF,EAAc7/E,EAAd6/E,CAAoB/gF,KAEmB,WAAjB,IAAOA,IAAsBA,EAAMs8B,aAC3Doe,EAAcD,EAAav5C,GAEjC,OAAIo7B,EACKwkD,EAAiB9gF,EAAO06C,EAAax0B,GAErCw0B,EAAYx0B,EAAMlmB,EAAO,S,+jCEhB7B,IAcDmhF,EAAkB,SAAA3B,GAAG,OAAI/jE,OAAOzC,KAAKwmE,GAAKt6E,QAAU,EAAIs6E,EAAI/jE,OAAOzC,KAAKwmE,GAAK,SAAMjyE,GCfzF,SAAgB6zE,gBDCe,SAAAt0D,GAAU,UACnBA,GADmB,IACvC,2BAA4B,KAAjBwZ,EAAiB,QAC1B,GAAIA,EAAM3B,sBACR,OAAOw8C,EAAgB76C,EAAM3B,uBAAuB,GAGtD,GAAI2B,EAAMxmC,MACR,OAAOqhF,EAAgBA,EAAgB76C,EAAMxmC,QAAQ,IAPlB,8BAWvC,OAAO,Q,2pBEXT,IAAIuhF,EAAiB,GCDrB,SAAgBC,gBDMe,SAACh/E,EAAUyhB,GAAoB,IAAd5Y,EAAc,uDAAN,EACtDk2E,EAAiB,EAAH,KACTA,GADS,UAEX/+E,EAAW,CACV6I,QACA4Y,KAAM,EAAF,KAAO5f,IAAKk9E,EAAgB,CAAC/+E,EAAU,QAAS,KAASyhB,OCXlCw9D,iBDGD,SAAAj/E,GAAQ,OACtC6B,IAAKk9E,EAAgB,CAAC/+E,EAAU,QAAS,KCJQk/E,oBDgBhB,WAAe,IAAdr2E,EAAc,uDAAN,EAC1Ck2E,EAAiB,EAAH,GACR5lE,OAAOzC,KAAKqoE,GAAgB56E,QAAO,SAACgG,EAAKxM,GAC3C,IAAMwhF,EAAgBJ,EAAephF,GACrC,cAAWwM,GAASg1E,EAAct2E,MAAQA,GAAtB,OAAiClL,EAAMwhF,MAC1D,Q,uPEtBMljB,EAAa,kCAEbmjB,EAAa,kCAIbC,EAAc,mCACdC,EAAe,oCAMfjrC,EAAa,iBAAO,CAC/Bz1C,KAAMq9D,IAGKsjB,EAAqB,SAAAC,GAAe,MAAK,CACpD5gF,KAjBiC,2CAkBjCC,QAAS,CACP2gF,qBAISC,EAAY,SAAA7oB,GAAM,MAAK,CAClCh4D,KAAMwgF,EACNvgF,QAAS,CACP+3D,YAIS8oB,EAAc,SAAAz+D,GAAQ,MAAK,CACtCriB,KA7B2B,qCA8B3BC,QAAS,CACPoiB,cAYS0+D,EAAY,iBAAO,CAC9B/gF,KAAMygF,IAkBKO,EAAqB,SAAAC,GAAe,MAAK,CACpDjhF,KAxDkC,4BAyDlCC,QAAS,CACPghF,qB,WCxDaC,G,WAcPC,G,WAsBAC,G,WAcOC,G,WAaA5rC,G,WASAvyB,G,WAIAo+D,G,WAgBPC,G,WAUOC,G,WAIQtiF,IA9GZuiF,EAAmB,SAAAriF,GAAK,OAAIA,EAAMsiF,mBAAmBr/D,UACrDs/D,EAAiB,SAAAviF,GAAK,OAAIA,EAAMsiF,mBAAmB1pB,QACnDhZ,EAAgB,SAAA5/C,GAAK,OAAIA,EAAMoF,OAErC,SAAU08E,IAAV,iFACyB,OADzB,UAC+B5hF,QAAO0/C,GADtC,qBACEgZ,OADF,iBAGc,OAHd,UAGoB14D,QAAOmiF,GAH3B,OAIwB,OADrBp/D,EAHH,kBAI8B1iB,QAAKC,gBAAD,qBAAiCyiB,EAAjC,eAAwD,CAACxiB,OAAQ,QAJnG,QAMH,OAFM+hF,EAJH,SAKuBA,EAAmBnmE,KAAtCu8C,EALJ,EAKIA,OAAQ6pB,EALZ,EAKYA,QALZ,WAMG9hF,QAAIqF,EAAkB,CAAC4yD,SAAQ8pB,IAAKD,KANvC,QAQL,OARK,WAQC9hF,QD8ByB,CAC/BC,KAAM0gF,ICvCD,wCAcP,SAAUS,EAAgCnpB,EAAQN,EAAUr1C,EAAUmwC,GAAtE,yEAOmB,OANXh0D,EAAO,CACXw5D,SACAN,WACAr1C,WACAmwC,YALJ,UAOyB7yD,QAAKC,gBAAkB,cAC5C,CACEC,OAAQ,OACRwrB,QAAS,IAAIwuC,QAAQ,CACnB,eAAgB,qDAElBp+C,KAAMlB,OAAOzC,KAAKtZ,GACfgO,QAAO,SAAA65C,GAAC,QAAM7nD,EAAK6nD,MACnBvzC,OACArU,KAAI,SAAA4nD,GAAC,gBAAOnlD,mBAAmBmlD,GAA1B,YAAgCnlD,mBAAmB1C,EAAK6nD,QAAOhkD,KAAK,OAhBlF,OAmBE,OAZM9D,EAPR,iBAmBQwB,QAAIqF,EAA2BnC,IAAK1E,EAAU,wCAAwC,KAnB9F,uCAsBA,SAAU6iF,EAAkB/+D,EAAU21C,EAAQ+pB,GAA9C,uEAC6B,OAD7B,UACmCpiF,QAAKC,gBAAD,qBAAiCyiB,EAAjC,eACnC,CACExiB,OAAQ,OACR4b,KAAM,CACJu8C,SACA+pB,QAEF/mB,oBAAqB,CAAC,OAR5B,OAWE,OAVMgnB,EADR,iBAWQjiF,QAAIqF,EAAyD,MAA9B48E,EAAmB5/E,SAX1D,uCAcO,SAAUi/E,EAAV,oFACY,OADoB3pB,EAAhC,EAAsBz3D,QAAUy3D,SAAhC,UACkBp4D,QAAOmiF,GADzB,OAEY,OADXp/D,EADD,iBAEkB/iB,QAAOqiF,GAFzB,OAGsB,OAHtB,SAEE3pB,EAFF,EAEEA,OAFF,WAG4B14D,QAAO0/C,GAHnC,oBAGEwT,EAHF,EAGEA,UAHF,EAGYyF,OAHZ,iBAMH,OANG,WAMGt4D,QAAKwhF,EAAiCnpB,EAAQN,EAAUr1C,EAAUmwC,GANrE,gCAQH,OARG,WAQG7yD,QAAKyhF,EAAmB/+D,EAAU21C,EAAQN,GAR7C,QAUL,OAVK,WAUC33D,QDAyB,CAC/BC,KA9D0B,sBCmDrB,wCAaA,SAAUy1C,IAAV,yEACL,OADK,UACC91C,QAAK2hF,GADN,OAEY,OAFZ,UAEkBhiF,QAAO0/C,GAFzB,qBAEEgZ,EAFF,EAEEA,QAFF,gBAIH,OAJG,UAIGj4D,QAAIqF,EAAkB4yD,IAJzB,OAML,OANK,WAMCj4D,QAAIqF,KANL,wCASA,SAAU8d,IAAV,iEACL,OADK,UACCnjB,QAAIK,sBAAiC,cADtC,uCAIA,SAAUkhF,IAAV,+EACY,OADZ,UACkB3hF,QAAK4hF,GADvB,OAEL,OADMl/D,EADD,iBAECtiB,QAAIqF,EAAoBid,IAFzB,OAIc,OADb0R,EAHD,wBAG0B1R,EAH1B,eAIoB1iB,QAAKC,kBAAoB,YAAa,CAACm0B,QAAOn1B,MAAO,CAvFzD,8BAmFhB,aAICqjF,EAJD,QAMUj+E,OAAS,GANnB,uBAOG,IAAI2uB,MAAJ,gDAAmDtQ,IAPtD,QAaL,OAHM6/D,EAAej/E,IAAKg/E,EAAD,oBA7FJ,2BA6FI,eACnBrB,EA7FqB,MA6FHsB,EAXnB,WAaCniF,QAAIqF,EAA2Bw7E,IAbhC,wCAgBP,SAAUW,IAAV,2EACoC,OADpC,UAC0CjiF,QAAO0/C,GADjD,qBACmBmjC,EADnB,EACS9/D,UADT,yCAGW8/D,GAHX,OAK+B,OAL/B,WAKqCxiF,QAAKC,gBAAkB,cAL5D,eAKUgiF,EALV,yBAMWA,EAAmBnmE,KAAK4G,UANnC,wCAUO,SAAUm/D,IAAV,iEACL,OADK,UACCzhF,QAAIK,sBAAiC,aADtC,uCAIQ,SAAUlB,KAAV,iEACb,OADa,UACPmB,QAAI,EACRC,QDpH0B,sCCoHS4gF,IACnC5gF,QDjHuB,mCCiHS+gF,IAChC/gF,QAAW8E,EAAoBqwC,IAC/Bn1C,QDlHmB,eCkHS4iB,IAC5B5iB,QAAW8E,EAAqBo8E,IAChClhF,QAAW8E,EAAsBo8E,IACjClhF,QDzHqC,iDCyHSkhF,IAC9ClhF,QDpHwB,oBCoHSkhF,KATtB,uC,wlBCnHf,IAAMY,GAAW,SAAAC,GAAK,OAAI,SAAAjjF,GAAK,gBAC1BA,GAD0B,IAE7BijF,YAGI9hF,IAAe,aFPc,2CEQFC,2BAAkC,oBAD9C,OAElB4E,EAAqB5E,2BAAkC,WAFrC,OFLQ,qCEQFA,2BAAkC,aAHxC,OFEe,4BEEFA,2BAAkC,oBAJ/C,OAKlB4E,EAAsBg9E,GAAS,IALb,OAMlBh9E,EAAuBg9E,GAAS,IANd,OFHoB,iDEUFA,GAAS,IAP3B,OFGO,oBEKFA,GAAS,IARd,IAWf3hF,GAAe,CACnB4hF,MAAO,KACPzB,gBAAiB,KACjB5oB,OAAQ,KACR31C,SAAU,KACV4+D,gBAAiB,MCtBnB,UACES,mBDwBa,WAA+C,IAA9BtiF,EAA8B,uDAAtBqB,GAAcE,EAAQ,uCACtDC,EAAUL,GAAgBI,EAAOX,MACvC,OAAOY,EAAUA,EAAQxB,EAAOuB,GAAUvB,ICvBrC,IAAMyB,GAAQ,CAACC,I,gTCJf,IAAMyY,GAAsBxb,UAAH,KAGhBC,WAAY,IAEtByE,M,GCOQ,kBAAC,KAAD,CAAkBoC,GAAG,8CAyBnC,SAjCc,SAAC,GAAmD,IAAlD+7E,EAAkD,EAAlDA,gBAAiB3oB,EAAiC,EAAjCA,OAAQipB,EAAyB,EAAzBA,cAAe7hF,EAAU,EAAVA,KAChDsR,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEtC,OACE,oCACE,kBAAC2R,GAAA,KAAD,KAEIoqE,EAAe,GAEX3oB,EACE,0BAAMl2C,wBAAyB,CAACC,OAAQrR,EAAI,6CAC5C,0BAAMoR,wBAAyB,CAACC,OAAQrR,EAAI,wCAGtD,kBAAC4I,GAAD,KACE,kBAACxM,GAAA,EAAD,CACEpL,MAAOgP,EAAI,0CACXwO,IAAI,UACJnF,KAAK,SACL3W,QAAS69E,OCpBnB,IAAM58E,GAAoB,CACxBmxC,aACAyrC,cN+B2B,iBAAO,CAClClhF,KAnC4B,yCMY9B,MCfA,IDeeuE,eANS,SAAAnF,GAAK,MAAK,CAChCwhF,gBAAiBxhF,EAAMsiF,mBAAmBd,gBAC1C5oB,OAAQ54D,EAAMsiF,mBAAmB1pB,OACjCC,OAAQ74D,EAAMoF,MAAMyzD,UAGkB3zD,GAAxC,EAA2DwD,SAAWw6E,K,uTEd/D,IAAMC,GAAsBxkF,UAAH,KAGpBC,WAAY,KAAQA,WAAY,GAAMA,WAAY,KAAQA,WAAY,IAGrEwkF,GAAkBzkF,UAAH,KAGZC,YAAa,GACVA,YAAa,K,GCH5B,kBAACwY,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,4C,GAKvB,kBAAC2R,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,4C,GAKrB,kBAAC2R,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,4C,GAQrB,kBAAC,KAAD,CAAkBA,GAAG,2CAc7B,SArCe,SAAC,GAAqC,IAApCmzD,EAAoC,EAApCA,OAAQyqB,EAA4B,EAA5BA,uBACvB,OAAO,uCAIL,kBAACF,GAAD,KACE,kBAACG,GAAA,EAAD,CAAQ5jF,MAAOk5D,EAAO8pB,OALnB,GAUL,kBAACU,GAAD,KACE,kBAAChsE,GAAA,KAAD,KAAewhD,EAAOA,SAXnB,GAgBL,kBAACz+C,GAAD,KACE,kBAACxM,GAAA,EAAD,CACEoS,IAAI,UACJnF,KAAK,SACL3W,QAASo/E,GAHX,OCpBN,IAAMn+E,GAAoB,CACxBm+E,uBVoCoC,iBAAO,CAC3CziF,KAtCuC,oDUQzC,MCZA,IDYeuE,eAJS,SAAAnF,GAAK,MAAK,CAChC44D,OAAQ54D,EAAMsiF,mBAAmB1pB,UAGK1zD,GAAxC,EAA2DwD,SAAW66E,K,8HEX/D,IAAM/vB,GAA8B70D,UAAH,KAElC80D,O,GCSF,kBAACr8C,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,kDAyC3B,SAhDqB,SAAC,GAAuB,IAAtBw8E,EAAsB,EAAtBA,WAAYhiF,EAAU,EAAVA,KAAU,GACX0H,cAAS,MADE,WACpC2wD,EADoC,KAC1BC,EAD0B,KAErChnD,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAGtC,OAAO,uCAIL,0BAAM6oB,SAAU,SAAA1c,GACdA,EAAEG,iBACFH,EAAE4oB,kBACE89B,GAAYA,EAAS7tB,WAAW7lC,QAAU,GATlBq9E,EAAW3pB,KAavC,kBAACxyB,GAAA,EAAD,CACEnG,WAAY24B,EACZ7yD,GAAG,qBACHlD,MAAOgP,EAAI,uDAEX,kBAACiiD,GAAD,KACE,kBAACv2B,GAAA,EAAD,CACEr8B,KAAK,UACLlB,MAAO44D,EACP5yD,OAAQ,CAACgV,SAAU69C,GACnBn8C,QAAS,CAAC0f,OAAQ,UAAW48B,mBAAmB,OAItD,kBAACv+C,GAAD,KACE,kBAACxM,GAAA,EAAD,CACEpL,MAAOgP,EAAI,wCACXwO,IAAI,UACJnF,KAAK,SACLha,KAAK,SACLijB,UAAWy0C,GAAYA,EAAS7tB,WAAW7lC,OAAS,QCtC9D,IAAMM,GAAoB,CACxB+8E,WdgDwB,SAAA3pB,GAAQ,MAAK,CACrC13D,KA/CyB,mCAgDzBC,QAAS,CACPy3D,ec5CJ,MCZA,IDYenzD,eAJS,SAACnF,EAAOsD,GAAR,MAAmB,KAIH4B,GAAxC,EAA2DwD,SAAW86E,K,2cEX/D,IAAM33B,GAAuBltD,UAAH,KAGZC,YAAa,KAGrBC,GAAoBF,WAAH,MAGnB,qBAAE8kF,aAAiC3kF,WAAY,uBAAyBA,WAAY,wBAChFF,UAAW,KAOb8kF,GAAoB/kF,UAAH,M,GCNtB,kBAACktD,GAAD,KACE,kBAAChtD,GAAD,CAAmB4kF,cAAc,GAC/B,kBAAC,KAAD,CAAM1kF,KAAM,WAEd,kBAAC2kF,GAAD,KACE,kBAACtsE,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,kD,GAkB7B,kBAAComD,GAAD,KACE,kBAAChtD,GAAD,CAAmB4kF,cAAc,GAC/B,kBAAC,KAAD,CAAM1kF,KAAM,WAEd,kBAAC2kF,GAAD,KACE,kBAACtsE,GAAA,KAAD,KACE,kBAAC,KAAD,CAAkB3R,GAAG,6CAuBjC,SA3De,SAAC,GAAgD,IAA/Cqe,EAA+C,EAA/CA,QAAS69D,EAAsC,EAAtCA,UAAWE,EAA2B,EAA3BA,gBAAiB5hF,EAAU,EAAVA,KAC9CsR,EAAM,SAAA9L,GAAE,OAAIxF,EAAK+J,cAAc,CAACvE,QAEtC,OAAIo8E,EAEA,uCAWE,kBAAC1nE,GAAD,KACE,kBAACxM,GAAA,EAAD,CACEpL,MAAOgP,EAAI,wCACXwO,IAAI,UACJnF,KAAK,SACL3W,QAAS6f,MAQjB,uCAWE,kBAAC3J,GAAD,KACE,kBAACxM,GAAA,EAAD,CACEpL,MAAOgP,EAAI,wCACXwO,IAAI,UACJnF,KAAK,SACL3W,QAAS09E,OC/CnB,IAAMz8E,GAAoB,CACxB4e,QlBuDqB,iBAAO,CAC5BljB,KArDqB,iBkBFrB+gF,aAOF,MCbA,IDaex8E,eAJS,SAAAnF,GAAK,MAAK,CAChC6hF,gBAAiB7hF,EAAMsiF,mBAAmBT,mBAGJ38E,GAAxC,EAA2DwD,SAAWi7E,KELtE,IAAMC,GACG,EADHA,GAEI,EAFJA,GAGU,EAHVA,GAII,E,GAWK,kBAAC,GAAD,M,GAEA,kBAAC,GAAD,M,GAEA,kBAAC,GAAD,M,GAEA,kBAAC,GAAD,M,GAEA,kBAAC38D,GAAA,EAAD,M,GAMT,kBAACxK,EAAA,gBAAD,MAgBN,SAtC2B,SAAC,GAAwB,IAAvB45B,EAAuB,EAAvBA,WAAY4sC,EAAW,EAAXA,OACvCh7E,gBAAU,WACRouC,MACC,IAiBH,OACE,uCAhBoB,WACpB,OAAQ4sC,GACN,KAAKW,GACH,UACF,KAAKA,GACH,UACF,KAAKA,GACH,UACF,KAAKA,GACH,UACF,QACE,WAODC,KClCP,IAAM3+E,GAAoB,CACxBmxC,cAOF,MCZA,IDYelxC,eAJS,SAAAnF,GAAK,MAAK,CAChCijF,MAAOjjF,EAAMsiF,mBAAmBW,SAGM/9E,GAAxC,EAA2DwD,SAAWo7E,K,qkBENtE,IAAMC,GAAc,uB,GAGF,kBAAC,GAAD,MADZv+E,GAAU,SAACC,EAAIL,EAAOM,EAAQC,GAClC,IAAMC,EAAU,GAEVC,EAAQC,gBAAuBC,GAAUtE,GAAO2D,EAAO2+E,IAO7D,OALAtnE,eAAwB5W,GAAO,GAC/BgnB,eAAwBhnB,GAAO,EAAM,CAAC,UAAW,SAAU,iBAC3D7E,eAA0B6E,EAAOH,GACjC3E,eAAiB8E,GAEVC,cACLi+E,GACAn+E,EACAC,EACA,CACET,QACAM,SACAM,QAAS,GACTL,aACAM,oBAAqB,CAAC,YAAa,SAAU89E,OAkC7Cz+E,GAAkB,CACtB,YACA,WACA,YAGI0+E,GAAwB,SAAA1gF,GAAS,OACfqE,cAAS,MADM,WAC9BtB,EAD8B,KACzBo3D,EADyB,KAUrC,OARAx1D,gBAAU,WACR,IAAMvC,EAASJ,GAAgBa,QAAO,SAACT,EAAQU,GAAT,UAAC,MACjCV,GAAYpC,EAAM8C,IAAN,OAAkBA,EAAQ9C,EAAM8C,OAC/C,IAEHq3D,EAAOj4D,GAAQ,EAAwBlC,EAAOoC,MAC7C,IAEIW,EAAMA,EAAIC,UAAY,MAG/B09E,GAAsB9sE,UAAtB,SACK5R,GAAgBa,QAAO,SAAC+Q,EAAW9Q,GAAZ,UAAC,MAA0B8Q,GAA3B,UAAuC9Q,EAAQ+Q,aAAkB,KAD7F,IAEE8L,SAAU9L,WACVi8C,SAAUj8C,WACVyhD,OAAQzhD,UAAgB,CACtByhD,OAAQzhD,sBACRurE,IAAKvrE,wBAEP0hD,OAAQ1hD,WAGV,a,gBC7FA8sE,EAAOC,QAAU,IAA0B,0D,gBCA3CD,EAAOC,QAAU,IAA0B,uD,gBCA3CD,EAAOC,QAAU,IAA0B","file":"chunk-322.1a602064fbfb22a5a7d0.js","sourcesContent":["import React from 'react'\nimport {Icon, scale, theme, Typography} from 'tocco-ui'\nimport styled from 'styled-components'\nimport PropTypes from 'prop-types'\n\nconst StyledErrorView = styled.div`\n width: 50vw;\n max-width: 650px;\n padding: ${scale.space(1)};\n text-align: center;\n margin: 20vh auto auto;\n\n h1 {\n margin: 0 auto;\n }\n`\n\nconst StyledIconWrapper = styled.span`\n color: ${theme.color('signal.danger.text')};\n font-size: ${scale.font(13.4)};\n`\n\nconst ErrorView = ({title, message}) => {\n return <StyledErrorView>\n <StyledIconWrapper>\n <Icon icon=\"times\"/>\n </StyledIconWrapper>\n <Typography.H1>\n {title}\n </Typography.H1>\n <Typography.Span>{message}</Typography.Span>\n </StyledErrorView>\n}\n\nErrorView.propTypes = {\n title: PropTypes.element.isRequired,\n message: PropTypes.element.isRequired\n}\n\nexport default ErrorView\n","import _reduce from 'lodash/reduce'\n\nexport const transformProviderEntities = response =>\n response.data.map(provider => _reduce(provider.paths, (result, value, key) => {\n return {...result, [key]: value.value}\n }, {})\n )\n","import {cache, externalEvents, intl, rest} from 'tocco-app-extensions'\nimport {takeLatest, all, call, put, select} from 'redux-saga/effects'\n\nimport {transformProviderEntities} from '../utils/providers'\nimport * as actions from './actions'\n\nconst entityName = 'Openid_provider'\n\nexport const intlSelector = state => state.intl\n\nexport function* loadProviders() {\n const intl = yield select(intlSelector)\n\n const query = {\n paths: ['unique_id', 'label', 'button_primary_color', 'button_secondary_color', 'button_icon', 'button_label'],\n conditions: {locale: intl.locale, active: true}\n }\n\n const entities = yield call(rest.fetchEntities, entityName, query, {method: 'GET'}, transformProviderEntities)\n yield put(actions.setProviders(entities))\n}\n\nexport function* loginCompleted({payload: {result}}) {\n const localChanged = yield call(intl.hasUserLocaleChanged)\n if (localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(externalEvents.fireExternalEvent('loginCompleted', result))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOAD_PROVIDERS, loadProviders),\n takeLatest(actions.LOGIN_COMPLETED, loginCompleted)\n ])\n}\n","export const LOAD_PROVIDERS = 'root/LOAD_PROVIDERS'\nexport const SET_PROVIDERS = 'root/SET_PROVIDERS'\nexport const LOGIN_COMPLETED = 'root/LOGIN_COMPLETED'\n\nexport const loadProviders = () => ({\n type: LOAD_PROVIDERS\n})\n\nexport const setProviders = providers => ({\n type: SET_PROVIDERS,\n payload: {\n providers\n }\n})\n\nexport const loginCompleted = result => ({\n type: LOGIN_COMPLETED,\n payload: {\n result\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_PROVIDERS]: reducerUtil.singleTransferReducer('providers')\n}\n\nconst initialState = {\n providers: []\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport ssoLogin from './reducer'\n\nexport default {\n ssoLogin\n}\n\nexport const sagas = [rootSaga]\n","import {getPopUpFeatures} from './popUp'\n\nexport const openLoginWindow = (loginEndpoint, loginCompleted, provider) => {\n const baseUrl = __DEV__ ? '' : __BACKEND_URL__\n const encodedWindowUrl = encodeURIComponent(window.location.href)\n const url = `${baseUrl}${loginEndpoint}?provider=${provider.unique_id}&sourceUri=${encodedWindowUrl}`\n\n const popUp = window.open(url, provider.label, getPopUpFeatures(650, 500))\n\n window.ssoPopUpCallback = result => {\n popUp.close()\n loginCompleted(result)\n }\n}\n","import _reduce from 'lodash/reduce'\n\nexport const getPopUpFeatures = (height = 200, width = 200) => {\n const features = {\n height,\n width,\n left: (window.screen.width / 2) - (width / 2),\n top: (window.screen.height / 2) - (height / 2),\n resizable: 1,\n scrollbars: 1,\n status: 1\n }\n\n return _reduce(features, (result, value, key) => [...result, `${key}=${value}`], [])\n .join(',')\n}\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {\n declareInteractionColors,\n generateInteractionColors,\n theme,\n scale\n} from 'tocco-ui/src/utilStyles'\n\nexport default styled(StyledButton)`\n && {\n margin-right: 0;\n flex: 1;\n font-size: ${scale.font(1.3)};\n justify-content: center;\n border-radius: ${theme.radii('large')};\n ${props => declareInteractionColors(\n generateInteractionColors(props, {\n bg: props.primaryColor,\n fg: props.secondaryColor || `${_get(props.theme, 'colors.paper')}, ${_get(props.theme, 'colors.text')}`\n }))}\n span {\n margin-left: .5em;\n padding: .9rem 0;\n }\n }\n`\n","import React from 'react'\nimport {Icon} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport StyledProviderButton from './StyledProviderButton'\n\nconst ProviderButton = ({provider, loginCompleted, loginEndpoint}) => {\n const clickHandler = () => {\n openLoginWindow(loginEndpoint, loginCompleted, provider)\n }\n\n return (\n <StyledProviderButton\n primaryColor={provider.button_primary_color}\n secondaryColor={provider.button_secondary_color}\n onClick={clickHandler}\n >\n {provider.button_icon && <Icon position=\"prepend\" icon={provider.button_icon}/>}\n <span>{provider.button_label}</span>\n </StyledProviderButton>\n )\n}\n\nProviderButton.propTypes = {\n provider: PropTypes.shape({\n button_primary_color: PropTypes.string,\n button_secondary_color: PropTypes.string,\n button_icon: PropTypes.string,\n button_label: PropTypes.string\n }),\n loginEndpoint: PropTypes.string.isRequired,\n loginCompleted: PropTypes.func.isRequired\n}\n\nexport default ProviderButton\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport ProviderButton from '../ProviderButton/ProviderButton'\n\nconst StyledButtonContainer = styled.div`\n width: 100%;\n margin-top: 3rem;\n display: grid;\n grid-gap: 1rem;\n grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));\n\n @media (max-width: 1024px) {\n margin-top: 1.5rem;\n }\n`\n\nclass LoginBox extends React.Component {\n constructor(props) {\n super(props)\n props.loadProviders()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.autoLogin && prevProps.providers.length === 0 && this.props.providers.length > 0) {\n const autoLoginProvider = this.props.providers.find(entity => entity.unique_id === this.props.autoLogin)\n if (autoLoginProvider) {\n openLoginWindow(this.props.loginEndpoint, this.props.loginCompleted, autoLoginProvider)\n }\n }\n }\n\n render() {\n return <StyledButtonContainer>\n {\n this.props.providers\n .map((provider, idx) => (\n <ProviderButton\n key={idx}\n provider={provider}\n loginEndpoint={this.props.loginEndpoint}\n loginCompleted={this.props.loginCompleted}\n />\n ))\n }\n </StyledButtonContainer>\n }\n}\n\nLoginBox.propTypes = {\n loginEndpoint: PropTypes.string,\n loginCompleted: PropTypes.func.isRequired,\n loadProviders: PropTypes.func.isRequired,\n providers: PropTypes.array,\n autoLogin: PropTypes.string\n}\n\nexport default LoginBox\n","import LoginBox from './LoginBox'\n\nexport default LoginBox\n","import {connect} from 'react-redux'\n\nimport LoginBox from '../components/LoginBox'\nimport * as actions from '../modules/actions'\n\nconst mapActionCreators = {\n loadProviders: actions.loadProviders,\n loginCompleted: actions.loginCompleted\n}\n\nconst mapStateToProps = state => {\n return {\n providers: state.ssoLogin.providers,\n loginEndpoint: state.input.ssoLoginEndpoint,\n autoLogin: state.input.autoLogin\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LoginBox)\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport LoginBoxContainer from './containers/LoginBoxContainer'\n\nconst packageName = 'sso-login'\n\nconst EXTERNAL_EVENTS = [\n 'loginCompleted'\n]\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <LoginBoxContainer/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/index', () => {\n const reducers = require('./modules').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass SsoLoginApp extends React.Component {\n constructor(props) {\n super(props)\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initApp('id', props, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nSsoLoginApp.propTypes = {\n ssoLoginEndpoint: PropTypes.string.isRequired,\n locale: PropTypes.string,\n autoLogin: PropTypes.bool\n}\n\nexport default SsoLoginApp\n","import styled, {createGlobalStyle} from 'styled-components'\nimport {scale, StyledH1, StyledSpan, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// Overwrite index.html overflow which is hidden\nexport const GlobalBodyStyle = createGlobalStyle`\n @media (max-width: 1024px) {\n body {\n overflow: auto !important;\n }\n }\n`\n\nexport const StyledLogin = styled.div`\n height: 100vh;\n width: 100vw;\n background-image: url(${ToccoLogo});\n background-repeat: no-repeat;\n background-size: 61vw;\n background-position-y: -25vw;\n background-position-x: -41vw;\n\n .tocco-sso-login {\n display: flex;\n justify-content: space-between;\n margin-bottom: 1.8rem;\n }\n\n @media (max-width: 1024px) {\n background-size: 2000px;\n background-position: 50% -1850px;\n }\n\n @media (max-width: 425px) {\n background-position: 50% -1890px;\n }\n`\n\nexport const StyledHeadingLogin = styled(StyledH1)`\n && {\n font-size: ${scale.font(11)};\n }\n`\nexport const StyledSpanLogin = styled(StyledSpan)`\n && {\n text-align: center;\n font-size: ${scale.font(1.3)};\n display: inline-block;\n width: 100%;\n margin: 1rem 0 1.8rem;\n }\n`\n\nexport const StyledLoginWrapper = styled.div`\n max-width: 410px;\n margin: 6% 5% 0 28%;\n\n && {\n .tocco-login * {\n font-size: ${scale.font(1.3)};\n }\n\n @media (max-width: 1024px) {\n margin: 14rem auto 0;\n padding-left: 2rem;\n padding-right: 2rem;\n }\n\n @media (max-width: 425px) {\n margin-top: 12rem;\n }\n }\n`\n\nexport const StyledSloganImg = styled.img`\n transform: rotate(270deg);\n position: relative;\n top: 12.5vw;\n left: -8%;\n width: 25vw;\n\n @media (max-width: 1024px) {\n display: none;\n }\n`\n\nexport const StyledMobileSloganImg = styled.img`\n display: none;\n max-width: 400px;\n width: 95%;\n height: auto;\n position: relative;\n margin: auto;\n top: 45px;\n\n @media (max-width: 1024px) {\n display: block;\n }\n\n @media (max-width: 425px) {\n max-width: 280px;\n }\n`\n\nexport const StyledSsoMsg = styled(StyledSpan)`\n && {\n display: inline-block;\n text-align: center;\n font-weight: ${theme.fontWeight('bold')};\n width: 100%;\n color: ${theme.color('signal.info.text')};\n }\n`\n\nexport const StyledSsoError = styled(StyledSsoMsg)`\n && {\n color: ${theme.color('signal.danger.text')};\n }\n`\n","import React, {useState, useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport ToccoLogin from 'tocco-login/src/main'\nimport SsoLogin from 'tocco-sso-login/src/main'\nimport {FormattedMessage} from 'react-intl'\nimport Cookies from 'js-cookie'\n\nimport ToccoSlogan from '../../assets/tocco_white.svg'\nimport {\n StyledSsoMsg,\n StyledSsoError,\n StyledSpanLogin,\n StyledLogin,\n StyledMobileSloganImg,\n StyledSloganImg,\n StyledLoginWrapper,\n StyledHeadingLogin,\n GlobalBodyStyle\n} from './StyledComponents'\n\nconst Login = ({ssoAvailable, loginSuccessful, checkSsoAvailable}) => {\n const [showError, setShowError] = useState(false)\n const [showRegistrationText, setShowRegistrationText] = useState(false)\n const autoLogin = Cookies.get('sso-autologin')\n\n useEffect(() => {\n checkSsoAvailable()\n }, [])\n\n const loginSuccess = ({timeout}) => {\n loginSuccessful(timeout)\n }\n\n const ssoLoginCompleted = ({successful, provider, registration}) => {\n if (successful) {\n Cookies.set('sso-autologin', provider, {expires: 365})\n loginSuccessful(30)\n } else if (!successful && registration) {\n setShowRegistrationText(true)\n } else {\n setShowError(true)\n }\n }\n\n const SsoLoginPart = () => (\n <>\n <SsoLogin\n ssoLoginEndpoint=\"/sso\"\n loginCompleted={ssoLoginCompleted}\n autoLogin={autoLogin}\n />\n {showRegistrationText\n && <StyledSsoMsg breakWords={true}><FormattedMessage id=\"client.sso-login.registration\"/></StyledSsoMsg>\n }\n {showError\n && <StyledSsoError breakWords={true}><FormattedMessage id=\"client.sso-login.error\"/></StyledSsoError>\n }\n <StyledSpanLogin><FormattedMessage id=\"client.admin.loginChoice\"/></StyledSpanLogin>\n </>\n )\n\n return (\n <>\n <GlobalBodyStyle/>\n <StyledLogin>\n <StyledMobileSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledLoginWrapper>\n <StyledHeadingLogin><FormattedMessage id=\"client.admin.welcomeTitle\"/></StyledHeadingLogin>\n {ssoAvailable && <SsoLoginPart/>}\n <ToccoLogin\n loginSuccess={loginSuccess}\n showTitle={false}\n />\n </StyledLoginWrapper>\n </StyledLogin>\n </>\n\n )\n}\n\nLogin.propTypes = {\n ssoAvailable: PropTypes.bool,\n loginSuccessful: PropTypes.func.isRequired,\n checkSsoAvailable: PropTypes.func.isRequired\n}\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from './Login'\nimport {loginSuccessful, checkSsoAvailable} from '../../modules/session/actions'\n\nconst mapActionCreators = {\n loginSuccessful,\n checkSsoAvailable\n}\n\nconst mapStateToProps = (state, props) => ({\n ssoAvailable: state.session.ssoAvailable\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {m, LazyMotion} from 'framer-motion'\nimport {injectIntl} from 'react-intl'\n\n/**\n * Animated Burger Menu Button\n */\nconst BurgerButton = ({isOpen, size = '20', color, intl}) => {\n const msg = id => intl.formatMessage({id})\n const variant = isOpen ? 'opened' : 'closed'\n const top = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: 45,\n translateY: 2\n }\n }\n const center = {\n closed: {\n opacity: 1\n },\n opened: {\n opacity: 0\n }\n }\n const bottom = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: -45,\n translateY: -2\n }\n }\n const lineProps = {\n stroke: color,\n vectorEffect: 'non-scaling-stroke',\n strokeWidth: 2,\n initial: 'closed',\n animate: variant,\n transition: {ease: 'easeOut', duration: 0.4}\n }\n\n const loadFeatures = () =>\n import('./framerMotionFeatures.js').then(res => res.default)\n\n return (\n <LazyMotion features={loadFeatures}>\n <m.svg\n viewBox=\"0 0 6 6\"\n overflow=\"visible\"\n preserveAspectRatio=\"none\"\n width={size}\n height={size}\n aria-label={msg('client.component.burgerButton.Label')}\n >\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"1\"\n y2=\"1\"\n variants={top}\n {...lineProps}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"3\"\n y2=\"3\"\n variants={center}\n {...lineProps}\n transition={{ease: 'easeOut', duration: 0.1}}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"5\"\n y2=\"5\"\n variants={bottom}\n {...lineProps}\n />\n </m.svg>\n </LazyMotion>\n )\n}\n\nBurgerButton.propTypes = {\n /**\n * Specify width and height.\n */\n size: PropTypes.string,\n /**\n * Color\n */\n color: PropTypes.string,\n /**\n * Specify width and height.\n */\n isOpen: PropTypes.bool,\n intl: PropTypes.object.isRequired\n}\n\nexport default injectIntl(BurgerButton)\n","import styled from 'styled-components'\nimport {declareFont, scale, theme} from 'tocco-ui'\n\nexport const StyledMenuEntry = styled.div`\n ${declareFont()}\n position: relative;\n\n && {\n padding-left: ${({level}) => level * 8}px;\n line-height: ${theme.lineHeight('light')};\n }\n ${({childrenCount}) => childrenCount === 0 && 'margin-bottom: 0 !important'}\n`\n\nexport const StyledMenuEntryWrapper = styled.div`\n margin-bottom: ${scale.space(0.6)};\n\n > div {\n margin-bottom: ${scale.space(1)};\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuEntry} from './StyledComponents'\n\nconst MenuItem = ({\n item,\n menuTreePath = '',\n typeMapping\n}) => {\n const mappedType = typeMapping[item.menuType]\n if (!mappedType) {\n return null\n }\n\n const Component = mappedType.component\n const ChildrenWrapperComponent = mappedType.childrenWrapperComponent\n const MenuItems = item.children?.map(child => (<MenuItem\n key={child.name}\n item={child}\n typeMapping={typeMapping}\n menuTreePath={`${menuTreePath}.${child.name}`}\n />))\n\n return (\n <StyledMenuEntry {...item} childrenCount={item.children?.length || 0} data-cy={`admin-menuitem-${item.name}`}>\n <Component item={item} menuTreePath={menuTreePath} {...mappedType.props}/>\n {MenuItems?.length > 0 && (\n <ChildrenWrapperComponent item={item} menuTreePath={menuTreePath} {...mappedType.props}>\n {MenuItems}\n </ChildrenWrapperComponent>)}\n </StyledMenuEntry>\n )\n}\n\nMenuItem.propTypes = {\n item: PropTypes.shape({\n name: PropTypes.string,\n menuType: PropTypes.string,\n children: PropTypes.array,\n level: PropTypes.number\n }).isRequired,\n menuTreePath: PropTypes.string,\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.elementType.isRequired,\n childrenWrapperComponent: PropTypes.elementType.isRequired,\n filterAttribute: PropTypes.arrayOf(PropTypes.string),\n props: PropTypes.object\n })\n )\n}\n\nexport default MenuItem\n","\nexport const getMenuPreferencesKey = (preferencesPrefix, menuTreePath) =>\n `admintree${preferencesPrefix ? `.${preferencesPrefix}` : ''}.${menuTreePath}.collapsed`\n\n/**\n * Gets flat preferences object for complete menu tree\n * @param {array} items - menu tree items\n * @param {string} preferencesPrefix - prefix for admintree preferences\n * @param {boolean} collapse\n * @returns {object} - flat prefrences object\n */\nexport const getCompleteMenuPreferences = (items, preferencesPrefix, collapse) => {\n if (!items || items.length === 0) {\n return {}\n }\n\n const preferences = items\n .reduce((acc, item) => {\n const {name} = item\n \n const hasChildren = item.children && item.children.length > 0\n const children = getCompleteMenuPreferences(item.children || [],\n `${preferencesPrefix}${preferencesPrefix ? `.${name}` : name}`, collapse)\n\n const key = getMenuPreferencesKey(preferencesPrefix, name)\n return {\n ...acc,\n ...children,\n ...(hasChildren ? {[key]: collapse} : {})\n }\n }, {})\n return preferences\n}\n\n/**\n * Preparing the actual visible menu tree:\n * - Applying the `searchFilter` and removing items which are not matching\n * - When a parent is matching all children get included\n * - When a parent has at least one matching child the parent gets included\n * - Add `level` field on each item\n * - Add `matchingAttribute` field on each item\n * - This includes the name of the field that is matching with the `searchFilter`\n *\n * @param {array} items - available items\n * @param {string} searchFilter - user search input\n * @param {object} typeMapping - menu entry type map configuration\n * @param {number} level - current level of tree (Default: 0)\n * @param {boolean} isParentMatching - true when parent item is matching (Default: false)\n * @returns {array} items - actual visible items for complete menu tree\n */\nexport const prepareMenuTree = (items, searchFilter, typeMapping, level = 0, isParentMatching = false) => {\n const includeInTree = item => !searchFilter\n || item.matchingAttribute\n || item.children?.length > 0\n || isParentMatching\n\n const getMatchingAttribute = (item, filterAttributes) => searchFilter\n ? filterAttributes.find(attr =>\n item[attr] && item[attr].toLowerCase().includes(searchFilter?.toLowerCase())\n )\n : undefined\n\n return items\n .map(item => {\n const mappedType = typeMapping[item.menuType] || {}\n const {filterAttributes = []} = mappedType\n const matchingAttribute = getMatchingAttribute(item, filterAttributes)\n\n const itemMatching = Boolean(matchingAttribute)\n \n const children = prepareMenuTree(item.children || [], searchFilter, typeMapping, level + 1, itemMatching)\n \n return {\n ...item,\n matchingAttribute,\n children,\n level\n }\n })\n .filter(includeInTree)\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuEntryWrapper} from './StyledComponents'\nimport MenuItem from './MenuItem'\nimport {prepareMenuTree} from '../../utils/navigationUtils'\n\nconst MenuTree = ({\n items,\n searchFilter,\n typeMapping,\n requireSearch\n}) => {\n if (requireSearch && !searchFilter) {\n return null\n }\n\n if (!items || items.length === 0) {\n return null\n }\n\n const actualItems = prepareMenuTree(items, searchFilter, typeMapping)\n\n const MenuItems = actualItems.map(item => (\n <MenuItem\n key={item.name}\n item={item}\n typeMapping={typeMapping}\n menuTreePath={item.name}\n />\n ))\n\n return (\n <StyledMenuEntryWrapper>\n {MenuItems}\n </StyledMenuEntryWrapper>\n )\n}\n\nMenuTree.propTypes = {\n items: PropTypes.array,\n searchFilter: PropTypes.string,\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.elementType.isRequired,\n childrenWrapperComponent: PropTypes.elementType.isRequired,\n filterAttribute: PropTypes.arrayOf(PropTypes.string),\n props: PropTypes.object\n })\n ),\n requireSearch: PropTypes.bool\n}\n\nexport default React.memo(MenuTree)\n","import MenuTree from './MenuTree'\n\nexport default MenuTree\n","import styled from 'styled-components'\nimport {Button, theme, StyledScrollbar, scale, StyledSearchBox, Ball} from 'tocco-ui'\n\nconst secondary = theme.color('secondary')\nconst secondaryLight = theme.color('secondaryLight')\n\nexport const StyledNav = styled.nav`\n height: 100%;\n display: flex;\n flex-direction: column;\n\n ${StyledSearchBox} {\n margin: 1.5rem 3rem 1.8rem 1.8rem;\n }\n`\n\nexport const StyledMenuEntry = styled.span`\n display: inline-block;\n color: ${theme.color('text')};\n font-weight: ${theme.fontWeight('bold')};\n margin-bottom: ${scale.space(-1.2)};\n margin-top: ${scale.space(-1.2)};\n`\n\nexport const StyledTabsContainer = styled.div`\n display: flex;\n justify-content: space-evenly;\n align-items: center;\n margin-bottom: 10px;\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n\n &:focus {\n background-color: transparent;\n }\n\n span {\n padding-top: .4rem;\n padding-bottom: .4rem;\n }\n`\n\nexport const StyledNavSwitchButton = styled(Button)`\n font-size: ${scale.font(0)};\n justify-content: center;\n border-radius: 0;\n margin: 12px 5px 5px;\n\n &:hover {\n background-color: transparent;\n color: ${secondaryLight};\n }\n`\n\nexport const StyledNavButton = styled(Button)`\n overflow: hidden;\n flex: ${({narrow}) => narrow ? 0.2 : 1};\n justify-content: center;\n border-radius: 0;\n margin: 5px;\n border-top: 5px solid ${({active}) => active ? secondary : 'transparent'};\n color: ${({active}) => active ? secondary : secondaryLight};\n font-weight: ${theme.fontWeight('bold')};\n\n &:hover {\n border-color: ${({active}) => active ? secondary : secondaryLight};\n background-color: transparent;\n color: ${({active}) => active ? secondary : secondaryLight};\n }\n\n &:focus {\n background-color: transparent;\n }\n\n & > * {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`\n\nexport const StyledSearchBoxWrapper = styled.div`\n height: 50px;\n padding-bottom: ${scale.space(-0.5)};\n`\n\nexport const StyledMenuWrapper = styled.div`\n height: 100%;\n overflow: auto;\n padding: ${scale.space(0.6)} ${scale.space(0.6)} 0 ${scale.space(0.6)};\n ${StyledScrollbar}\n`\n\nexport const StyledMenuButtonsWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n padding: 0;\n`\n\nexport const StyledMenuButton = styled(Ball)`\n font-size: ${scale.font(0)};\n justify-content: center;\n border-radius: 0;\n padding: 0;\n\n &:hover {\n background-color: transparent;\n color: ${secondaryLight};\n }\n`\n","import styled from 'styled-components'\nimport {Link} from 'react-router-dom'\nimport {theme, scale} from 'tocco-ui'\n\nconst secondaryLight = theme.color('secondaryLight')\n\nexport const StyledMenuLink = styled(Link)`\n color: ${theme.color('text')};\n text-decoration: none;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus {\n outline: none;\n font-weight: ${theme.fontWeight('bold')};\n color: ${secondaryLight};\n }\n\n &.active {\n text-decoration: underline;\n }\n`\n\nexport const StyledIconLink = styled(Link)`\n opacity: 0;\n color: ${theme.color('text')};\n text-decoration: none;\n position: relative;\n margin-left: ${scale.space(-1)};\n\n &:hover,\n &:focus {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus {\n opacity: 1;\n outline: none;\n }\n`\n\nexport const StyledMenuLinkWrapper = styled.span`\n display: inline-block;\n padding-top: ${scale.space(-2)};\n padding-bottom: ${scale.space(-2)};\n\n &:hover ${StyledIconLink} {\n opacity: 1;\n }\n`\n\nexport const StyledTogglerIconWrapper = styled.span`\n display: none;\n margin-left: ${scale.space(-1)};\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const StyledMenuEntry = styled.span`\n color: ${theme.color('text')};\n font-weight: ${theme.fontWeight('bold')};\n margin-bottom: ${scale.space(-1.2)};\n margin-top: ${scale.space(-1.2)};\n display: flex;\n\n &:hover {\n ${({onClick}) => onClick ? 'cursor: pointer;' : 'cursor: auto;'}\n\n ${StyledTogglerIconWrapper} {\n display: block;\n }\n }\n`\n\nexport const StyledMenuIconWrapper = styled.span`\n margin-right: ${scale.space(-1.2)};\n`\n\nexport const StyledMenuChildrenWrapper = styled.div`\n display: ${({isOpen}) => isOpen ? 'block' : 'none'};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledMenuEntry, StyledMenuIconWrapper, StyledTogglerIconWrapper} from './StyledComponents'\nimport {getMenuPreferencesKey} from '../../../utils/navigationUtils'\n\nconst MenuEntry = props => {\n const {item, isOpen, canCollapse, preferencesPrefix, menuTreePath, saveUserPreferences} = props\n const {icon, label} = item\n\n const toggleMenyEntryCollapsed = () => {\n saveUserPreferences({[getMenuPreferencesKey(preferencesPrefix, menuTreePath)]: isOpen})\n }\n\n return (\n <StyledMenuEntry\n {...(canCollapse ? {onClick: toggleMenyEntryCollapsed} : {})}\n >\n <span>\n {icon && <StyledMenuIconWrapper><Icon icon={icon}/></StyledMenuIconWrapper>}\n {label}\n </span>\n {canCollapse && (\n <StyledTogglerIconWrapper>\n <Icon\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n onClick={toggleMenyEntryCollapsed}\n />\n </StyledTogglerIconWrapper>)}\n </StyledMenuEntry>\n )\n}\n\nMenuEntry.propTypes = {\n item: PropTypes.shape({\n icon: PropTypes.string,\n label: PropTypes.string,\n name: PropTypes.string\n }).isRequired,\n canCollapse: PropTypes.bool.isRequired,\n saveUserPreferences: PropTypes.func.isRequired,\n menuTreePath: PropTypes.string.isRequired,\n isOpen: PropTypes.bool,\n preferencesPrefix: PropTypes.string\n}\n\nexport default MenuEntry\n","import _get from 'lodash/get'\n\nimport {getMenuPreferencesKey} from '../../utils/navigationUtils'\n\nexport const menuIsOpenPrefrencesSelector = (state, {canCollapse, preferencesPrefix, menuTreePath}) => canCollapse\n ? !_get(state.preferences.userPreferences, getMenuPreferencesKey(preferencesPrefix, menuTreePath), true)\n : undefined\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport MenuEntry from './MenuEntry'\nimport {saveUserPreferences} from '../../../modules/preferences/actions'\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\n\nconst mapActionCreators = {\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n isOpen: menuIsOpenPrefrencesSelector(state, props)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(MenuEntry))\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuChildrenWrapper} from './StyledComponents'\n\nconst MenuChildrenWrapper = ({isOpen, canCollapse, children}) => (\n <StyledMenuChildrenWrapper\n isOpen={!canCollapse || isOpen}\n >\n {children}\n </StyledMenuChildrenWrapper>\n)\n\nMenuChildrenWrapper.propTypes = {\n menuTreePath: PropTypes.string.isRequired,\n canCollapse: PropTypes.bool.isRequired,\n children: PropTypes.any,\n isOpen: PropTypes.bool\n}\n\nexport default MenuChildrenWrapper\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport MenuChildrenWrapper from './MenuChildrenWrapper'\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\n\nconst mapStateToProps = (state, props) => ({\n isOpen: menuIsOpenPrefrencesSelector(state, props)\n})\n\nexport default connect(mapStateToProps)(injectIntl(MenuChildrenWrapper))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst EntityExplorerEntry = ({\n onClick,\n item\n}) => {\n const entityNameDisplay = item.matchingAttribute === 'entity' ? <> ({item.entity})</> : ''\n\n return (\n <StyledMenuLinkWrapper>\n <StyledMenuLink data-quick-navigation={true} onClick={onClick} to={`/e/${item.entity}`}>\n {item.label}{entityNameDisplay}\n </StyledMenuLink>\n <StyledIconLink to={`/e/${item.entity}`} target=\"_blank\" rel=\"noreferrer\">\n <Icon icon=\"external-link\"/>\n </StyledIconLink>\n </StyledMenuLinkWrapper>\n )\n}\n\nEntityExplorerEntry.propTypes = {\n item: PropTypes.shape({\n entity: PropTypes.string,\n label: PropTypes.string,\n matchingAttribute: PropTypes.string\n }),\n onClick: PropTypes.func\n}\n\nexport default EntityExplorerEntry\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst ActionEntry = ({\n onClick,\n item\n}) => (\n <StyledMenuLinkWrapper>\n <StyledMenuLink\n data-quick-navigation={true}\n onClick={onClick}\n to={`/e/action/${item.name}`}>\n {item.label}\n </StyledMenuLink>\n <StyledIconLink to={`/e/action/${item.name}`} target=\"_blank\" rel=\"noreferrer\">\n <Icon icon=\"external-link\"/>\n </StyledIconLink>\n </StyledMenuLinkWrapper>\n)\n\nActionEntry.propTypes = {\n item: PropTypes.shape({\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired\n }).isRequired,\n onClick: PropTypes.func\n}\n\nexport default ActionEntry\n","import React, {useRef, useState, useEffect, useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport SearchBox from 'tocco-ui/src/SearchBox'\n\nimport MenuTree from '../MenuTree'\nimport {\n StyledTabsContainer,\n StyledNav,\n StyledMenuWrapper,\n StyledNavSwitchButton,\n StyledNavButton,\n StyledSearchBoxWrapper,\n StyledMenuButtonsWrapper,\n StyledMenuButton\n} from './StyledComponents'\nimport {ActionEntry, EntityExplorerEntry, MenuEntry, MenuChildrenWrapper} from './menuType'\nimport {getCompleteMenuPreferences} from '../../utils/navigationUtils'\n\nconst tabs = {\n MODULES: 'modules',\n SETTINGS: 'settings',\n SYSTEM: 'system',\n COMPLETE: 'complete'\n}\n\nconst createMenuTypeMap = ({onClick, hasFilterApplied, preferencesPrefix}) => {\n const usePreferences = typeof preferencesPrefix !== 'undefined'\n const canCollapse = !hasFilterApplied && usePreferences\n\n return {\n 'menu': {\n component: MenuEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n filterAttributes: ['label'],\n props: {\n preferencesPrefix,\n canCollapse\n }\n },\n 'entity-explorer': {\n component: EntityExplorerEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n props: {\n onClick,\n preferencesPrefix,\n canCollapse\n },\n filterAttributes: ['label', 'entity']\n },\n 'action': {\n component: ActionEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n props: {\n onClick,\n preferencesPrefix,\n canCollapse\n },\n filterAttributes: ['label']\n }\n }\n}\n\nconst Navigation = ({\n modulesMenuTree,\n settingsMenuTree,\n systemMenuTree,\n completeMenuTree,\n menuOpen,\n onClick,\n activeMenuTab,\n setActiveMenuTab,\n intl,\n setVisibleMenus,\n visibleMenus,\n saveUserPreferences\n}) => {\n const inputEl = useRef(null)\n const navigationEl = useRef(null)\n const [filter, setFilter] = useState('')\n const hasFilterApplied = Boolean(filter)\n const showMenu = !hasFilterApplied && [tabs.MODULES, tabs.SETTINGS].includes(activeMenuTab)\n\n const tabMenuMap = {\n [tabs.MODULES]: {items: modulesMenuTree, preferencesPrefix: ''},\n [tabs.SETTINGS]: {items: settingsMenuTree, preferencesPrefix: 'settings'},\n [tabs.SYSTEM]: {items: systemMenuTree},\n [tabs.COMPLETE]: {items: completeMenuTree}\n }\n\n const modulesTypeMap = useMemo(() =>\n createMenuTypeMap({onClick, hasFilterApplied, preferencesPrefix: tabMenuMap[tabs.MODULES].preferencesPrefix}),\n [onClick, hasFilterApplied])\n const settingsTypeMap = useMemo(() =>\n createMenuTypeMap({onClick, hasFilterApplied, preferencesPrefix: tabMenuMap[tabs.SETTINGS].preferencesPrefix}),\n [onClick, hasFilterApplied])\n const systemTypeMap = useMemo(() =>\n createMenuTypeMap({onClick, hasFilterApplied}),\n [onClick, hasFilterApplied])\n const completeTypeMap = useMemo(() =>\n createMenuTypeMap({onClick, hasFilterApplied}),\n [onClick, hasFilterApplied])\n\n useEffect(() => {\n if (menuOpen) {\n if (!activeMenuTab) {\n setActiveMenuTab(tabs.MODULES)\n }\n inputEl.current.select()\n inputEl.current.focus()\n }\n }, [menuOpen])\n\n const msg = id => intl.formatMessage({id})\n\n const handleCursorNavigation = key => {\n const focusableElements = navigationEl.current.querySelectorAll('a[data-quick-navigation=\"true\"], input')\n const currentIdx = [...focusableElements].findIndex(el => document.activeElement.isEqualNode(el))\n\n if (currentIdx > -1) {\n const indexDiff = key === 'ArrowDown' ? 1 : focusableElements.length - 1\n const targetIdx = (currentIdx + indexDiff) % focusableElements.length\n focusableElements[targetIdx].focus()\n }\n }\n\n const onKeyDown = e => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n handleCursorNavigation(e.key)\n }\n }\n\n const handleExpandAll = () => {\n const {items, preferencesPrefix} = tabMenuMap[activeMenuTab] || {}\n if (items && typeof preferencesPrefix !== 'undefined') {\n const preferences = getCompleteMenuPreferences(items, preferencesPrefix, false)\n saveUserPreferences(preferences)\n }\n }\n\n const handleCollapseAll = () => {\n const {items, preferencesPrefix} = tabMenuMap[activeMenuTab] || {}\n if (items && typeof preferencesPrefix !== 'undefined') {\n const preferences = getCompleteMenuPreferences(items, preferencesPrefix, true)\n saveUserPreferences(preferences)\n }\n }\n\n const setFocusToSerachInput = () => {\n if (inputEl.current) {\n inputEl.current.focus()\n }\n }\n\n const changeMenuTab = tab => {\n setActiveMenuTab(tab)\n setFocusToSerachInput()\n }\n\n return (\n <StyledNav ref={navigationEl} onKeyDown={onKeyDown} data-cy=\"admin-nav\">\n <StyledTabsContainer>\n {visibleMenus === 'main'\n && <>\n <StyledNavSwitchButton\n active={false}\n onClick={() => {\n setVisibleMenus('additional')\n changeMenuTab(tabs.COMPLETE)\n }}\n icon={'chevron-right'}\n narrow={true}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.MODULES}\n onClick={() => changeMenuTab(tabs.MODULES)}\n label={msg('client.admin.navigation.modules')}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.SETTINGS}\n onClick={() => changeMenuTab(tabs.SETTINGS)}\n label={msg('client.admin.navigation.settings')}\n />\n </>}\n {visibleMenus === 'additional'\n && <>\n <StyledNavSwitchButton\n active={false}\n onClick={() => {\n setVisibleMenus('main')\n changeMenuTab(tabs.MODULES)\n }}\n icon={'chevron-left'}\n narrow={true}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.SYSTEM}\n onClick={() => changeMenuTab(tabs.SYSTEM)}\n label={msg('client.admin.navigation.system')}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.COMPLETE}\n onClick={() => changeMenuTab(tabs.COMPLETE)}\n label={msg('client.admin.navigation.complete')}\n />\n </>}\n </StyledTabsContainer>\n <StyledSearchBoxWrapper>\n <SearchBox\n minInputLength={2}\n onSearch={setFilter}\n ref={inputEl}\n placeholder={msg('client.admin.navigation.searchBoxPlaceHolder')}\n aria-label={msg('client.admin.navigation.searchBoxPlaceHolder')}\n />\n </StyledSearchBoxWrapper>\n <StyledMenuWrapper>\n {showMenu && <StyledMenuButtonsWrapper>\n <StyledMenuButton\n icon=\"chevron-double-down\"\n type=\"button\"\n onClick={handleExpandAll}\n title={msg('client.admin.navigation.expandAll')}\n />\n <StyledMenuButton\n icon=\"chevron-double-up\"\n type=\"button\"\n onClick={handleCollapseAll}\n title={msg('client.admin.navigation.collapseAll')}\n />\n </StyledMenuButtonsWrapper>}\n\n {activeMenuTab === tabs.MODULES\n && <MenuTree items={modulesMenuTree} searchFilter={filter} typeMapping={modulesTypeMap}/>}\n {activeMenuTab === tabs.SETTINGS\n && <MenuTree items={settingsMenuTree} searchFilter={filter} typeMapping={settingsTypeMap}/>}\n {activeMenuTab === tabs.SYSTEM\n && <MenuTree items={systemMenuTree} searchFilter={filter} typeMapping={systemTypeMap}/>}\n {activeMenuTab === tabs.COMPLETE\n && <MenuTree items={completeMenuTree} searchFilter={filter}\n typeMapping={completeTypeMap} requireSearch={true}/>}\n </StyledMenuWrapper>\n </StyledNav>\n )\n}\n\nNavigation.propTypes = {\n intl: PropTypes.object.isRequired,\n activeMenuTab: PropTypes.string.isRequired,\n settingsMenuTree: PropTypes.array,\n modulesMenuTree: PropTypes.array,\n systemMenuTree: PropTypes.array,\n completeMenuTree: PropTypes.array,\n onClick: PropTypes.func,\n setActiveMenuTab: PropTypes.func,\n saveUserPreferences: PropTypes.func,\n menuOpen: PropTypes.bool,\n visibleMenus: PropTypes.string,\n setVisibleMenus: PropTypes.func\n}\n\nexport default Navigation\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Navigation from './Navigation'\nimport {saveUserPreferences} from '../../modules/preferences/actions'\nimport {setActiveMenuTab, setVisibleMenus} from '../../modules/navigation/actions'\nconst mapActionCreators = {\n setActiveMenuTab,\n setVisibleMenus,\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n settingsMenuTree: state.navigation.settingsMenuTree,\n modulesMenuTree: state.navigation.modulesMenuTree,\n systemMenuTree: state.navigation.systemMenuTree,\n completeMenuTree: state.navigation.completeMenuTree,\n menuOpen: state.navigation.menuOpen,\n activeMenuTab: state.navigation.activeMenuTab,\n visibleMenus: state.navigation.visibleMenus\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Navigation))\n","import NavigationContainer from './NavigationContainer'\n\nexport default NavigationContainer\n","export const LOAD_DASHBOARD = 'dashboard/LOAD_DASHBOARD'\nexport const SET_DASHBOARD = 'dashboard/SET_DASHBOARD'\nexport const SAVE_INFOBOX_POSITIONS = 'dashboard/SAVE_INFOBOX_POSITIONS'\nexport const SAVE_INFOBOX_HEIGHT = 'dashboard/SAVE_INFOBOX_HEIGHT'\nexport const DISPLAY_INFOBOX_SETTINGS_MODAL = 'dashboard/DISPLAY_INFOBOX_SETTINGS_MODAL'\nexport const RESET_INFOBOX_SETTINGS = 'dashboard/RESET_INFOBOX_SETTINGS'\n\nexport const loadDashboard = () => ({\n type: LOAD_DASHBOARD\n})\n\nexport const setDashboard = infoBoxes => ({\n type: SET_DASHBOARD,\n payload: {\n infoBoxes\n }\n})\n\nexport const saveInfoBoxPositions = infoBoxes => ({\n type: SAVE_INFOBOX_POSITIONS,\n payload: {\n infoBoxes\n }\n})\n\nexport const saveInfoBoxHeight = (id, height) => ({\n type: SAVE_INFOBOX_HEIGHT,\n payload: {\n id,\n height\n }\n})\n\nexport const displayInfoBoxSettings = () => ({\n type: DISPLAY_INFOBOX_SETTINGS_MODAL\n})\n\nexport const resetInfoBoxSettings = () => ({\n type: RESET_INFOBOX_SETTINGS\n})\n","import styled from 'styled-components'\nimport {scale, StyledScrollbar, shadeColor, theme} from 'tocco-ui'\nimport _get from 'lodash/get'\n\nexport const StyledDashboardWrapper = styled.div`\n width: 100%;\n height: 100%;\n background: ${theme.color('paper')};\n padding: ${scale.space(-0.5)};\n overflow: auto;\n ${StyledScrollbar}\n box-sizing: border-box;\n`\n\nexport const StyledColumnWrapper = styled.div`\n display: flex;\n flex-wrap: nowrap;\n`\n\nexport const StyledColumn = styled.div`\n width: 50%;\n display: flex;\n flex-wrap: wrap;\n align-content: flex-start;\n position: relative;\n`\n\nexport const StyledInfoBoxWrapper = styled.div`\n position: relative;\n width: 100%;\n margin: ${scale.space(-0.5)};\n`\n\nexport const StyledResizeHandle = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2;\n background: ${({theme}) => shadeColor(_get(theme, 'colors.paper'), 3)};\n opacity: ${({isReszing}) => isReszing ? 1 : 0};\n height: 3px;\n cursor: row-resize;\n`\n","\nconst DropTypes = {\n Column: 'Column',\n InfoBox: 'InfoBox'\n}\n\nexport default DropTypes\n","\nexport const InfoBoxRenderTypes = {\n InfoBox: 'InfoBox',\n DropPreview: 'DropPreview'\n}\n","import {flow, curry} from 'lodash'\nimport {dragAndDrop} from 'tocco-util'\n\nimport DropTypes from './dropTypes'\nimport {InfoBoxRenderTypes} from './infoBoxTypes'\n\nexport const sortInfoBoxes = boxes => boxes.sort((a, b) => {\n if (a.col === b.col) {\n return a.row - b.row\n }\n return a.col - b.col\n})\n\nconst reindex = curry(sortedBoxes => {\n return sortedBoxes\n .reduce(({index, boxes}, box) => {\n const nextIndex = typeof index[box.col] === 'number' ? index[box.col] + 1 : 0\n const acc = {\n boxes: [\n ...boxes,\n {...box, row: nextIndex}\n ],\n index: {\n ...index,\n [box.col]: nextIndex\n }\n }\n return acc\n }, {index: {}, boxes: []}).boxes\n})\n\nconst insertDraggedAtDropped = curry((draggingId, dragOverId, position, sortedBoxes) => {\n const dragOverColumn = sortedBoxes.find(b => b.id === dragOverId)?.col\n const draggingBox = sortedBoxes.find(b => b.id === draggingId)\n return reindex(sortedBoxes\n .reduce((boxes, box) => {\n const moveBoxHere = box.id === dragOverId\n const isDraggingBox = box.id === draggingId\n if (isDraggingBox) {\n // filter out dragging box from the old place\n return boxes\n }\n\n return [\n ...boxes,\n ...(position === dragAndDrop.DropPosition.Top && moveBoxHere\n ? [{...draggingBox, col: dragOverColumn, row: -1}]\n : []),\n box,\n ...(position === dragAndDrop.DropPosition.Bottom && moveBoxHere\n ? [{...draggingBox, col: dragOverColumn, row: -1}]\n : [])\n ]\n }, [])\n )\n})\n\nexport const moveDraggedToDropped = (draggingId, dragOverId, position, boxes) => flow([\n sortInfoBoxes,\n insertDraggedAtDropped(draggingId, dragOverId, position)])(boxes)\n\nexport const appendDraggedAsLastItemToDropped = (draggingId, dragOverId, boxes) => {\n const draggingBox = boxes.find(b => b.id === draggingId)\n return reindex([\n ...sortInfoBoxes(boxes).filter(({id}) => id !== draggingId),\n {...draggingBox, col: dragOverId, row: -1}\n ])\n}\n\nexport const getRenderInfoBoxesForColumn = (draggingId, currentlyDragOver, position, column, boxes) => {\n const {type: dragOverType, id: dragOverId} = currentlyDragOver || {}\n const isOverItself = dragOverId === draggingId && dragOverType === DropTypes.InfoBox\n const draggingBox = boxes.find(b => b.id === draggingId)\n const draggingPreviewBox = {...draggingBox, type: InfoBoxRenderTypes.DropPreview}\n\n let renderBoxes = boxes\n .filter(({folded, col, id}) => !folded\n && col === column\n && ((typeof dragOverId !== 'undefined' && !isOverItself)\n ? id !== draggingId\n : true))\n .map(box => ({...box, type: InfoBoxRenderTypes.InfoBox}))\n .reduce((acc, key) => {\n const showPreviewHere = key.id === dragOverId && dragOverType === DropTypes.InfoBox && !isOverItself\n return [\n ...acc,\n ...(position === dragAndDrop.DropPosition.Top && showPreviewHere\n ? [draggingPreviewBox]\n : []),\n (key.id === draggingId && isOverItself) ? {...key, type: InfoBoxRenderTypes.DropPreview} : key,\n ...(position === dragAndDrop.DropPosition.Bottom && showPreviewHere\n ? [draggingPreviewBox]\n : [])\n ]\n }, [])\n \n if (dragOverType === DropTypes.Column && dragOverId === column) {\n renderBoxes = [...renderBoxes, draggingPreviewBox]\n }\n\n return renderBoxes\n}\n","import styled from 'styled-components'\n\nexport const StyledMenuWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {BallMenu, MenuItem} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledMenuWrapper} from './StyledComponents'\n\nconst Menu = ({displayInfoBoxSettings, resetInfoBoxSettings}) => (\n <StyledMenuWrapper>\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem onClick={displayInfoBoxSettings}>\n <FormattedMessage id=\"client.dashboard.preferences.show\"/>\n </MenuItem>\n <MenuItem onClick={resetInfoBoxSettings}>\n <FormattedMessage id=\"client.dashboard.preferences.reset\"/>\n </MenuItem>\n </BallMenu>\n </StyledMenuWrapper>\n)\n\nMenu.propTypes = {\n displayInfoBoxSettings: PropTypes.func.isRequired,\n resetInfoBoxSettings: PropTypes.func.isRequired\n}\n\nexport default Menu\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Menu from './Menu'\nimport {displayInfoBoxSettings, resetInfoBoxSettings} from '../../modules/dashboard/actions'\n\nconst mapActionCreators = {\n displayInfoBoxSettings,\n resetInfoBoxSettings\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(Menu))\n","export const NUMBER_OF_COLUMNS = 2\n","import styled from 'styled-components'\nimport {colorizeBorder, scale, theme} from 'tocco-ui'\n\nconst minHeight = '50px'\n\nexport const StyledInfoBoxWrapper = styled.div`\n box-sizing: border-box;\n border: 1px solid ${colorizeBorder.shade1};\n height: ${({height}) => height ? `${height}px` : 'auto'};\n min-height: ${minHeight};\n padding: ${scale.space(-0.5)};\n background: ${theme.color('paper')};\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n /**\n * Workaround:\n * so that ghost-image on drag and drop is taken correctly\n * when having an absolute position element inside the InfoBox (e.g. entity-list)\n */\n position: relative;\n z-index: 1;\n`\n\nexport const StyledDroppedPreview = styled.div`\n border: 2px dashed ${theme.color('primary')};\n box-sizing: border-box;\n height: ${({height}) => `${height}px`};\n min-height: ${minHeight};\n width: 100%;\n padding: ${scale.space(-0.5)};\n margin: ${scale.space(-0.5)};\n background: ${theme.color('paper')};\n`\n","import styled from 'styled-components'\nimport {StyledScrollbar} from 'tocco-ui'\n\nexport const StyledInfoBoxContentWrapper = styled.div`\n flex: 1;\n ${({scrollable}) => scrollable && 'overflow: auto;'}\n ${StyledScrollbar}\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedValue} from 'tocco-ui'\n\nimport {StyledInfoBoxContentWrapper} from './StyledComponents'\n\nconst InfoBoxHtmlFieldContent = ({content}) => {\n const {text} = content\n return (\n <StyledInfoBoxContentWrapper scrollable>\n <FormattedValue type=\"html\" value={text}/>\n </StyledInfoBoxContentWrapper>\n )\n}\n\nInfoBoxHtmlFieldContent.propTypes = {\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBoxHtmlFieldContent\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport EntityListApp from 'tocco-entity-list/src/main'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {StyledInfoBoxContentWrapper} from './StyledComponents'\n\nconst DetailLinkRelativeWithoutIntl = ({entityKey, entityModel, children, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledLink\n aria-label={msg('client.component.navigationStrategy.detailLinkRelative')}\n to={`/e/${entityModel}/${entityKey}`}>\n {children}\n </StyledLink>\n )\n}\n\nconst DetailLinkRelative = injectIntl(DetailLinkRelativeWithoutIntl)\n\nDetailLinkRelativeWithoutIntl.propTypes = {\n entityKey: PropTypes.string.isRequired,\n entityModel: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nconst InfoBoxSearchFilterContent = ({id, content, navigationStrategy, emitAction}) => {\n const {searchfilter, entityName, scope, limit} = content\n\n const handleRowClick = ({id}) => {\n navigationStrategy.openDetail(entityName, id, false)\n }\n\n return <StyledInfoBoxContentWrapper>\n <EntityListApp\n id={id}\n limit={limit}\n entityName={entityName}\n formName={entityName}\n searchFilters={[searchfilter]}\n scope={scope}\n showActions={false}\n onRowClick={handleRowClick}\n searchFormType=\"simple\"\n searchFormPosition=\"top\"\n selectionStyle=\"none\"\n sortable\n disableSelectionController\n emitAction={emitAction}\n navigationStrategy={{...navigationStrategy, DetailLinkRelative}}\n showLink={true}\n />\n </StyledInfoBoxContentWrapper>\n}\n\nInfoBoxSearchFilterContent.propTypes = {\n id: PropTypes.string.isRequired,\n content: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.object\n}\n\nexport default InfoBoxSearchFilterContent\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport InfoBoxSearchFilterContent from './InfoBoxSearchFilterContent'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nconst mapStateToProps = state => ({\n navigationStrategy: state.input.navigationStrategy\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(InfoBoxSearchFilterContent))\n","import React from 'react'\nimport {consoleLogger} from 'tocco-util'\n\nimport InfoBoxHtmlFieldContent from './typeContent/InfoBoxHtmlFieldContent'\nimport InfoBoxSearchFilterContentContainer from './typeContent/InfoBoxSearchFilterContentContainer'\n\nexport default (type, id, content) => {\n if (map[type]) {\n return React.createElement(map[type], {id, content})\n }\n\n consoleLogger.logError('No Content mapper defined for type', type, id)\n return <div/>\n}\n\nexport const map = {\n htmlfield: InfoBoxHtmlFieldContent,\n searchfilter: InfoBoxSearchFilterContentContainer\n}\n","import PropTypes from 'prop-types'\n\nimport provider from './typeContentProvider'\n\nconst InfoBoxContent = ({id, content}) => {\n if (!content) {\n return null\n }\n\n const {type} = content\n return provider(type, id, content)\n}\n\nInfoBoxContent.propTypes = {\n id: PropTypes.string.isRequired,\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBoxContent\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography} from 'tocco-ui'\n\nimport {StyledInfoBoxWrapper} from './StyledComponents'\nimport InfoBoxContent from './InfoBoxContent'\n\nconst InfoBox = ({id, label, height, content, ...props}) => (\n <StyledInfoBoxWrapper {...props} height={height}>\n <Typography.H3>{label}</Typography.H3>\n <InfoBoxContent id={id} content={content}/>\n </StyledInfoBoxWrapper>\n)\n\nInfoBox.propTypes = {\n id: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n height: PropTypes.number.isRequired,\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBox\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledInfoBoxWrapper, StyledResizeHandle} from './StyledComponents'\nimport InfoBox from '../InfoBox/InfoBox'\n\nconst DashboardInfoBox = ({\n infoBox,\n isResizing,\n startResize,\n onDragStart,\n onDragEnter,\n onDragOver,\n onDrop\n}) => {\n const {id, type, label, height, content} = infoBox\n return (\n <StyledInfoBoxWrapper key={`${type}-${id}`} id={`infobox-${id}`}>\n <InfoBox\n id={id}\n label={label}\n height={height}\n content={content}\n draggable\n onDragStart={onDragStart}\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n />\n <StyledResizeHandle\n onMouseDown={startResize}\n isReszing={isResizing}\n />\n </StyledInfoBoxWrapper>\n )\n}\n\nDashboardInfoBox.propTypes = {\n infoBox: PropTypes.object.isRequired,\n isResizing: PropTypes.bool.isRequired,\n startResize: PropTypes.func.isRequired,\n onDragStart: PropTypes.func,\n onDragEnter: PropTypes.func,\n onDragOver: PropTypes.func,\n onDrop: PropTypes.func\n}\n\nexport default DashboardInfoBox\n","import React from 'react'\n\nimport {StyledDroppedPreview} from './StyledComponents'\n\nconst DropPreview = props => <StyledDroppedPreview {...props}/>\n\nexport default DropPreview\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledColumn} from './StyledComponents'\nimport DashboardInfoBox from './DashboardInfoBox'\nimport {InfoBoxRenderTypes} from '../../utils/infoBoxTypes'\nimport DropPreview from '../InfoBox/DropPreview'\nimport DropTypes from '../../utils/dropTypes'\n\nconst DashboardColumn = ({\n onDragEnter,\n onDragOver,\n onDrop,\n infoBoxes,\n resizeState,\n startResize,\n dndState,\n makeDndEvents\n}) => {\n const {currentlyDragOver} = dndState\n const {isResizing, resizingElement} = resizeState\n\n return (\n <StyledColumn\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n >\n {infoBoxes.map(infoBox => {\n const {id, height, type} = infoBox\n if (type === InfoBoxRenderTypes.DropPreview) {\n return <DropPreview\n key={`${type}-${id}`}\n height={height}\n {...makeDndEvents(currentlyDragOver)}\n />\n }\n \n return <DashboardInfoBox\n key={`${type}-${id}`}\n id={`infobox-${id}`}\n infoBox={infoBox}\n isResizing={isResizing && resizingElement === id}\n {...makeDndEvents({type: DropTypes.InfoBox, id})}\n startResize={startResize(id)}\n />\n })}\n </StyledColumn>\n )\n}\n\nDashboardColumn.propTypes = {\n infoBoxes: PropTypes.array.isRequired,\n onDragEnter: PropTypes.func,\n onDragOver: PropTypes.func,\n onDrop: PropTypes.func,\n resizeState: PropTypes.object.isRequired,\n dndState: PropTypes.object.isRequired,\n makeDndEvents: PropTypes.func.isRequired,\n startResize: PropTypes.func.isRequired\n}\n\nexport default DashboardColumn\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {dragAndDrop, resize} from 'tocco-util'\n\nimport {\n StyledDashboardWrapper,\n StyledColumnWrapper\n} from './StyledComponents'\nimport DropTypes from '../../utils/dropTypes'\nimport {\n appendDraggedAsLastItemToDropped,\n getRenderInfoBoxesForColumn,\n moveDraggedToDropped\n} from '../../utils/dashboardUtils'\nimport Menu from '../Menu/MenuContainer'\nimport {NUMBER_OF_COLUMNS} from '../../utils/constants'\nimport DashboardColumn from './DashboardColumn'\n\nconst Dashboard = ({infoBoxes: storedInfoBoxes, saveInfoBoxHeight, saveInfoBoxPositions}) => {\n // save infoBoxes in local state to show drag and drop and resize immediately to the user\n const [infoBoxes, setInfoBoxes] = useState(storedInfoBoxes)\n useEffect(() => {\n setInfoBoxes(storedInfoBoxes)\n }, [storedInfoBoxes])\n\n const columns = [...Array(NUMBER_OF_COLUMNS).keys()]\n\n const ref = useRef(null)\n const selector = id => ref.current.querySelector(`#infobox-${id}`)\n const onInfoBoxHeightChanged = useCallback(id => {\n const finalHeight = infoBoxes.find(c => c.id === id)?.height\n saveInfoBoxHeight(id, finalHeight)\n }, [infoBoxes])\n\n const onInfoBoxHeightChanging = useCallback((id, {height}) => {\n setInfoBoxes(infoBoxes => [...infoBoxes.map(c => c.id === id\n ? {\n ...c,\n height\n }\n : c)])\n }, [])\n\n const {\n startResize,\n resizingEvents,\n resizeState\n } = resize.useResize(selector, onInfoBoxHeightChanging, onInfoBoxHeightChanged)\n\n const changeInfoBoxPosition = (currentlyDragging, currentlyDragOver, position) => {\n const {id: draggingId} = currentlyDragging\n const {type: dragOverType, id: dragOverId} = currentlyDragOver\n if (dragOverType === DropTypes.Column) {\n const updatedInfoBoxes = appendDraggedAsLastItemToDropped(draggingId, dragOverId, infoBoxes)\n setInfoBoxes(updatedInfoBoxes)\n saveInfoBoxPositions(updatedInfoBoxes)\n } else if (draggingId !== dragOverId) {\n const updatedInfoBoxes = moveDraggedToDropped(draggingId, dragOverId, position, infoBoxes)\n setInfoBoxes(updatedInfoBoxes)\n saveInfoBoxPositions(updatedInfoBoxes)\n }\n }\n const {dndEvents, dndState} = dragAndDrop.useDnD(changeInfoBoxPosition, infoBoxes)\n const {currentlyDragOver, currentlyDragging, dropPosition} = dndState\n\n const {id: draggingId} = currentlyDragging || {}\n\n return (\n <StyledDashboardWrapper ref={ref} {...resizingEvents}>\n <Menu/>\n <StyledColumnWrapper>\n {columns.map(column => {\n const {onDragEnter, onDragOver, onDrop} = dndEvents({type: DropTypes.Column, id: column})\n const boxes = getRenderInfoBoxesForColumn(draggingId, currentlyDragOver, dropPosition, column, infoBoxes)\n\n return (\n <DashboardColumn\n key={column}\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n infoBoxes={boxes}\n resizeState={resizeState}\n startResize={startResize}\n dndState={dndState}\n makeDndEvents={dndEvents}\n />\n )\n })}\n </StyledColumnWrapper>\n </StyledDashboardWrapper>\n )\n}\n\nDashboard.propTypes = {\n infoBoxes: PropTypes.array.isRequired,\n saveInfoBoxPositions: PropTypes.func.isRequired,\n saveInfoBoxHeight: PropTypes.func.isRequired\n}\n\nexport default Dashboard\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {saveInfoBoxHeight, saveInfoBoxPositions} from '../../modules/dashboard/actions'\nimport Dashboard from './Dashboard'\n\nconst mapActionCreators = {\n saveInfoBoxPositions,\n saveInfoBoxHeight\n}\n\nconst mapStateToProps = state => ({\n infoBoxes: state.dashboard.infoBoxes\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Dashboard))\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_DASHBOARD]: reducerUtil.singleTransferReducer('infoBoxes')\n}\n\nconst initialState = {\n infoBoxes: []\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import styled from 'styled-components'\nimport {scale, StyledButton, theme} from 'tocco-ui'\nimport {StyledLabel} from 'tocco-ui/src/Typography'\n\nexport const StyledButtonWrapper = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n\nexport const StyledUl = styled.ul`\n list-style-type: none;\n margin-top: ${scale.space(-0.5)};\n padding-left: ${scale.space(-0.5)};\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n\n ${StyledLabel} {\n padding: 0;\n }\n`\n\nexport const StyledCheckbox = styled.input`\n vertical-align: top;\n margin-right: ${scale.space(-1)};\n\n &:hover {\n cursor: pointer;\n }\n`\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper, StyledCheckbox, StyledUl} from './StyledComponents'\n\nconst InfoBoxSettings = ({initialInfoBoxes, onOk}) => {\n const [infoBoxes, setInfoBoxes] = useState(initialInfoBoxes || [])\n \n const toggle = id => {\n setInfoBoxes(boxes => boxes.reduce((acc, box) => [\n ...acc,\n {...box, folded: box.id === id ? !box.folded : box.folded}\n ], []))\n }\n\n return (\n <div>\n <StyledUl>{infoBoxes.map(box => (\n <Typography.Li key={box.id}>\n <StyledCheckbox\n type=\"checkbox\"\n checked={!box.folded}\n onChange={() => toggle(box.id)}\n id={box.id}\n />\n <Typography.Label for={box.id}>{box.label}</Typography.Label>\n </Typography.Li>))}\n </StyledUl>\n <StyledButtonWrapper>\n <Button type=\"button\" onClick={() => onOk(infoBoxes)} look=\"raised\">\n <FormattedMessage id=\"client.common.ok\"/>\n </Button>\n </StyledButtonWrapper>\n </div>\n )\n}\n\nInfoBoxSettings.propTypes = {\n initialInfoBoxes: PropTypes.array,\n onOk: PropTypes.func\n}\n\nexport default InfoBoxSettings\n","import {NUMBER_OF_COLUMNS} from './constants'\nimport {sortInfoBoxes} from './dashboardUtils'\n\n/**\n * Maps posititon string to col and row object with both 0-based index\n *\n * @param position {String}: has the format \"column:row\" with column 1-based and row 0-based index\n */\nexport const mapPositionToColAndRow = position => {\n if (!position) {\n return {col: 0, row: 0}\n }\n \n const split = position.split(':')\n const col = parseInt(split[0], 10) - 1\n const row = parseInt(split[1], 10)\n return {col: Math.max(0, col), row}\n}\n\n/**\n * Maps row and col to posititon string with format \"column:row\"\n *\n * @param row {number}\n * @param col {number}\n */\nexport const mapColAndRowToPosition = (col, row) => `${col + 1}:${row}`\n\nconst isUnpositionedInfoBox = box => box.position === null\n\nconst getColumnWithMinAmountOfInfoBoxes = infoBoxes => {\n const columns = [...Array(NUMBER_OF_COLUMNS).keys()]\n\n const numberOfBoxesPerCol = columns.reduce((acc, col) => ({\n ...acc,\n [col]: infoBoxes.filter(b => b.col === col).length\n }), {})\n\n const minCol = Object.keys(numberOfBoxesPerCol).reduce(\n (min, key) => {\n const col = parseInt(key, 10)\n return numberOfBoxesPerCol[col] < min.numberOfBoxes ? {col, numberOfBoxes: numberOfBoxesPerCol[col]} : min\n },\n {col: -1, numberOfBoxes: Number.MAX_VALUE})\n \n return minCol.col === -1 ? {col: 0, numberOfBoxes: 0} : minCol\n}\n\nconst distributeInfoBoxes = infoBoxes => {\n const unpositionedInfoBoxes = infoBoxes.filter(isUnpositionedInfoBox)\n const positionedInfoBoxes = infoBoxes.filter(box => !isUnpositionedInfoBox(box))\n return unpositionedInfoBoxes\n .reduce((acc, box) => {\n const {col, numberOfBoxes} = getColumnWithMinAmountOfInfoBoxes(acc)\n return [\n ...acc,\n {...box, col, row: numberOfBoxes}\n ]\n }, positionedInfoBoxes)\n}\n\n/**\n * Sorts and distributes infoBoxes from the backend response to be usable in the client.\n * @param infoBoxes\n * @returns sorted infoBoxes with `col` and `row` fields\n */\nexport const prepareInfoBoxes = infoBoxes => sortInfoBoxes(distributeInfoBoxes(infoBoxes\n .map(box => ({...box, ...mapPositionToColAndRow(box.position)}))))\n","import React from 'react'\nimport {put, call, all, take, takeLatest, takeEvery, select} from 'redux-saga/effects'\nimport {rest, notification} from 'tocco-app-extensions'\nimport {channel} from 'redux-saga'\n\nimport * as actions from './actions'\nimport InfoBoxSettings from '../../components/InfoBoxSettings/InfoBoxSettings'\nimport {mapColAndRowToPosition, prepareInfoBoxes} from '../../utils/positionUtils'\n\nexport const dashboardSelector = state => state.dashboard\n\nexport default function* sagas() {\n yield all([\n call(loadDashboard),\n takeLatest(actions.LOAD_DASHBOARD, loadDashboard),\n takeLatest(actions.SAVE_INFOBOX_POSITIONS, saveInfoBoxPositions),\n takeLatest(actions.SAVE_INFOBOX_HEIGHT, saveInfoBoxHeight),\n takeEvery(actions.DISPLAY_INFOBOX_SETTINGS_MODAL, displayInfoBoxSettings),\n takeEvery(actions.RESET_INFOBOX_SETTINGS, resetInfoBoxSettings)\n ])\n}\n\nexport function* loadDashboard() {\n const options = {\n method: 'GET'\n }\n const response = yield call(rest.requestSaga, 'client/dashboard', options)\n const infoBoxes = response.body.infoboxes\n yield put(actions.setDashboard(prepareInfoBoxes(infoBoxes)))\n return infoBoxes\n}\n\nexport function* saveInfoBoxPositions({payload: {infoBoxes}}) {\n const updatedInfoBoxes = infoBoxes.map(box => ({...box, position: mapColAndRowToPosition(box.col, box.row)}))\n const preferences = updatedInfoBoxes.reduce((acc, box) => ({\n ...acc,\n [`${box.id}:POSITION`]: box.position\n }), {})\n yield call(saveInfoBoxPreferences, preferences)\n \n yield put(actions.setDashboard(updatedInfoBoxes))\n return updatedInfoBoxes\n}\n\nexport function* saveInfoBoxHeight({payload: {id, height}}) {\n const {infoBoxes} = yield select(dashboardSelector)\n const updatedInfoBoxes = infoBoxes.map(box => ({...box, height: box.id === id ? height : box.height}))\n const preferences = {\n [`${id}:HEIGHT`]: height\n }\n yield call(saveInfoBoxPreferences, preferences)\n \n yield put(actions.setDashboard(updatedInfoBoxes))\n return updatedInfoBoxes\n}\n\nexport function* displayInfoBoxSettings() {\n const {infoBoxes} = yield select(dashboardSelector)\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'dashboard-infobox-settings',\n 'client.dashboard.preferences.show.title',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <InfoBoxSettings initialInfoBoxes={infoBoxes} onOk={onOk}/>\n },\n true\n ))\n\n yield call(saveInfoBoxSettings, answerChannel)\n}\n\nfunction* saveInfoBoxSettings(answerChannel) {\n const infoBoxes = yield take(answerChannel)\n\n const preferences = infoBoxes.reduce((acc, box) => ({\n ...acc,\n [`${box.id}:STATUS`]: box.folded ? 'folded' : 'open'\n }), {})\n yield call(saveInfoBoxPreferences, preferences)\n\n yield put(actions.setDashboard(infoBoxes))\n return infoBoxes\n}\n\nexport function* resetInfoBoxSettings() {\n yield all([\n call(rest.deleteUserPreferences, '*:HEIGHT'),\n call(rest.deleteUserPreferences, '*:POSITION'),\n call(rest.deleteUserPreferences, '*:STATUS')\n ])\n yield call(loadDashboard)\n}\n\nfunction* saveInfoBoxPreferences(preferences) {\n yield call(rest.savePreferences, preferences, '/nice2/ui/settings/infoboxes')\n}\n","import dashboardReducer, {sagas as dashboardSagas} from './dashboard'\n\nexport default {\n dashboard: dashboardReducer\n}\n\nexport const sagas = [\n dashboardSagas\n]\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, notification, actionEmitter} from 'tocco-app-extensions'\n\nimport DashboardContainer from './components/Dashboard/DashboardContainer'\nimport reducers, {sagas} from './modules/reducers'\n\nconst packageName = 'dashboard'\n\nconst EXTERNAL_EVENTS = [\n 'emitAction'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <DashboardContainer/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n actionEmitter.addToStore(store, events.emitAction)\n const handleNotifications = !events.emitAction\n notification.addToStore(store, handleNotifications)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', 'entity-list', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n \n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n \n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n }\n \n const app = initApp(packageName, input)\n \n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n \n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst DashboardApp = props => {\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n return initApp('dashboard', props, events).component\n}\n\nDashboardApp.propTypes = {\n navigationStrategy: PropTypes.object,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default DashboardApp\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template-rows: auto 1fr;\n grid-template-areas:\n 'breadcrumbs'\n 'content';\n height: 100%;\n width: 100%;\n`\n\nexport const StyledBreadcrumbs = styled.div`\n grid-area: breadcrumbs;\n`\n\nexport const StyledDashboardWrapper = styled.div`\n width: 100%;\n height: 100%;\n background-color: ${theme.color('backgroundBody')};\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n grid-area: content;\n\n @media (max-width: 568px) {\n justify-content: center;\n align-items: center;\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport DashboardApp from 'tocco-dashboard/src/main'\nimport {Breadcrumbs} from 'tocco-ui'\n\nimport {StyledDashboardWrapper, StyledWrapper, StyledBreadcrumbs} from './StyledComponents'\nimport navigationStrategy from '../../../entities/utils/navigationStrategy'\n\nconst Dashboard = ({match, history, emitAction, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledWrapper>\n <StyledBreadcrumbs>\n <Breadcrumbs\n currentView={{display: msg('client.admin.dashboard'), title: 'Tocco'}}\n pathPrefix=\"/dashboard\"\n />\n </StyledBreadcrumbs>\n <StyledDashboardWrapper>\n <DashboardApp\n emitAction={emitAction}\n navigationStrategy={navigationStrategy(history, match)}\n />\n </StyledDashboardWrapper>\n </StyledWrapper>\n )\n}\n\nDashboard.propTypes = {\n intl: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n history: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired\n}\n\nexport default React.memo(Dashboard, () => true)\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport Dashboard from './Dashboard'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(Dashboard))\n","import consoleLogger from '../consoleLogger'\n\nexport const dispatchInput = (store,\n input,\n {key, actionCreator, mandatory = false, defaultValue},\n logger = consoleLogger.logError) => {\n if (Object.prototype.hasOwnProperty.call(input, key) || defaultValue) {\n const action = actionCreator(input[key] || defaultValue)\n store.dispatch(action)\n } else if (mandatory === true) {\n logger(`EntityBrowser: Mandatory field '${key}' not set in input`)\n }\n}\n","import React from 'react'\n\nimport reducerUtil from '../reducer'\nimport sagaUtil from '../saga'\nimport asyncRoute from './asyncRoute'\nimport {dispatchInput} from './input'\n\nconst loadedComponents = {}\n\nexport const loadRoute = (store, input, importRouteDependencies, key) => props => {\n if (key && loadedComponents[key]) {\n const Component = loadedComponents[key]\n return <Component {...props}/>\n }\n\n const Component = asyncRoute(() =>\n new Promise(resolve => {\n importRouteDependencies().then(imported => {\n const route = imported.default\n\n if (route.reducers) {\n reducerUtil.injectReducers(store, route.reducers)\n }\n\n if (route.sagas) {\n route.sagas.forEach(saga => {\n sagaUtil.injectSaga(store, saga)\n })\n }\n\n if (route.inputDispatches) {\n route.inputDispatches.forEach(inputDispatch => {\n dispatchInput(\n store,\n input,\n inputDispatch\n )\n })\n }\n\n resolve(route.container)\n })\n })\n )\n\n if (key) {\n loadedComponents[key] = Component\n }\n\n return <Component {...props}/>\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Router as ReactRouter} from 'react-router'\n\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nconst Router = ({history, routes}) => (\n <ReactRouter history={history}>\n <React.Fragment>\n {routes.map((route, i) => (\n <RouteWithSubRoutes key={i} {...route}/>\n ))}\n </React.Fragment>\n </ReactRouter>\n)\n\nRouter.propTypes = {\n routes: PropTypes.array.isRequired,\n history: PropTypes.object\n}\n\nexport default Router\n","import {loadRoute} from './route'\nimport Router from './Router'\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nexport default {\n loadRoute,\n Router,\n RouteWithSubRoutes\n}\n","import React from 'react'\n\nexport default function asyncRoute(getComponent) {\n return class AsyncComponent extends React.Component {\n static Component = null\n mounted = false\n\n state = {\n Component: AsyncComponent.Component\n }\n\n componentDidMount() {\n this.mounted = true\n if (this.state.Component === null) {\n getComponent().then(Component => {\n AsyncComponent.Component = Component\n if (this.mounted) {\n this.setState({Component})\n }\n })\n }\n }\n\n componentWillUnmount() {\n this.mounted = false\n }\n\n render() {\n const {Component} = this.state\n\n if (Component !== null) {\n return <Component {...this.props}/>\n }\n\n return null\n }\n }\n}\n","import {route, js} from 'tocco-util'\nimport React, {memo} from 'react'\nimport {ReactReduxContext} from 'react-redux'\nimport _omit from 'lodash/omit'\nimport _omitBy from 'lodash/omitBy'\n\nconst ignoredAttributes = ['location.key', 'location.search', 'location.hash']\n\nfunction areEqual(prevProps, nextProps) {\n const diff = js.difference(prevProps, nextProps)\n const clean = _omitBy(_omit(diff, ignoredAttributes), v => Object.keys(v).length === 0)\n return Object.entries(clean).length === 0\n}\n\nexport default memo(\n props => (\n <ReactReduxContext.Consumer>\n {({store}) => {\n const Component = route.loadRoute(store, {}, () => (import('./route')))\n return <Component {...props}/>\n }}\n </ReactReduxContext.Consumer>\n ),\n areEqual\n)\n","import {route} from 'tocco-util'\nimport React, {useMemo} from 'react'\nimport {useStore} from 'react-redux'\n\nconst Route = props => {\n const store = useStore()\n const Component = useMemo(() => {\n return route.loadRoute(store, {}, () => (import('./route')), 'docs')\n }, [])\n return <Component {...props}/>\n}\n\nexport default Route\n","import React from 'react'\nimport {Typography} from 'tocco-ui'\n\nconst Settings = props => <Typography.H2>Settings</Typography.H2>\n\nSettings.propTypes = {\n}\n\nexport default Settings\n","import Settings from './Settings'\n\nexport default Settings\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport {buttonStyle} from './buttonStyle'\n\nconst StyledRouterLinkButton = styled(Link)`\n text-decoration: none;\n ${buttonStyle}\n`\n\nexport default StyledRouterLinkButton\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Icon from '../Icon'\nimport {design} from '../utilStyles'\nimport StyledRouterLinkButton from './StyledRouterLinkButton'\n\nconst RouterLinkButton = React.forwardRef((props, ref) => {\n const {aria, icon, ink, label, iconOnly, children} = props\n return (\n <StyledRouterLinkButton\n ref={ref}\n {...aria}\n {...props}\n ink={ink || design.ink.BASE}\n data-cy={props['data-cy']}\n title={label}\n >\n {icon && <Icon\n icon={icon}\n />}\n {!iconOnly && label ? <span>{label}</span> : children || '\\u200B' }\n </StyledRouterLinkButton>\n )\n})\n\nRouterLinkButton.propTypes = {\n /**\n * A flat object of ARIA keys and values.\n */\n 'aria': PropTypes.object,\n /**\n * Instead of using label prop it is possible to pass a child\n * (e.g. <LinkButton><FormattedMessage id=\"client.message\"/></LinkButton>). This is not useful for\n * styled tags since buttons design is controlled by props ink and look and immutable.\n */\n 'children': PropTypes.node,\n /**\n * If true, button occupies less space. It should only used for crowded areas like tables and only if necessary.\n */\n 'dense': PropTypes.bool,\n /**\n * Display an icon alongside button label. It is possible to omit label text if an icon is chosen.\n * See Icon component for more information.\n */\n 'icon': PropTypes.string,\n /**\n * Prepend icon or append icon to label. Default value is 'prepend'.\n * Possible values: append|prepend\n */\n 'iconPosition': PropTypes.oneOf([design.position.APPEND, design.position.PREPEND]),\n /**\n * Specify color palette. Default value is 'base'.\n */\n 'ink': design.inkPropTypes,\n /**\n * Describe button action concise. Default is ''.\n */\n 'label': PropTypes.node,\n /**\n * Look of button. Default value is 'flat'.\n */\n 'look': PropTypes.oneOf([\n design.look.BALL,\n design.look.FLAT,\n design.look.RAISED\n ]),\n /**\n * Describe button action in detail to instruct users. It is shown as popover on mouse over.\n */\n 'title': PropTypes.string,\n /**\n * Tabindex indicates if the button can be focused and if/where it participates\n * in sequential keyboard navigation.\n */\n 'tabIndex': PropTypes.number,\n /**\n * cypress selector string\n */\n 'data-cy': PropTypes.string,\n /**\n * If true, leaves the background of the button transparent and does not add any hove effect.\n */\n 'withoutBackground': PropTypes.bool,\n /**\n * If true, renders only the icon and minimal space around it\n */\n 'iconOnly': PropTypes.bool\n}\n\nexport default RouterLinkButton\n","import styled from 'styled-components'\nimport {AdminLink, Ball, scale, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// intermediate div to add a white background below StyledBackgroundLogo\nexport const StyledBackgroundCover = styled.div`\n position: absolute;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n height: 40px;\n width: 100%;\n background-color: ${theme.color('paper')};\n`\nexport const StyledHeader = styled.div`\n grid-area: header;\n display: flex;\n height: 40px;\n padding-right: 10px;\n padding-left: 40px;\n position: relative;\n z-index: 3; // higher than StyledBackgroundCover to enable button interactions\n`\n\nexport const StyledConfig = styled.div`\n flex: 1;\n z-index: 2;\n display: flex;\n justify-content: flex-end;\n padding: 7px;\n`\nexport const StyledBackgroundLogo = styled.div`\n position: absolute;\n z-index: 3; // higher than StyledBackgroundCover to prevent coverage\n height: 40px;\n width: 100%;\n background-color: ${({runEnv, theme}) => runEnv === 'PRODUCTION' ? theme.colors.primary : theme.colors.secondary};\n mask-image: url(${ToccoLogo});\n mask-repeat: no-repeat;\n mask-position: -300px -900px;\n`\n\nexport const StyledPopper = styled.div`\n width: 350px;\n z-index: 1001; // higher than bm-overlay\n box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n`\n\nexport const StyledNotificationBellWrapper = styled.span`\n position: relative;\n`\n\nexport const StyledBall = styled(Ball)`\n margin-left: ${scale.space(-0.5)};\n`\n\nexport const StyledRedDot = styled.span`\n width: 7px;\n height: 7px;\n position: absolute;\n top: 3px;\n left: 21.5px;\n background-color: ${theme.color('secondaryLight')};\n border-radius: 50%;\n display: inline-block;\n`\nexport const StyledHeaderLink = styled(AdminLink)`\n display: inline-block;\n padding: ${scale.space(-2.1)} ${scale.space(0)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledRedDot} from './StyledComponents'\n\nconst NotificationCenterRedDot = ({\n unreadNotificationKeys,\n onClick,\n innerRef\n}) => unreadNotificationKeys.length > 0\n && <StyledRedDot onClick={onClick} ref={innerRef}/>\n\nNotificationCenterRedDot.propTypes = {\n unreadNotificationKeys: PropTypes.arrayOf(PropTypes.string),\n onClick: PropTypes.func.isRequired,\n innerRef: PropTypes.shape({current: PropTypes.any})\n}\n\nexport default NotificationCenterRedDot\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport NotificationCenterRedDot from './NotificationCenterRedDot'\n\nconst mapStateToProps = state => ({\n unreadNotificationKeys: state.notification.center.unreadNotificationKeys\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(NotificationCenterRedDot))\n","import React, {useState, useEffect, useRef} from 'react'\nimport ReactDOM from 'react-dom'\nimport {usePopper} from 'react-popper'\nimport {notification} from 'tocco-app-extensions'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport NotificationCenterRedDotContainer from './NotificationCenterRedDotContainer'\nimport {StyledNotificationBellWrapper, StyledBall, StyledPopper} from './StyledComponents'\n\nconst popperModifiers = [\n {\n name: 'offset',\n options: {\n offset: [0, 3]\n }\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 35\n }\n }\n]\n\nconst NotificationCenterButton = () => {\n const [visible, setVisibility] = useState(false)\n\n const referenceElement = useRef(null)\n const popperElement = useRef(null)\n const redDotElement = useRef(null)\n\n const handleMouseDown = e => {\n if (popperElement.current && !popperElement.current.contains(e.target)\n && referenceElement.current && !referenceElement.current.contains(e.target)\n && redDotElement.current && !redDotElement.current.contains(e.target)) {\n setVisibility(false)\n }\n }\n\n useEffect(() => {\n document.addEventListener('mousedown', handleMouseDown)\n return () => {\n document.removeEventListener('mousedown', handleMouseDown)\n }\n }, [referenceElement, popperElement])\n\n const {styles, attributes} = usePopper(referenceElement.current, popperElement.current, {modifiers: popperModifiers})\n\n return <>\n <StyledNotificationBellWrapper title=\"notifications\">\n <StyledBall onClick={() => setVisibility(!visible)} icon=\"bell\" ref={referenceElement}/>\n <span ref={redDotElement}><NotificationCenterRedDotContainer onClick={() => setVisibility(!visible)}/></span>\n </StyledNotificationBellWrapper>\n {ReactDOM.createPortal(\n <StyledPopper\n ref={popperElement}\n style={styles.popper}\n {...attributes.popper}\n >\n {visible && <notification.NotificationCenter navigationStrategy={navigationStrategy()}/>}\n </StyledPopper>,\n document.body\n )}\n </>\n}\n\nexport default NotificationCenterButton\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledFormattedMessageWrapper = styled.div`\n font-size: ${scale.font(-1.5)};\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledBlockWrapper = styled.div`\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledLogo = styled.img`\n margin-top: ${scale.space(1)};\n width: 80%;\n height: auto;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography, Link} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport ToccoLogo from '../../assets/tocco_red.svg'\nimport {StyledLogo, StyledBlockWrapper, StyledFormattedMessageWrapper} from './StyledComponents'\n\nconst AboutTocco = ({niceVersion, niceRevision, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <Typography.Span>\n <StyledLogo src={ToccoLogo} height=\"53.34\" width=\"580\" alt=\"tocco-logo\"/>\n <div dangerouslySetInnerHTML={{__html: msg('client.admin.tocco.address')}}/>\n <Typography.P>\n <Link\n href={msg('client.admin.tocco.homepage')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.homepage\"/>\n </Link><br/>\n <Link\n href={'mailto:' + msg('client.admin.tocco.email')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.email\"/>\n </Link><br/>\n <Link\n href={'tel:' + msg('client.admin.tocco.phone')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.phone\"/>\n </Link>\n </Typography.P>\n <StyledBlockWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.admin.about.versionLabel\"/>: {niceVersion}<br/>\n <FormattedMessage id=\"client.admin.about.revisionLabel\"/>: {niceRevision}\n </Typography.P>\n </StyledBlockWrapper>\n <StyledFormattedMessageWrapper>\n <FormattedMessage id=\"client.admin.copyright\"/>\n </StyledFormattedMessageWrapper>\n </Typography.Span>\n )\n}\n\nAboutTocco.propTypes = {\n intl: PropTypes.object,\n niceVersion: PropTypes.string,\n niceRevision: PropTypes.string\n}\n\nexport default AboutTocco\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport AboutTocco from './AboutTocco'\n\nconst mapStateToProps = state => ({\n niceVersion: state.preferences.serverSettings.niceVersion,\n niceRevision: state.preferences.serverSettings.niceRevision\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(AboutTocco))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, ButtonMenu, BallMenu, StyledBall, scale, RouterLinkButton} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport styled from 'styled-components'\nimport {PasswordUpdateApp} from 'tocco-login/src/main'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport NotificationCenterButton from './NotificationCenterButton'\nimport {\n StyledBackgroundCover,\n StyledHeader,\n StyledConfig,\n StyledBackgroundLogo\n} from './StyledComponents'\nimport AboutTocco from '../AboutTocco'\n\nconst StyledBallMenuWrapper = styled.span`\n display: flex;\n margin-top: 2px;\n\n ${StyledBall} {\n font-size: ${scale.font(1)};\n }\n`\n\nconst Header = ({\n username,\n currentBusinessUnit,\n businessUnits,\n loadBusinessUnits,\n changeBusinessUnit,\n doLogout,\n runEnv,\n niceVersion,\n openModalComponent,\n removeModalComponent,\n info,\n intl\n}) => {\n const handleBusinessUnitOpen = () => {\n if (businessUnits.length === 0) {\n loadBusinessUnits()\n }\n }\n\n const openPasswordUpdate = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.login.passwordUpdate.title',\n null,\n () => <PasswordUpdateApp username={username} success={() => {\n removeModalComponent('passwordUpdateModal')\n info('success', 'client.login.passwordUpdate.success')\n }}/>\n , true\n )\n }\n\n const openTwoFactorConnector = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.actions.two-factor-connector.title',\n null,\n () => <TwoFactorConnectorApp\n onSuccess={() => {\n removeModalComponent('passwordUpdateModal')\n }}\n />,\n true)\n }\n\n const msg = id => intl.formatMessage({id})\n\n return <>\n <StyledBackgroundLogo runEnv={runEnv}/>\n <StyledBackgroundCover/>\n <StyledHeader>\n <StyledConfig>\n <RouterLinkButton to=\"/dashboard/reload\"><FormattedMessage id=\"client.admin.dashboard\"/></RouterLinkButton>\n <ButtonMenu label={currentBusinessUnit.label} onOpen={handleBusinessUnitOpen}>\n {\n businessUnits.map(bU =>\n <MenuItem\n key={`buMenu-${bU.id}`}\n disabled={bU.id === currentBusinessUnit.id}\n onClick={() => {\n changeBusinessUnit(bU.id)\n }}\n >\n {bU.label}\n </MenuItem>\n )\n }\n </ButtonMenu>\n <ButtonMenu label={username}>\n <MenuItem onClick={openPasswordUpdate}><FormattedMessage id=\"client.admin.menu.passwordUpdate\"/></MenuItem>\n <MenuItem onClick={openTwoFactorConnector}>\n <FormattedMessage id=\"client.admin.menu.twoFactorConnector\"/>\n </MenuItem>\n <MenuItem onClick={doLogout}><FormattedMessage id=\"client.admin.menu.logout\"/></MenuItem>\n </ButtonMenu>\n <StyledBallMenuWrapper>\n <BallMenu buttonProps={{\n icon: 'question-circle',\n title: msg('client.admin.header.help')\n }}>\n {niceVersion && <MenuItem onClick={() => {\n window.open(\n `https://${niceVersion.replace('.', '')}.docs.tocco.ch/de/`,\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.doc\"/>\n </MenuItem>}\n <MenuItem onClick={() => {\n window.open(\n '/nice2/swagger',\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.restDoc\"/>\n </MenuItem>\n <MenuItem onClick={() => {\n openModalComponent('about', null, null, () => <AboutTocco/>, true)\n }}>\n <FormattedMessage id=\"client.admin.menu.aboutToccoTitle\"/>\n </MenuItem>\n </BallMenu>\n <NotificationCenterButton/>\n </StyledBallMenuWrapper>\n </StyledConfig>\n </StyledHeader>\n </>\n}\n\nconst bUPropType = PropTypes.shape({\n id: PropTypes.string,\n label: PropTypes.string\n})\n\nHeader.propTypes = {\n username: PropTypes.string,\n currentBusinessUnit: bUPropType,\n businessUnits: PropTypes.arrayOf(bUPropType),\n doLogout: PropTypes.func.isRequired,\n changeBusinessUnit: PropTypes.func.isRequired,\n loadBusinessUnits: PropTypes.func.isRequired,\n runEnv: PropTypes.string,\n niceVersion: PropTypes.string,\n openModalComponent: PropTypes.func.isRequired,\n removeModalComponent: PropTypes.func.isRequired,\n info: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default Header\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {doLogout, loadBusinessUnits, changeBusinessUnit} from '../../modules/session/actions'\nimport Header from './Header'\n\nconst mapActionCreators = {\n doLogout,\n loadBusinessUnits,\n changeBusinessUnit,\n openModalComponent: notification.modal,\n removeModalComponent: notification.removeModal,\n info: notification.toaster\n}\n\nconst mapStateToProps = (state, props) => ({\n username: state.session.username,\n currentBusinessUnit: state.session.currentBusinessUnit,\n businessUnits: state.session.businessUnits,\n runEnv: state.preferences.serverSettings.runEnv,\n niceVersion: state.preferences.serverSettings.niceVersion\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Header))\n","import styled from 'styled-components'\nimport SlideMenu from 'react-burger-menu/lib/menus/slide'\nimport {theme} from 'tocco-ui'\n\nconst calcViewportHeight = () => {\n const vh = document.documentElement.clientHeight * 0.01\n document.documentElement.style.setProperty('--vh', `${vh}px`)\n}\n\ncalcViewportHeight()\n\nwindow.addEventListener('resize', () => calcViewportHeight())\nwindow.addEventListener('orientationchange', () => calcViewportHeight())\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template:\n 'header header' auto\n 'menu content' 1fr / auto 1fr;\n background-color: ${theme.color('paper')};\n height: calc(var(--vh, 1vh) * 100);\n\n .bm-burger-button button:focus {\n outline: 0;\n }\n`\n\nexport const StyledContent = styled.div`\n grid-area: content;\n background-color: ${theme.color('backgroundBody')};\n overflow: hidden;\n display: flex;\n`\nexport const StyledMenu = styled(SlideMenu)`\n grid-area: menu;\n`\n\nexport const burgerMenuStyles = {\n bmBurgerButton: {\n position: 'absolute',\n outline: '0',\n width: '24px',\n height: '24px',\n left: '17px',\n top: '10px',\n // Default z-index of button is 1000 which is higher than the mask of the legacy action modal windows (not good).\n // It seems like it doesn't need to be higher than 3, therefore we set it to 3.\n zIndex: 3\n },\n bmBurgerBarsHover: {\n background: '#a90000'\n },\n bmMenuWrap: {\n position: 'fixed',\n height: '100%',\n width: '16%',\n minWidth: '350px'\n },\n bmMenu: {\n background: '#fff',\n padding: '0 0 3rem 0',\n fontSize: '1.15em',\n overflow: 'hidden'\n },\n bmMorphShape: {\n fill: '#373a47'\n },\n bmItemList: {\n color: '#b8b7ad',\n height: '100%'\n },\n bmItem: {\n display: 'inline-block'\n },\n bmOverlay: {\n background: 'rgba(0, 0, 0, 0.3)'\n }\n}\n","import React, {useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Redirect, Route, Router, Switch} from 'react-router-dom'\nimport {createBrowserHistory} from 'history'\nimport {BurgerButton, GlobalStyles, LoadMask} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {withTheme} from 'styled-components'\nimport {notification} from 'tocco-app-extensions'\nimport {viewPersistor} from 'tocco-util'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport Navigation from '../Navigation'\nimport DashboardRoute from '../../routes/dashboard'\nimport EntitiesRoute from '../../routes/entities'\nimport DocsRoute from '../../routes/docs'\nimport Settings from '../../routes/settings'\nimport Header from '../Header'\nimport ErrorView from '../ErrorView'\nimport {burgerMenuStyles, StyledContent, StyledMenu, StyledWrapper} from './StyledComponents'\n\nconst Admin = ({\n initializeNavigation,\n setMenuOpen,\n menuOpen,\n baseRoute,\n confirm,\n loadPrincipal,\n loadSettingsAndPreferences,\n theme,\n adminAllowed\n}) => {\n const [history, setHistory] = useState(null)\n\n useEffect(() => {\n initializeHistory()\n initializeNavigation()\n loadPrincipal()\n loadSettingsAndPreferences()\n }, [])\n\n const initializeHistory = () => {\n const browserHistory = createBrowserHistory({\n ...baseRoute && {basename: baseRoute},\n getUserConfirmation: (message, confirmCallback) => {\n confirm(\n '',\n message,\n <FormattedMessage id=\"client.common.ok\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n () => confirmCallback(true),\n () => confirmCallback(false)\n )\n }\n })\n setHistory(browserHistory)\n }\n\n const isMenuOpen = state => {\n if (state.isOpen !== menuOpen) {\n setMenuOpen(state.isOpen)\n }\n }\n\n return <LoadMask required={[history !== null]}>\n <Router history={history || {}}>\n <GlobalStyles/>\n <notification.Notifications navigationStrategy={navigationStrategy()}/>\n <StyledWrapper id=\"outer-container\">\n <Header/>\n {adminAllowed && <StyledMenu\n isOpen={menuOpen}\n onStateChange={isMenuOpen}\n customCrossIcon={false}\n customBurgerIcon={<BurgerButton isOpen={menuOpen} size=\"20\" color={theme.colors.paper}/>}\n styles={burgerMenuStyles}\n pageWrapId={'page-wrap'}\n outerContainerId={'outer-container'}>\n <Navigation onClick={() => {\n setMenuOpen(false)\n viewPersistor.clearPersistedViews()\n }}/>\n </StyledMenu>}\n {\n adminAllowed && <StyledContent id=\"page-wrap\">\n <Switch>\n <Route exact path=\"/\"\n render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/dashboard`}/>}/>\n <Redirect exact from=\"/dashboard/reload\" to=\"/dashboard\"/>\n <Route exact={true} path=\"/dashboard\" component={DashboardRoute}/>\n <Route path=\"/e\" component={EntitiesRoute}/>\n <Route path=\"/s\" component={Settings}/>\n <Route path=\"/docs\" component={DocsRoute}/>\n <Route render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/dashboard`}/>}/>\n </Switch>\n </StyledContent>\n }\n {\n !adminAllowed && <StyledContent id=\"page-wrap\">\n <ErrorView title={<FormattedMessage id={'client.admin.error.no_roles.title'}/>}\n message={<FormattedMessage id={'client.admin.error.no_roles.message'}/>}/>\n </StyledContent>\n }\n </StyledWrapper>\n </Router>\n </LoadMask>\n}\n\nAdmin.propTypes = {\n baseRoute: PropTypes.string,\n loggedIn: PropTypes.bool,\n menuOpen: PropTypes.bool,\n loadPrincipal: PropTypes.func.isRequired,\n setMenuOpen: PropTypes.func.isRequired,\n confirm: PropTypes.func.isRequired,\n initializeNavigation: PropTypes.func.isRequired,\n loadSettingsAndPreferences: PropTypes.func.isRequired,\n theme: PropTypes.object.isRequired,\n adminAllowed: PropTypes.bool.isRequired\n}\n\nexport default withTheme(Admin)\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {loadPrincipal} from '../../modules/session/actions'\nimport {initializeNavigation, setMenuOpen} from '../../modules/navigation/actions'\nimport {loadSettingsAndPreferences} from '../../modules/preferences/actions'\nimport Admin from './Admin'\n\nconst mapActionCreators = {\n loadPrincipal,\n confirm: notification.confirm,\n initializeNavigation,\n setMenuOpen,\n loadSettingsAndPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n baseRoute: state.input.baseRoute,\n menuOpen: state.navigation.menuOpen,\n adminAllowed: state.login.adminAllowed\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Admin))\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {Helmet} from 'react-helmet'\n\nimport Login from '../../components/Login'\nimport Admin from '../Admin'\n\nconst LoginGuard = ({doSessionCheck, loggedIn}) => {\n useEffect(() => {\n doSessionCheck()\n }, [])\n\n return (\n <div>\n <Helmet defer={false}>\n <title>Tocco</title>\n </Helmet>\n <LoadMask required={[loggedIn !== undefined]} loadingText=\"Logging in...\">\n <div>\n {!loggedIn ? <Login/> : <Admin/>}\n </div>\n </LoadMask>\n </div>\n )\n}\n\nLoginGuard.propTypes = {\n loggedIn: PropTypes.bool,\n doSessionCheck: PropTypes.func.isRequired\n}\n\nexport default LoginGuard\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification, login} from 'tocco-app-extensions'\n\nimport LoginGuard from './LoginGuard'\n\nconst mapActionCreators = {\n doSessionCheck: login.doSessionCheck,\n confirm: notification.confirm\n}\n\nconst mapStateToProps = (state, props) => ({\n loggedIn: state.login.loggedIn\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginGuard))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {queryString as queryStringUtil} from 'tocco-util'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {goBack} from '../../../utils/routing'\n\nconst DetailLinkRelativeWithoutIntl = ({\n entityKey,\n entityModel,\n children,\n relation,\n intl\n}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledLink\n aria-label={msg('client.component.navigationStrategy.detailLinkRelative')}\n to={`${relation ? relation + '/' : ''}${entityKey}`}>\n {children}\n </StyledLink>\n )\n}\n\nconst DetailLinkRelative = injectIntl(DetailLinkRelativeWithoutIntl)\n\nexport const DetailLink = ({\n entityName,\n entityKey,\n children\n}) => (\n <StyledLink\n to={`/e/${entityName}/${entityKey}`}\n target=\"_blank\"\n neutral={false}>\n {children}\n </StyledLink>\n)\n\nexport const ListLink = ({\n entityName,\n entityKeys,\n children\n}) => {\n const queryString = entityKeys?.length && 'tql=KEYS(' + entityKeys.join(',') + ')'\n\n return (\n <StyledLink\n to={{\n pathname: `/e/${entityName}/list`,\n search: `?${queryString}`\n }}\n target=\"_blank\"\n >\n {children}\n </StyledLink>\n )\n}\n\nListLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n entityKeys: PropTypes.arrayOf(PropTypes.string)\n}\n\nexport const ListOrDetailLink = ({\n entityName,\n entityKeys,\n children\n}) => {\n if (entityKeys?.length === 1) {\n return (\n <DetailLink entityName={entityName} entityKey={entityKeys[0]}>\n {children}\n </DetailLink>\n )\n }\n return (\n <ListLink entityName={entityName} entityKeys={entityKeys}>\n {children}\n </ListLink>\n )\n}\n\nListOrDetailLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n entityKeys: PropTypes.arrayOf(PropTypes.string)\n}\n\nexport default (history, match) => {\n const navigateToCreateRelative = (relationName, state) => {\n if (relationName) {\n history.push({\n pathname: `${match.url}/${relationName}/create`,\n state\n })\n } else {\n const entityBaseUrl = goBack(match.url)\n\n history.push({\n pathname: entityBaseUrl + '/create',\n state\n })\n }\n }\n\n const navigateToActionRelative = (definition, selection) => {\n const entityBaseUrl = goBack(match.url)\n const search = queryStringUtil.toQueryString({\n selection,\n actionProperties: definition.properties\n })\n history.push({\n pathname: entityBaseUrl + '/action/' + definition.appId,\n state: {\n definition,\n selection\n },\n search\n })\n }\n\n const openDetail = (entityName, key, inNewTab = true) => {\n const pathname = `/e/${entityName}/${key}`\n if (inNewTab) {\n const url = history.createHref({pathname})\n window.open(url, '_blank')\n } else {\n history.push({\n pathname\n })\n }\n }\n\n return {\n DetailLink,\n ListLink,\n ListOrDetailLink,\n DetailLinkRelative,\n navigateToCreateRelative,\n navigateToActionRelative,\n openDetail\n }\n}\n\nDetailLinkRelativeWithoutIntl.propTypes = {\n entityKey: PropTypes.string.isRequired,\n entityModel: PropTypes.string.isRequired,\n children: PropTypes.element.isRequired,\n relation: PropTypes.string,\n intl: PropTypes.object.isRequired\n}\n\nDetailLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n entityKey: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired\n}\n","export const goBack = (url, amount = 1) => {\n let normalizedUrl = url.replace(/\\/$/, '')\n\n for (let i = 0; i < amount; i++) {\n normalizedUrl = normalizedUrl.substring(0, normalizedUrl.lastIndexOf('/'))\n }\n\n return normalizedUrl\n}\n","export default Object.freeze({\n ACTION: 'action',\n REPORT: 'report',\n ACTION_GROUP: 'action-group',\n ACTION_BAR: 'action-bar'\n})\n","import componentTypes from './actionComponentTypes'\n\nexport const isAction = componentType => !!componentType && Object.values(componentTypes).indexOf(componentType) >= 0\n\nexport const modeFitsScopes = (mode, scopes) => (!mode || !scopes || scopes.length < 0 || scopes.includes(mode))\n","const ACTION_HANDLERS = {\n\n}\n\nconst initialState = {\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const ACTION_INVOKE = 'actions/ACTION_INVOKE'\nexport const ACTION_IN_PROGRESS = 'actions/ACTION_IN_PROGRESS'\nexport const ACTION_INVOKED = 'actions/ACTION_INVOKED'\n\nexport const actionInvoke = (definition, selection, parent) => ({\n type: ACTION_INVOKE,\n payload: {\n definition,\n selection,\n parent\n }\n})\n\nexport const actionInvoked = (definition, selection, response) => ({\n type: ACTION_INVOKED,\n payload: {\n definition,\n selection,\n response\n }\n})\n","export default Object.freeze({\n CUSTOM: 'custom',\n SIMPLE: 'simple',\n REPORT: 'report',\n DIVIDER: 'divider',\n LEGACY: 'legacy'\n})\n","import React from 'react'\nimport {call, put} from 'redux-saga/effects'\nimport {download, validation} from 'tocco-util'\nimport {v4 as uuid} from 'uuid'\n\nimport errorLogging from '../../../errorLogging'\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport {TOASTER_KEY_PREFIX} from '../../../notification/modules/socket/socket'\nimport NotificationBody from '../../../notification/components/NotificationBody'\n\nexport default function* (definition, selection, parent, params) {\n const runAsync = definition.runInBackgroundTask\n const invokeFnc = runAsync ? invokeActionAsync : invokeActionSync\n\n return yield call(invokeFnc, definition, selection, parent, params)\n}\n\nexport function* invokeActionAsync(definition, selection, parent, params) {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n params: {\n background: true\n },\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n\n if (response.body && response.body.success === false) {\n yield put(notification.toaster({\n type: 'error',\n title: 'client.common.unexpectedError',\n body: response.body.title || 'client.component.actions.errorText'\n }))\n }\n}\n\nexport function* invokeActionSync(definition, selection, parent, params) {\n const randomId = uuid()\n const title = definition.progressMsg || 'client.component.actions.defaultProgressMessage'\n yield put(notification.blockingInfo(randomId, title))\n const response = yield call(invokeRequest, definition, selection, parent, params)\n yield put(notification.removeBlockingInfo(randomId))\n\n return {\n ...response,\n remoteEvents: [\n ...(response && response.success\n ? [{\n type: 'entity-update-event',\n payload: {\n parent,\n entities: [{entityName: selection.entityName}]\n }\n }]\n : []\n )\n ]\n }\n}\n\nexport function* invokeRequest(definition, selection, parent, params) {\n try {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n if (response.body && response.body.errorCode === 'VALIDATION_FAILED') {\n yield put(\n notification.toaster({\n type: 'error',\n title: 'client.component.actions.validationError',\n body: validation.getErrorCompact(response.body.errors)\n })\n )\n } else if (response.body && response.body.params && response.body.params.downloadUrl) {\n const downloadUrl = download.getDownloadUrl(response.body.params.downloadUrl)\n const fileResponse = yield call(rest.requestBytesSaga, downloadUrl, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n }\n })\n yield call(download.downloadReadableStream, fileResponse.body, response.body.params.filename)\n } else {\n yield call(showToaster, response, response.body.success === true ? 'success' : 'warning')\n }\n\n return response.body\n } catch (error) {\n if (!(error instanceof rest.ClientQuestionCancelledException)) {\n yield put(errorLogging.logError(\n 'client.common.unexpectedError',\n 'client.component.actions.errorText',\n error\n ))\n }\n }\n}\n\nexport function* showToaster(response, type) {\n const title = response.body.title || 'client.component.actions.successDefault'\n const message = response.body.message\n const key = response.body.notificationKey ? `${TOASTER_KEY_PREFIX}${response.body.notificationKey}` : undefined\n const result = response.body.result\n const body = ({navigationStrategy, cancelTask}) => (\n <NotificationBody\n notification={{key, message, result}}\n navigationStrategy={navigationStrategy}\n cancelTask={cancelTask}\n />\n )\n yield put(notification.toaster({type, title, message, body, key}))\n}\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default connect(null, mapActionCreators)\n","import PropTypes from 'prop-types'\nimport _reduce from 'lodash/reduce'\n\nconst GROUP_GENERAL = 'generalSettings'\nconst GROUP_RECIPIENT = 'recipientSettings'\n\nexport const submitActions = Object.freeze({\n DISPLAY: 'display',\n DOWNLOAD: 'download'\n})\n\nexport const getGroupedValues = (settingsDefinition, values) => {\n const groupValues = name => (\n {\n [name]: (settingsDefinition[name] || []).reduce((result, field) => (\n {...result, [field.id]: values[field.id]}\n ), {})\n }\n )\n\n return {\n ...groupValues(GROUP_GENERAL),\n ...groupValues(GROUP_RECIPIENT)\n }\n}\n\nexport const transformValues = values => {\n const transform = v => {\n return v.key ? v.key : v\n }\n\n return _reduce(values, (result, value, key) => (\n {\n ...result,\n [key]: Array.isArray(value) ? value.map(transform) : transform(value)\n }\n ), {})\n}\n\nexport const getFormDefinition = (settingsDefinition, intl) => {\n const msg = id => intl.formatMessage({id})\n\n const extractFields = name =>\n (settingsDefinition[name] || []).map(field => (\n {\n children: [\n {\n componentType: 'field',\n dataType: field.dataType,\n defaultValue: field.defaultValue,\n id: field.id,\n label: field.label || field.description,\n path: field.id,\n ...(field.targetEntity ? {targetEntity: field.targetEntity} : {}),\n ...(field.validation ? {validation: field.validation} : {})\n }\n ],\n componentType: 'field-set',\n hidden: false,\n id: field.id,\n label: field.label || field.description,\n readonly: field.disabled,\n scopes: []\n }\n ))\n\n return {\n componentType: 'form',\n label: null,\n modelid: 'Bill_report_settings',\n readonly: false,\n children: [\n {\n componentType: 'layout',\n id: 'generalSettings',\n label: msg('client.common.report.generalSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_GENERAL)\n },\n {\n componentType: 'layout',\n id: 'recipientSettings',\n label: msg('client.common.report.recipientSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_RECIPIENT)\n }\n ]\n }\n}\n\nexport const reportSettingsDefinitionPropType = PropTypes.shape({\n customSettings: PropTypes.shape({\n form: PropTypes.object,\n entity: PropTypes.object\n }),\n generalSettings: PropTypes.array,\n recipient: PropTypes.array,\n description: PropTypes.shape({\n name: PropTypes.string.isRequired\n })\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledReportSettings = styled.div`\n && {\n > div:first-of-type {\n margin-bottom: 10px;\n }\n }\n`\n\nexport const StyledStickyButtons = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n z-index: 1;\n display: flex;\n justify-content: flex-end;\n\n ${/* sc-selector */StyledButton}:last-child {\n margin-right: 0;\n }\n`\n","import React, {useState, useMemo, useRef} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport simpleFormConnector from '../containers/simpleFormConnector'\nimport {\n getFormDefinition,\n getGroupedValues,\n reportSettingsDefinitionPropType,\n transformValues\n} from '../utils/report'\nimport {StyledStickyButtons, StyledReportSettings} from './StyledReportSettings'\n\nexport const ReportSettings = ({settingsDefinition, formApp, onSubmit, listApp, intl}) => {\n const customSettingsDefined = settingsDefinition.customSettings && settingsDefinition.customSettings.entity\n const [settings, setSettings] = useState({\n valid: false,\n customSettingsValid: !customSettingsDefined\n })\n const settingsRef = useRef()\n settingsRef.current = settings // workaround to read current state in static callbacks (because of memo hook)\n\n const SimpleFormContainer = useMemo(() => simpleFormConnector(formApp), [formApp])\n\n const handleSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n values,\n valid\n })\n }\n\n const handleCustomSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n customSettings: values,\n customSettingsValid: valid\n })\n }\n\n const handleButtonClick = () => {\n const groupedValues = {\n ...getGroupedValues(settingsDefinition, transformValues(settings.values)),\n customSettings: settings.customSettings\n }\n\n onSubmit(groupedValues)\n }\n\n return (\n <StyledReportSettings>\n <SimpleFormContainer\n listApp={listApp}\n form={getFormDefinition(settingsDefinition, intl)}\n noButtons\n onChange={handleSettingsChange}\n mode=\"create\"\n />\n {customSettingsDefined\n && <SimpleFormContainer\n listApp={listApp}\n form={settingsDefinition.customSettings.form.form}\n noButtons\n onChange={handleCustomSettingsChange}\n mode=\"create\"\n />\n }\n <StyledStickyButtons>\n <Button\n ink=\"primary\"\n disabled={!settings.customSettingsValid || !settings.valid}\n onClick={handleButtonClick}\n look=\"raised\"\n >\n <FormattedMessage id=\"client.common.report.generate\"/>\n </Button>\n </StyledStickyButtons>\n </StyledReportSettings>\n )\n}\n\nReportSettings.propTypes = {\n intl: PropTypes.object.isRequired,\n onSubmit: PropTypes.func.isRequired,\n listApp: PropTypes.func.isRequired,\n formApp: PropTypes.func.isRequired,\n settingsDefinition: reportSettingsDefinitionPropType.isRequired\n}\n\nexport default injectIntl(ReportSettings)\n","import React from 'react'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {api} from 'tocco-util'\nimport {call, put, take} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport ReportSettings from '../../components/ReportSettings'\nimport {invokeActionAsync} from './simpleAction'\n\nexport default function* (actionDefinition, selection, parent, params, config) {\n const answerChannel = yield call(channel)\n const settingsModalId = yield call(displayReportSettings, actionDefinition, selection, answerChannel, config)\n yield call(awaitSettingsSubmit, actionDefinition, answerChannel, settingsModalId, selection)\n}\n\nexport function* displayReportSettings(actionDefinition, selection, answerChannel, config) {\n const options = {\n queryParams: {\n model: selection.entityName,\n ...(selection.mode === 'ID' ? {keys: selection.ids.join(',')} : {})\n }\n }\n\n const resource = `report/${actionDefinition.reportId}/settings`\n const {body: settingsDefinition} = yield call(rest.requestSaga, resource, options)\n const onSubmit = formValues => answerChannel.put({\n formValues,\n settingsDefinition\n })\n const settingsModalId = yield call(uuid)\n\n yield put(notification.modal(\n settingsModalId,\n settingsDefinition.description.name,\n null,\n () => (\n <ReportSettings\n listApp={config.listApp}\n formApp={config.formApp}\n onSubmit={onSubmit}\n settingsDefinition={settingsDefinition}\n />\n ),\n true\n ))\n\n return settingsModalId\n}\n\nexport function* awaitSettingsSubmit(definition, answerChannel, settingsModalId, selection) {\n while (true) {\n const {\n formValues: {customSettings, generalSettings, recipientSettings},\n settingsDefinition\n } = yield take(answerChannel)\n\n definition.endpoint = 'report/generations'\n const customSettingsEntity = settingsDefinition.customSettings\n ? api.toEntity({\n __model: settingsDefinition.customSettings.entity.name,\n ...customSettings\n })\n : null\n const params = {\n additionalProperties: {\n reportId: definition.reportId,\n generalSettings,\n recipientSettings\n },\n formData: customSettingsEntity\n }\n\n yield call(invokeActionAsync, definition, selection, null, params)\n yield put(notification.removeModal(settingsModalId))\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport React from 'react'\nimport {consoleLogger} from 'tocco-util'\nimport {channel} from 'redux-saga'\n\nimport notification from '../../../notification'\n\nexport default function* (definition, selection, parent, params, config) {\n if (definition.appId) {\n if (definition.fullscreen) {\n if (config.customActions && config.customActions.fullscreen) {\n yield call(handleFullScreenActions, {definition, selection, config})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No fullscreen handler provided')\n }\n } else {\n if (config.appComponent) {\n return yield call(handleCustomActionModal, {definition, config, selection})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No appComponent provided')\n }\n }\n } else {\n const handler = config && config.customActions && config.customActions[definition.id]\n if (handler) {\n return yield call(handleAppActionsFallback, {definition, selection, parent, params, config, handler})\n } else {\n yield call(consoleLogger.logError, `Unable to load custom action with id ${definition.id}`)\n }\n }\n}\n\nconst actionStatus = {\n OK: 'ok',\n NOT_OK: 'not_ok',\n CANCEL: 'cancel'\n}\n\nexport function* handleCustomActionModal({definition, selection, config}) {\n const answerChannel = yield call(channel)\n\n const ActionComponent = config.appComponent\n yield put(notification.modal(\n `action-${definition.appId}`,\n `client.actions.${definition.appId}.title`,\n null,\n ({close}) => {\n const onSuccess = ({message, remoteEvents}) => {\n close()\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n\n const onError = ({message}) => {\n close()\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n\n const onCancel = () => {\n close()\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n return <ActionComponent\n appId={definition.appId}\n context={config.context}\n actionProperties={definition.properties}\n selection={selection}\n navigationStrategy={config.navigationStrategy || {}}\n onSuccess={onSuccess}\n onError={onError}\n onCancel={onCancel}\n />\n },\n true\n ))\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n if (response.message !== null) {\n const type = success ? 'success' : 'warning'\n const title = response.message || 'client.component.actions.successDefault'\n\n yield put(notification.toaster({type, title}))\n }\n return {success: success, remoteEvents: response.remoteEvents}\n}\n\nexport function* handleFullScreenActions({definition, selection, config}) {\n yield call(config.customActions.fullscreen, definition, selection)\n}\n\nexport function* handleAppActionsFallback({definition, selection, config, parent, params, handler}) {\n const answerChannel = yield call(channel)\n const onSuccess = ({message, remoteEvents}) => {\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n const onError = ({message}) => {\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n const onCancel = () => {\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n yield call(handler, definition, selection, parent, params, config, onSuccess, onError, onCancel)\n\n return yield call(handleAnswer, answerChannel)\n}\n\nexport function* handleAnswer(answerChannel) {\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n\n if (response.message) {\n const type = success ? 'success' : 'warning'\n const title = response.message === 'default' ? 'client.component.actions.successDefault' : response.message\n\n yield put(notification.toaster({type, title}))\n }\n\n return {success: success, remoteEvents: response.remoteEvents}\n}\n","import _isPlainObject from 'lodash/isPlainObject'\nimport {channel} from 'redux-saga'\nimport {call, all, put, spawn, take, select} from 'redux-saga/effects'\n\nimport newNotification from '../../../notification'\nimport remoteEvents from '../../../remoteEvents'\nimport rest from '../../../rest'\n\nexport const loadScript = src => new Promise((resolve, reject) => {\n const s = document.createElement('script')\n s.src = src\n s.onload = resolve\n s.onerror = reject\n document.head.appendChild(s)\n})\n\nexport const loadCss = src => new Promise((resolve, reject) => {\n const head = document.getElementsByTagName('head')[0]\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = 'text/css'\n link.href = src\n link.media = 'all'\n link.onload = resolve\n link.onerror = reject\n head.appendChild(link)\n})\n\nexport function* loadSequentially(sources) {\n const currentEnv = window.legacyActionEnv || 'new'\n const serverSettings = yield call(rest.fetchServerSettings)\n for (const source of sources) {\n if (source.envs.includes(currentEnv)) {\n yield call(source.handler, `${source.src}?v=${serverSettings.niceRevision}`)\n }\n }\n}\n\nexport const sources = [\n {src: '/nice2/javascript/lang.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-ext-newclient-actions.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-admin.release.js', handler: loadScript, envs: ['new']},\n {\n src: '/nice2/javascript/nice2-newclient-actions-public.release.js',\n handler: loadScript,\n envs: ['legacy-public']\n },\n {\n src: '/nice2/javascript/nice2-newclient-actions-setup.release.js',\n handler: loadScript,\n envs: ['legacy-public', 'legacy-admin', 'new']\n },\n {src: '/nice2/dwr-all.js', handler: loadScript, envs: ['new']},\n {src: '/js/ext-extensions/ckeditor/ckeditor/ckeditor.js', handler: loadScript, envs: ['new']},\n {src: '/css/themes/blue-medium.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-admin.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-new-client-legacy-actions.css', handler: loadCss, envs: ['new']}\n]\n\nexport const channelFeedingCallback = channel => arg => {\n channel.put(arg)\n}\n\nexport function* readRemoteEvents(remoteEventsChannel) {\n while (true) {\n const event = yield take(remoteEventsChannel)\n const action = remoteEvents.remoteEvent(event)\n yield put(action)\n }\n}\n\nexport function* registerRemoteEventsListener() {\n const dataRegistry = yield call([window.app, window.app.getDataRegistry])\n if (dataRegistry.setNewClientCallback) {\n const remoteEventsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, remoteEventsChannel)\n yield call([dataRegistry, dataRegistry.setNewClientCallback], callback)\n yield spawn(readRemoteEvents, remoteEventsChannel)\n }\n}\n\nexport function* handleNotification(notification) {\n const message = notification.message.replace(/ /g, ' ')\n\n let action\n\n switch (notification.level) {\n case 'ERROR':\n action = newNotification.toaster({type: 'error', title: message})\n break\n case 'INFO':\n action = newNotification.toaster({type: 'info', title: message})\n break\n default:\n throw new Error(`Unsupported notification level: ${notification.level}`)\n }\n\n if (action) {\n yield put(action)\n }\n}\n\nexport function* readNotifications(notificationsChannel) {\n while (true) {\n const notification = yield take(notificationsChannel)\n yield call(handleNotification, notification)\n }\n}\n\nexport function* registerNotificationsListener() {\n const gui = yield call([window.app, window.app.getGui])\n const notifier = yield call([gui, gui.getNotifier])\n if (notifier.setNewClientCallback) {\n const notificationsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, notificationsChannel)\n yield call([notifier, notifier.setNewClientCallback], callback)\n yield spawn(readNotifications, notificationsChannel)\n }\n}\n\nexport function* initLegacyActionsEnv() {\n if (window.legacyActionsEnvInitialized !== true) {\n yield call(loadSequentially, sources)\n yield call(window.setUpLegacyActionsEnv)\n }\n yield call(registerRemoteEventsListener)\n yield call(registerNotificationsListener)\n}\n\nexport const listSelector = state => state.list\n\nexport const entityListSelector = state => state.entityList\nexport const entityDetailSelector = state => state.entityDetail\n\nexport const getOrderByString = sortingArray => sortingArray && sortingArray.length > 0\n ? rest.createSortingString(sortingArray)\n : null\n\nexport const getManualQuery = (selection, listState) => ({\n ...new window.nice2.netui.ManualQuery(),\n entityName: selection.entityName,\n queryWhere: selection.query.where,\n queryOrderBy: getOrderByString(listState.sorting)\n})\n\nexport const getListFormId = listState => ({\n ...new window.form.FormIdentifier(),\n scope: 'list',\n formName: listState.formDefinition.id\n})\n\nexport function* getSelection(selection) {\n const legacySelection = {\n entityName: selection.entityName\n }\n\n if (selection.type === 'ID') {\n legacySelection.selectedEntities = selection.ids\n legacySelection.selectionType = 'SELECTION'\n } else if (selection.type === 'QUERY') {\n const listState = yield select(listSelector)\n\n legacySelection.selectionType = 'NEW_CLIENT_QUERY'\n legacySelection.manualQuery = getManualQuery(selection, listState)\n legacySelection.listForm = getListFormId(listState)\n legacySelection.searchFilters = selection.query.filter\n } else {\n throw new Error(`Unsupported selection type: ${selection.type}`)\n }\n\n return legacySelection\n}\n\nexport function* getScope() {\n const list = yield select(entityListSelector)\n const detail = yield select(entityDetailSelector)\n\n if (list && detail) {\n throw new Error('Unable to get form scope. Unexpected state: entityList and entityDetail exist')\n }\n\n if (list) {\n return 'list'\n }\n\n if (detail) {\n if (detail.mode === 'update') {\n return 'detail'\n } else if (detail.mode === 'create') {\n return 'create'\n } else {\n throw new Error(`Unable to get form scope. Unexpected detail mode: ${detail.mode}`)\n }\n }\n\n throw new Error('Unable to get form scope. Expected to find either entityList or entityDetail in state')\n}\n\nexport default function* (definition, selection, parent, params, config) {\n yield call(initLegacyActionsEnv)\n\n const actionDefinition = new window.nice2.netui.actions.model.ClientActionDefinition(definition.path, definition.id)\n actionDefinition.setEnabled(!definition.readOnly)\n if (_isPlainObject(definition.properties)) {\n const setPropertyEffects = Object.entries(definition.properties)\n .map(([key, value]) => call([actionDefinition, actionDefinition.setProperty], key, value))\n yield all(setPropertyEffects)\n }\n\n const entityExplorer = new window.nice2.modules.NewClientLegacyActionsModule({\n entityName: selection.entityName,\n formName: selection.entityName\n })\n entityExplorer.init()\n\n const panel = new window.nice2.modules.NewClientLegacyActionsPanel({\n entityName: selection.entityName\n })\n\n const ctx = new window.nice2.modules.entityexplorer.EntityExplorerActionContext(entityExplorer, panel)\n if (selection.type === 'ID' && selection.ids.length === 1) {\n ctx.getRecord = () => ({id: selection.ids[0]})\n }\n\n const situation = {\n entityName: selection.entityName,\n scope: definition.scope || (yield call(getScope))\n }\n\n const action = window.NetuiActionRegistry.newActionFromDefinition(actionDefinition, situation, ctx)\n\n const legacySelection = yield call(getSelection, selection)\n\n action.getSelectionNumber = () => selection.type === 'ID' ? selection.ids.length : 0\n action.getSelection = () => legacySelection\n\n action.perform()\n}\n","import actionTypes from '../../actionTypes'\nimport handleSimpleAction from './simpleAction'\nimport handleReportAction from './report'\nimport handleCustomAction from './customAction'\nimport handleLegacyAction from './legacyAction'\n\nexport default {\n [actionTypes.SIMPLE]: handleSimpleAction,\n [actionTypes.REPORT]: handleReportAction,\n [actionTypes.CUSTOM]: handleCustomAction,\n [actionTypes.LEGACY]: handleLegacyAction\n}\n","export default function* preCheckHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.success === false) {\n return {\n abort: true,\n abortMessage: preparationResponse.preCheck.message || 'client.component.actions.errorText'\n }\n }\n\n return {\n abort: false\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nexport default function* confirmHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.confirmMessage) {\n const confirmResponse = yield call(promptConfirm, preparationResponse.preCheck.confirmMessage)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(message) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n 'client.component.actions.confirmTitle',\n message,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport React from 'react'\n\nimport simpleFormConnector from '../../containers/simpleFormConnector'\nimport notification from '../../../notification'\n\nexport default function* initialFormHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.initialFormValues) {\n const formValues = yield call(handleInitialForm, preparationResponse.initialFormValues, config)\n\n return {\n abort: formValues === null,\n params: {formData: formValues}\n }\n }\n return {\n abort: false\n }\n}\n\nexport const formValues = formValues => ({formValues})\n\nexport function* handleInitialForm({formDefinition, defaultValues, formTitle, formMessage}, config) {\n const answerChannel = yield call(channel)\n\n const id = new Date().valueOf()\n const onSend = ({values}) => answerChannel.put(formValues(values))\n const onCancel = () => answerChannel.put(formValues(null))\n const SimpleFormContainer = simpleFormConnector(config.formApp)\n yield put(notification.modal(id, formTitle, formMessage, () =>\n <SimpleFormContainer\n form={formDefinition.form}\n listApp={config.listApp}\n onSubmit={onSend}\n onCancel={onCancel}\n defaultValues={defaultValues}\n mode=\"create\"\n />\n ))\n\n const response = yield take(answerChannel)\n yield put(notification.removeModal(id))\n return response.formValues ? {model: formDefinition.model, paths: response.formValues} : null\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nconst SELECTION_THRESHOLD_DEFAULT = 100\n\nexport default function* largeSelectionHandler(preparationResponse, params, definition, selection, config) {\n const threshold = definition.confirmationThreshold === null || definition.confirmationThreshold === undefined\n ? SELECTION_THRESHOLD_DEFAULT\n : definition.confirmationThreshold\n\n if (threshold !== -1 && selection && selection.count > threshold) {\n const confirmResponse = yield call(promptConfirm, selection.count)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(count) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n <FormattedMessage id=\"client.component.actions.confirmTitle\"/>,\n <FormattedMessage id=\"client.component.actions.largeSelectionConfirm\" values={{count}}/>,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport preCheckHandler from './preCheckHandler'\nimport confirmHandler from './confirmHandler'\nimport initialFormHandler from './initialFormHandler'\nimport largeSelectionHandler from './largeSelectionHandler'\n\nexport function* doRequest(definition, selection, parent) {\n const response = yield call(rest.requestSaga, definition.endpoint + '/check', {\n method: 'POST',\n body: {\n selection,\n parent\n }\n })\n return response.body\n}\n\nexport const getHandlers = () => [largeSelectionHandler, preCheckHandler, confirmHandler, initialFormHandler]\n\nexport default function* run(definition, selection, parent, config) {\n let abort = false\n let abortMessage = null\n let params = {}\n\n const preparationResponse = definition.endpoint\n ? yield call(doRequest, definition, selection, parent)\n : {}\n const handlers = yield call(getHandlers)\n\n let i = 0\n\n while (!abort && handlers[i]) {\n const handler = handlers[i]\n const handlerResponse = yield call(handler, preparationResponse, params, definition, selection, config)\n\n abort = handlerResponse.abort\n params = {...params, ...handlerResponse.params}\n if (handlerResponse.abortMessage) {\n abortMessage = handlerResponse.abortMessage\n }\n\n i++\n }\n\n return {abort, abortMessage, params}\n}\n","import prepare from './prepare'\n\nexport default prepare\n","import {takeEvery, all, call, put} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport actionHandlers from './actionHandlers'\nimport remoteEvents from '../../remoteEvents'\nimport prepare from './prepare'\nimport notification from '../../notification'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.ACTION_INVOKE, invokeAction, config)\n ])\n}\n\nexport function* invokeAction(config, {payload}) {\n const {definition, selection, parent} = payload\n\n const {abort, abortMessage, params} = yield call(prepare, definition, selection, parent, config)\n\n if (!abort) {\n const actionHandler = actionHandlers[definition.actionType]\n const response = yield call(actionHandler, definition, selection, parent, params, config)\n\n if (response && response.remoteEvents) {\n yield all(response.remoteEvents.map(remoteEvent => put(remoteEvents.remoteEvent(remoteEvent))))\n }\n\n if (response && response.success) {\n yield put(actions.actionInvoked(definition, selection, response))\n }\n } else if (abortMessage) {\n yield put(notification.toaster({type: 'info', title: abortMessage}))\n }\n}\n","export const isValidSelection = (selectedCount, {minSelection, maxSelection}) =>\n !(notEnough(selectedCount, minSelection) || tooMany(selectedCount, maxSelection))\n\nexport const selectionText = (selectedCount, {minSelection, maxSelection}, intl) => {\n if (notEnough(selectedCount, minSelection)) {\n return intl.formatMessage({id: 'client.component.actions.notEnoughSelected'}, {minSelection})\n }\n\n if (tooMany(selectedCount, maxSelection)) {\n return intl.formatMessage({id: 'client.component.actions.tooManySelected'}, {maxSelection})\n }\n\n return null\n}\n\nconst notEnough = (selectedCount, minSelection) => minSelection && selectedCount < minSelection\nconst tooMany = (selectedCount, maxSelection) => maxSelection && selectedCount > maxSelection\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\nimport {ButtonMenu, MenuItem} from 'tocco-ui'\n\nimport {isValidSelection, selectionText} from './selectionHelper'\n\nconst getChildMenuItems = input => {\n const {onClick, definition, selectedCount, intl} = input\n const validSelection = isValidSelection(selectedCount, definition)\n const disabled = definition.readonly === true || !validSelection\n const title = selectionText(selectedCount, definition, intl)\n const isActionGroup = definition.componentType === 'action-group'\n return <MenuItem\n {...(!isActionGroup && !disabled && {onClick: () => onClick(definition)})}\n disabled={disabled}\n title={title}\n key={`MenuItem-${definition.id}`}\n >\n <span>{definition.label}</span>\n {\n definition.componentType === 'action-group'\n && definition.children.map(child => getChildMenuItems({...input, definition: child}))\n }\n </MenuItem>\n}\n\nconst ActionGroup = props => {\n const {definition, onClick} = props\n const hasDefaultAction = (definition.defaultAction && Object.keys(definition.defaultAction).length > 0)\n\n const label = hasDefaultAction ? definition.defaultAction.label : definition.label\n const onClickHandler = hasDefaultAction\n ? () => {\n onClick(definition.defaultAction)\n }\n : null\n const actionId = hasDefaultAction ? definition.defaultAction.id : definition.id\n return <ButtonMenu\n buttonProps={{look: 'raised'}}\n label={label}\n data-cy={`action-${actionId}`}\n onClick={onClickHandler}\n icon={definition.icon}>\n {\n definition.children.map((childDefinition, idx) => getChildMenuItems({...props, definition: childDefinition}))\n }\n </ButtonMenu>\n}\n\nActionGroup.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(ActionGroup)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {isValidSelection, selectionText} from './selectionHelper'\n\nexport const SingleAction = ({\n definition,\n onClick,\n selectedCount,\n disabled,\n intl\n}) => <Button\n iconOnly={definition.buttonType === 'ICON'}\n data-cy={`action-${definition.id}`}\n look={definition.buttonType === 'ICON' ? 'flat' : 'raised'}\n withoutBackground={definition.buttonType === 'ICON'}\n onClick={e => {\n onClick(definition)\n e.stopPropagation()\n }}\n icon={definition.icon}\n label={getLabel(definition)}\n title={getTitle(selectedCount, definition, intl)}\n disabled={definition.readonly === true || !isValidSelection(selectedCount, definition) || disabled}\n />\n\nconst getLabel = definition => definition.label && shouldUseLabel(definition) ? definition.label : ''\n\nconst getTitle = (selectedCount, definition, intl) => selectionText(selectedCount, definition, intl)\n || (!shouldUseLabel(definition) ? definition.label : '')\n\nconst shouldUseLabel = definition => !(definition.useLabel === 'NO' || definition.useLabel === 'HIDE')\n\nSingleAction.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(SingleAction)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport _omit from 'lodash/omit'\n\nimport componentTypes from '../actionComponentTypes'\nimport {modeFitsScopes} from '../actions'\nimport ActionGroup from './ActionGroup'\nimport SingleAction from './SingleAction'\n\nconst ActionVisual = ({definition, onClick, selection, parent, mode, callback, disabled, customRenderedActions}) => {\n if (customRenderedActions && customRenderedActions[definition.id]) {\n return customRenderedActions[definition.id](definition)\n }\n\n if (!modeFitsScopes(mode, definition.scopes)) {\n return null\n }\n\n const ActionType = definition.componentType === componentTypes.ACTION_GROUP ? ActionGroup : SingleAction\n\n return (\n <ActionType\n definition={definition}\n onClick={definition => {\n onClick(_omit(definition, ['label']), selection, parent, callback)\n }}\n selectedCount={selection.count}\n disabled={disabled}\n />\n )\n}\n\nActionVisual.propTypes = {\n /**\n * Object as derived from the form definition.\n */\n definition: PropTypes.shape({\n id: PropTypes.string,\n type: PropTypes.string,\n useLabel: PropTypes.string,\n icon: PropTypes.string,\n label: PropTypes.string,\n config: PropTypes.object,\n scopes: PropTypes.arrayOf(PropTypes.string),\n componentType: PropTypes.string,\n children: PropTypes.Array,\n buttonType: PropTypes.oneOf(['REGULAR', 'ICON'])\n }).isRequired,\n selection: PropTypes.shape({\n entityName: PropTypes.string.isRequired,\n ids: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'ID' && !props.selection[propName]) {\n return new Error(`Selection.ids prop not defined. Component: ${componentName}'.`)\n }\n },\n query: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'QUERY' && !props.selection[propName]) {\n return new Error(`Selection.query prop not defined. Component: ${componentName}'.`)\n }\n },\n type: PropTypes.oneOf(['ID', 'QUERY']).isRequired,\n count: PropTypes.number\n }).isRequired,\n onClick: PropTypes.func.isRequired,\n callback: PropTypes.func,\n /**\n * Used to render action conditionally if mode fits definition mode.\n */\n mode: PropTypes.oneOf(['create', 'update']),\n /**\n * Depending on the context a parent entity of the current entity can be passed. This information\n * can be important when an action is executed.\n */\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n disabled: PropTypes.bool,\n /**\n * Used if a custom Rendering is desired. E.g. save button\n */\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\n}\n\nconst Action = props => {\n if (props.definition.componentType === componentTypes.ACTION_BAR) {\n return props.definition.children.map(child => (\n <ActionVisual key={`action-${props.definition.id}-${child.id}`} {...props} definition={child}/>\n )\n )\n }\n\n return <ActionVisual {...props}/>\n}\n\nAction.propTypes = {\n definition: PropTypes.shape({\n id: PropTypes.string,\n componentType: PropTypes.string,\n children: PropTypes.Array\n }).isRequired\n}\n\nexport default Action\n","import {connect} from 'react-redux'\n\nimport {actionInvoke} from '../modules/actions'\nimport Action from '../components/Action'\n\nconst mapActionCreators = {\n onClick: actionInvoke\n}\n\nexport default connect(null, mapActionCreators)(Action)\n","import {isAction} from './actions'\nimport addToStore from './addToStore'\nimport * as actions from './modules/actions'\nimport Action from './containers/ActionContainer'\nimport {getSingleEntitySelection} from './utils/selection'\n\nexport default {\n isAction,\n Action,\n addToStore,\n actions,\n getSingleEntitySelection\n}\n","import {saga as sagasUtil, reducer as reducerUtil} from 'tocco-util'\n\nimport errorLoging from '../errorLogging'\nimport reducer from './modules/reducer'\nimport sagas from './modules/sagas'\n\nexport default (store, config) => {\n reducerUtil.injectReducers(store, {actions: reducer})\n store.sagaMiddleware.run(sagasUtil.autoRestartSaga(sagas, config, errorLoging.logError))\n}\n","export const getSingleEntitySelection = (entityName, key) => ({\n entityName,\n type: 'ID',\n ids: [key],\n count: 1\n})\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nexport const StyledInputWrapper = styled.div`\n width: calc(100% - 20px); // subtract extender width\n`\nexport const StyledInputItemWrapper = styled.div`\n display: inline-block;\n width: 50%;\n\n * {\n line-height: unset !important;\n text-align: center;\n }\n`\n\nexport const StyledIconWrapper = styled.div`\n font-size: ${scale.font(-2.7)};\n display: flex;\n align-items: center;\n`\n\nexport const StyledRange = styled.div`\n display: flex;\n`\n\nexport const StyledInput = styled.div`\n flex: 1;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n width: inherit;\n`\n\nexport const StyledExtender = styled.div`\n display: flex;\n align-items: center;\n position: relative;\n left: 2px;\n z-index: 1;\n`\n","import moment from 'moment'\n\nconst datetimeFormat = 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\nconst dateFormat = 'YYYY-MM-DD'\n\nconst rangeTypeMappings = {\n datetime: {\n type: 'date',\n toRange: value => {\n const fromValue = value ? moment(value).utc().format(datetimeFormat) : null\n const toValue = value ? moment(value).utc().add(1, 'd').format(datetimeFormat) : null\n return {from: fromValue, to: toValue, isRangeValue: true}\n },\n fromRange: value => {\n if (value && value.from) {\n return moment.utc(value.from, datetimeFormat).local().format(dateFormat)\n }\n if (value && value.to) {\n return moment.utc(value.to, datetimeFormat).local().format(dateFormat)\n }\n return null\n },\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n },\n date: {\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n }\n}\n\nexport default rangeTypeMappings\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport _omit from 'lodash/omit'\n\nimport {\n StyledRange,\n StyledInputWrapper,\n StyledInputItemWrapper,\n StyledIconWrapper,\n StyledInput,\n StyledExtender\n} from './StyledRange'\nimport EditableValue from '../EditableValue'\nimport Ball from '../Ball'\nimport Icon from '../Icon'\nimport rangeTypeMappings from './rangeTypeMappings'\n\n/**\n * Allows to render EditableValues as a range. The value can be switched between a range or single value.\n */\nconst Range = props => {\n const {value, events, readOnly, type, options} = props\n const hasRangeValue = typeof value === 'object' && value && value.isRangeValue\n\n const exactEvents = useMemo(() => ({\n ...events,\n onChange: value => {\n events.onChange(value)\n }\n }))\n\n const toEvents = useMemo(() => ({\n onChange: toValue => {\n events.onChange({\n ...value,\n to: toValue\n })\n }\n }))\n\n const fromEvents = useMemo(() => ({\n onChange: fromValue => {\n events.onChange({\n ...value,\n from: fromValue\n })\n }\n }))\n\n const typeMapping = rangeTypeMappings[type]\n\n const getToOptions = (options, fromValue) =>\n typeMapping && typeMapping.getToOptions\n ? typeMapping.getToOptions(options, fromValue)\n : options\n\n const getFromOptions = (options, toValue) =>\n typeMapping && typeMapping.getFromOptions\n ? typeMapping.getFromOptions(options, toValue)\n : options\n\n const getFromOrTo = value =>\n typeMapping && typeMapping.fromRange\n ? typeMapping.fromRange(value)\n : value && value.from ? value.from : value && value.to ? value.to : null\n\n const getRangeValue = value =>\n typeMapping && typeMapping.toRange\n ? typeMapping.toRange(value)\n : {from: value, to: value, isRangeValue: true}\n\n const baseType = typeMapping && typeMapping.type ? typeMapping.type : type\n\n return <StyledRange>\n <StyledInputWrapper>\n {!hasRangeValue\n ? <EditableValue\n type={baseType}\n {..._omit(props, ['type'])}\n events={exactEvents}\n />\n : <StyledInput>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getFromOptions(options, value.to)}\n value={value && value.from ? value.from : null}\n events={fromEvents}\n />\n </StyledInputItemWrapper>\n <StyledIconWrapper>\n <Icon icon=\"horizontal-rule\"/>\n </StyledIconWrapper>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getToOptions(options, value.from)}\n value={value && value.to ? value.to : null}\n events={toEvents}\n />\n </StyledInputItemWrapper>\n </StyledInput>}\n </StyledInputWrapper>\n <StyledExtender>\n <Ball disabled={readOnly} icon={hasRangeValue ? 'chevron-left' : 'chevron-down'} onClick={() => {\n if (hasRangeValue) {\n events.onChange(getFromOrTo(value))\n } else {\n events.onChange(getRangeValue(value))\n }\n }}>\n </Ball>\n </StyledExtender>\n </StyledRange>\n}\n\nRange.propTypes = {\n /**\n * EditableValue type\n */\n type: PropTypes.string,\n /**\n * The Range Component can either handle a single value or and object with the following three\n * attributes: isRangeValue (true), from, to. The later two are single values.\n * example:\n * {\n * isRangeValue: true,\n * from: 1,\n * to: 2\n * }\n */\n value: PropTypes.any,\n /**\n * See EditableValue\n */\n events: PropTypes.shape({\n onChange: PropTypes.func\n }).isRequired,\n /**\n * See EditableValue\n */\n readOnly: PropTypes.bool,\n /**\n * See EditableValue\n */\n options: PropTypes.object,\n /**\n * Shown above \"from\" input\n */\n fromText: PropTypes.string,\n /**\n * Shown above \"to\" input\n */\n toText: PropTypes.string\n}\n\nexport default Range\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","export default {\n getOptions: ({formField, formName, formData}) => ({\n upload: document => {\n formData.uploadDocument(formName, formField.id, document)\n },\n uploadText: formData.intl.formatMessage({id: 'client.component.upload.upload'}),\n uploadingText: formData.intl.formatMessage({id: 'client.component.upload.uploading'}),\n downloadText: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'}),\n deleteText: formData.intl.formatMessage({id: 'client.component.upload.deleteTitle'})\n }),\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n hasValue: (value, formField) => {\n const locationMapping = formField.locationMapping\n return !!(value[locationMapping.city] || value[locationMapping.postcode])\n },\n getValue: ({formField, formData}) => {\n const locationMapping = formField.locationMapping\n const filteredLocationData = formData.formValues\n\n let renamedLocationData = {}\n for (const locKey in locationMapping) {\n for (const filteredLocDataKey in filteredLocationData) {\n if (locationMapping[locKey] === filteredLocDataKey) {\n renamedLocationData = {...renamedLocationData, [locKey]: filteredLocationData[filteredLocDataKey]}\n }\n }\n }\n return renamedLocationData\n },\n getEvents: ({formField, formName, formData, events}) => {\n const locationMapping = formField.locationMapping || {}\n const onChange = locationObject => {\n for (const key in locationMapping) {\n if (locationMapping[key] && locationObject[key] !== undefined) {\n formData.changeFieldValue(formName, locationMapping[key], locationObject[key])\n }\n }\n }\n return {\n ...events,\n onChange,\n onBlur: () => {\n formData.touchField(formName, formField.id)\n }\n }\n },\n dataContainerProps: ({formField, formName}) => ({\n locations: [formField.id],\n formValues: {\n formName: formName,\n fields: formField.locationMapping ? Object.values(formField.locationMapping) : {}\n },\n isDirty: {\n formName: formName,\n fields: formField.locationMapping\n ? [formField.locationMapping.city, formField.locationMapping.postcode]\n : []\n },\n errors: {\n formName: formName,\n fields: [formField.locationMapping.city, formField.locationMapping.postcode]\n }\n }),\n getOptions: ({formField, formData}) => ({\n fetchSuggestions: (searchTerm, country) =>\n formData.loadLocationsSuggestions(formField.id, searchTerm, country, _get(formField, 'countries')),\n isLoading: _get(formData, ['locations', formField.id, 'isLoading'], false),\n suggestions: _get(formData, ['locations', formField.id, 'suggestions'], null),\n mapButtonTitle: formData.intl.formatMessage({id: 'client.component.location.mapButtonTitle'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","import _get from 'lodash/get'\nimport React from 'react'\n\nconst settings = {\n SEARCH_RESULT_LIMIT: 50,\n SUGGESTION_LIMIT: 10,\n SUGGESTION_ORDER_FIELD: 'update_timestamp'\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity],\n navigationStrategy: true\n }),\n getOptions: ({formField, formName, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n moreOptionsAvailable: _get(formData, ['relationEntities', formField.id, 'moreEntitiesAvailable'], false),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: true,\n limit: settings.SUGGESTION_LIMIT,\n sorting: [{field: settings.SUGGESTION_ORDER_FIELD, order: 'desc'}],\n formBase: formField.formBase,\n formName: formField.formName\n }),\n searchOptions: searchTerm => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n searchTerm,\n limit: settings.SEARCH_RESULT_LIMIT,\n forceReload: true,\n formBase: formField.formBase,\n formName: formField.formName\n }),\n openAdvancedSearch: value => formData.openAdvancedSearch(formName, formField, value),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.noResultsText'}\n ),\n moreOptionsAvailableText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.moreOptionsAvailableText'}\n ),\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null,\n createPermission: formField.relationName\n && _get(formData, ['entityModel', 'paths', formField.relationName, 'createPermission'], false),\n openRemoteCreate: () => formData.openRemoteCreate(formField, formName, formData)\n })\n}\n","import _get from 'lodash/get'\n\nconst settings = {\n LIMIT: 10000\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity]\n }),\n getOptions: ({formField, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage({id: 'client.component.remoteselect.noResultsText'}),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: false,\n limit: settings.LIMIT,\n constriction: formField.constriction\n })\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import decimal from './decimal'\nimport document from './document'\nimport duration from './duration'\nimport integer from './integer'\nimport location from './location'\nimport moneyamount from './moneyamount'\nimport number from './number'\nimport phone from './phone'\nimport remote from './remote'\nimport select from './select'\nimport searchFilter from './searchFilter'\nimport html from './html'\nimport boolean from './boolean'\nimport percent from './percent'\n\nexport default {\n 'binary': document,\n 'boolean': boolean,\n 'counter': number,\n 'data-amount': number,\n 'decimal': decimal,\n 'document': document,\n 'double': decimal,\n 'duration': duration,\n 'html': html,\n 'image': document,\n 'integer': integer,\n 'location': location,\n 'long': integer,\n 'moneyamount': moneyamount,\n 'marking': boolean,\n 'multi-remote-field': remote,\n 'multi-select-box': select,\n 'named-upload': document,\n 'number': number,\n 'phone': phone,\n 'search-filter': searchFilter,\n 'single-remote-field': remote,\n 'single-select-box': select,\n 'sorting': number,\n 'percent': percent\n}\n","export default {\n getOptions: ({formData}) => ({\n hoursLabel: formData.intl.formatMessage({id: 'client.component.duration.hoursLabel'}),\n minutesLabel: formData.intl.formatMessage({id: 'client.component.duration.minutesLabel'})\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true,\n fixedDecimalScale: true\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n customPhoneRegex: _get(formField, 'validation.phone.customRegex', null),\n defaultCountry: _get(formField, 'validation.phone.defaultRegion', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n dataContainerProps: ({formField}) => ({\n searchFilters: [formField.model]\n }),\n getOptions: ({formField, formData}) => ({\n isMulti: formField.multiple,\n options: _get(formData.searchFilters, formField.model, null),\n fetchOptions: () => formData.loadSearchFilters(formField.model, formField.group),\n noResultsText: formData.intl.formatMessage({id: 'client.component.searchfilter.noResultsText'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: false\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {EditableValue, Range} from 'tocco-ui'\n\nimport editableTypeConfigs from './editableTypeConfigs'\n\nconst getEvents = (type, formField, formName, formData, events) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getEvents\n ? editableTypeConfigs[type].getEvents({formField, formName, formData, events})\n : events\n\nconst getValue = (type, formField, formName, formData, currentValue) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getValue\n ? editableTypeConfigs[type].getValue({formField, formName, formData, currentValue})\n : currentValue\n\nconst getOptions = (type, formField, formName, formData) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getOptions\n ? editableTypeConfigs[type].getOptions({formField, formName, formData})\n : {}\n\nconst EditableValueFactory = ({type, range, formField, formName, value, info, events, formData}) => {\n const formType = formField.dataType || formField.componentType\n const options = getOptions(formType, formField, formName, formData)\n\n events = getEvents(formType, formField, formName, formData, events)\n value = getValue(formType, formField, formName, formData, value)\n\n const Component = range ? Range : EditableValue\n\n return (\n <Component\n type={type}\n events={events}\n value={value}\n {...info}\n options={options}\n {...(range && {\n fromText: formData.intl.formatMessage({id: 'client.component.range.from'}),\n toText: formData.intl.formatMessage({id: 'client.component.range.to'})\n })}\n />\n )\n}\n\nEditableValueFactory.propTypes = {\n type: PropTypes.string,\n range: PropTypes.bool,\n formName: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n info: PropTypes.object,\n events: PropTypes.object,\n formData: PropTypes.object\n}\n\nexport default (type, range) => props => <EditableValueFactory type={type} range={range} {...props}/>\n","export default {\n getOptions: ({formData}) => ({\n downloadTitle: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'})\n })\n}\n","import React from 'react'\nexport default {\n getOptions: ({formField, formData}) => ({\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null\n })\n\n}\n","import document from './document'\nimport remote from './remote'\nimport description from './description'\nimport number from './number'\nimport moneyamount from './moneyamount'\n\nexport default {\n 'document-compact': document,\n 'multi-remote-field': remote,\n 'single-remote-field': remote,\n 'description': description,\n 'number': number,\n 'moneyamount': moneyamount\n}\n","export default {\n getOptions: ({formField}) => ({\n mode: formField.mode,\n title: formField.title\n }),\n getValue: ({formField}) => formField.text\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null)\n })\n}\n","\nimport _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2)\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedValue} from 'tocco-ui'\n\nimport formattedTypeConfigs from './formattedTypeConfigs'\n\nconst getOptions = (fieldType, formField, formData) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getOptions\n ? formattedTypeConfigs[fieldType].getOptions({formField, formData})\n : {}\n\nconst getValue = (fieldType, formField, formData, value) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getValue\n ? formattedTypeConfigs[fieldType].getValue({formField, formData})\n : value\n\nconst FormattedValueFactory = ({type, formField, value, formData, key, breakWords}) => {\n const fieldType = formField.dataType || formField.componentType\n const options = getOptions(fieldType, formField, formData, value)\n const overwrittenValue = getValue(fieldType, formField, formData, value)\n\n return <FormattedValue key={key} type={type} value={overwrittenValue} options={options} breakWords={breakWords}/>\n}\n\nFormattedValueFactory.propTypes = {\n type: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n formData: PropTypes.object,\n key: PropTypes.string,\n breakWords: PropTypes.bool\n}\n\nexport default type => props => <FormattedValueFactory {...props} type={type}/>\n","import editableValueFactory from './editableValueFactory'\nimport formattedValueFactory from './formattedValueFactory'\n\nconst editableMapping = {\n 'binary': editableValueFactory('document'),\n 'birthdate': editableValueFactory('date'),\n 'boolean': editableValueFactory('boolean'),\n 'char': editableValueFactory('string'),\n 'code': editableValueFactory('text'),\n 'count': editableValueFactory('string'),\n 'counter': editableValueFactory('integer'),\n 'createts': editableValueFactory('datetime'),\n 'createuser': editableValueFactory('string'),\n 'compressed-text': editableValueFactory('text'),\n 'date': editableValueFactory('date'),\n 'datetime': editableValueFactory('datetime'),\n 'decimal': editableValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'document': editableValueFactory('document'),\n 'double': editableValueFactory('number'),\n 'duration': editableValueFactory('duration'),\n 'email': editableValueFactory('string'),\n 'fulltext-search': editableValueFactory('string'),\n 'html': editableValueFactory('html'),\n 'image': editableValueFactory('document'),\n 'identifier': editableValueFactory('string'),\n 'integer': editableValueFactory('integer'),\n 'ipaddress': editableValueFactory('string'),\n 'latitude': editableValueFactory('string'),\n 'location': editableValueFactory('location'),\n 'login': editableValueFactory('string'),\n 'long': editableValueFactory('integer'),\n 'longitude': editableValueFactory('string'),\n 'marking': editableValueFactory('boolean'),\n 'moneyamount': editableValueFactory('number'),\n 'multi-remote-field': editableValueFactory('multi-remote'),\n 'multi-select-box': editableValueFactory('multi-select'),\n 'named-upload': editableValueFactory('document'),\n 'percent': editableValueFactory('number'),\n 'phone': editableValueFactory('phone'),\n 'postcode': editableValueFactory('string'),\n 'pulldown-date': editableValueFactory('date'),\n 'search-filter': editableValueFactory('search-filter'),\n 'serial': editableValueFactory('string'),\n 'single-remote-field': editableValueFactory('remote'),\n 'single-select-box': editableValueFactory('single-select'),\n 'sorting': editableValueFactory('integer'),\n 'string': editableValueFactory('string'),\n 'text': editableValueFactory('text'),\n 'text-area': editableValueFactory('text'),\n 'time': editableValueFactory('time'),\n 'updatets': editableValueFactory('datetime'),\n 'updateuser': editableValueFactory('string'),\n 'upload': editableValueFactory('document'),\n 'url': editableValueFactory('url'),\n 'uuid': editableValueFactory('string'),\n 'version': editableValueFactory('integer')\n}\nconst readOnlyMapping = {\n 'binary': formattedValueFactory('document'),\n 'birthdate': formattedValueFactory('date'),\n 'boolean': formattedValueFactory('boolean'),\n 'code': formattedValueFactory('text'),\n 'char': formattedValueFactory('string'),\n 'counter': formattedValueFactory('integer'),\n 'createuser': formattedValueFactory('string'),\n 'createts': formattedValueFactory('datetime'),\n 'compressed-text': formattedValueFactory('text'),\n 'data-amount': formattedValueFactory('number'),\n 'date': formattedValueFactory('date'),\n 'datetime': formattedValueFactory('datetime'),\n 'decimal': formattedValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'duration': formattedValueFactory('duration'),\n 'document': formattedValueFactory('document'),\n 'double': formattedValueFactory('number'),\n 'email': formattedValueFactory('string'),\n 'html': formattedValueFactory('html'),\n 'image': formattedValueFactory('document'),\n 'ipaddress': formattedValueFactory('string'),\n 'identifier': formattedValueFactory('string'),\n 'latitude': formattedValueFactory('string'),\n 'login': formattedValueFactory('string'),\n 'long': formattedValueFactory('integer'),\n 'longitude': formattedValueFactory('string'),\n 'moneyamount': formattedValueFactory('number'),\n 'multi-remote-field': formattedValueFactory('multi-remote'),\n 'multi-select-box': formattedValueFactory('multi-select'),\n 'named-upload': formattedValueFactory('document'),\n 'integer': formattedValueFactory('integer'),\n 'percent': formattedValueFactory('number'),\n 'phone': formattedValueFactory('phone'),\n 'postcode': formattedValueFactory('string'),\n 'pulldown-date': formattedValueFactory('date'),\n 'remote': formattedValueFactory('remote'),\n 'search-filter': formattedValueFactory('search-filter'),\n 'serial': formattedValueFactory('string'),\n 'single-remote-field': formattedValueFactory('remote'),\n 'single-select-box': formattedValueFactory('single-select'),\n 'sorting': formattedValueFactory('integer'),\n 'string': formattedValueFactory('string'),\n 'text': formattedValueFactory('text'),\n 'text-area': formattedValueFactory('text'),\n 'time': formattedValueFactory('time'),\n 'updatets': formattedValueFactory('datetime'),\n 'updateuser': formattedValueFactory('string'),\n 'upload': formattedValueFactory('document'),\n 'url': formattedValueFactory('url'),\n 'uuid': formattedValueFactory('string'),\n 'version': formattedValueFactory('integer')\n}\n\nconst listMapping = {\n ...readOnlyMapping,\n binary: formattedValueFactory('document-compact'),\n document: formattedValueFactory('document-compact'),\n image: formattedValueFactory('document-compact')\n}\n\nconst searchMapping = {\n ...editableMapping,\n text: editableValueFactory('string'),\n birthdate: editableValueFactory('date', true),\n date: editableValueFactory('date', true),\n updatets: editableValueFactory('datetime', true),\n createts: editableValueFactory('datetime', true),\n datetime: editableValueFactory('datetime', true),\n moneyamount: editableValueFactory('number', true),\n percent: editableValueFactory('number', true),\n long: editableValueFactory('integer', true),\n integer: editableValueFactory('integer', true),\n decimal: editableValueFactory('number', true),\n counter: editableValueFactory('integer', true),\n time: editableValueFactory('time', true)\n}\n\nexport default {\n editable: editableMapping,\n readOnly: readOnlyMapping,\n list: listMapping,\n search: searchMapping\n}\n","import React from 'react'\nimport {consoleLogger} from 'tocco-util'\n\nimport mappings from './mappings'\n\nexport default (mappingType, type) => {\n if (!mappings[mappingType] || !mappings[mappingType][type]) {\n consoleLogger.log(`Unable to display field: unknown mapping type combination (${mappingType} / ${type})`)\n return () => <span/>\n }\n\n return mappings[mappingType][type]\n}\n","import factory from './fieldFactory'\nimport editableTypeConfigs from './editableTypeConfigs'\n\nexport default {factory, editableTypeConfigs}\n","import _forOwn from 'lodash/forOwn'\nimport _reduce from 'lodash/reduce'\nimport _pick from 'lodash/pick'\n\nexport const generalErrorField = '_error'\nexport const entityValidatorErrorsField = 'entityValidatorErrors'\nexport const relatedEntityErrorsField = 'relatedEntityErrors'\nexport const outdatedErrorField = 'outdatedError'\n\nconst getFieldErrors = formErrors => {\n const fieldErrors = {...formErrors}\n delete fieldErrors[generalErrorField]\n return fieldErrors\n}\n\nconst hasFieldErrors = formErrors => (\n Object.keys(getFieldErrors(formErrors)).length >= 1\n)\n\nconst hasValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[entityValidatorErrorsField] && Object.keys(errors[entityValidatorErrorsField]).length >= 1)\n}\n\nconst getValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return _reduce(errors[entityValidatorErrorsField], (result, value) => [...result, ...value], [])\n}\n\nconst hasRelatedEntityErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[relatedEntityErrorsField] && errors[relatedEntityErrorsField].length >= 1)\n}\n\nconst getGeneralErrors = formErrors => (\n formErrors[generalErrorField]\n)\n\nconst getFirstErrorField = formErrors => (\n Object.keys(getFieldErrors(formErrors))[0]\n)\n\nconst hasOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[outdatedErrorField] && Object.keys(errors[outdatedErrorField]).length >= 1)\n}\n\nconst outdatedResponseToFormError = (response, entity) => ({\n [generalErrorField]: {\n [outdatedErrorField]: {\n ..._pick(response, ['updateTimestamp', 'updateUser', 'key', 'model']),\n sameEntity: entity.model === response.model && entity.key === response.key\n }\n }\n})\n\nconst getOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return errors[outdatedErrorField]\n}\n\nconst getRelatedEntityErrorsCompact = formErrors => {\n const relatedEntityErrors = getGeneralErrors(formErrors).relatedEntityErrors\n\n return _reduce(relatedEntityErrors, (result, relatedEntityError) => {\n const {key, model, paths, entityValidatorErrors} = relatedEntityError\n\n const r = [...result]\n _forOwn(paths, (values, fieldName) => {\n _forOwn(values, (errors, errorKey) => {\n r.push(...(errors.map(e => `${e} (${fieldName}, ${model}, ${key})`)))\n })\n })\n\n if (entityValidatorErrors && Object.keys(entityValidatorErrors).length >= 1) {\n r.push(...(\n _reduce(\n entityValidatorErrors,\n (result, value) => [...result, ...(value.map(e => `${e} (${model}, ${key})`))],\n []))\n )\n }\n\n return r\n }, [])\n}\n\nconst addErrors = (errors, field, fieldErrors) => (\n {\n ...errors,\n [field]:\n {\n ...(errors[field] || {}),\n ...(fieldErrors || {})\n }\n }\n)\n\nexport default {\n hasFieldErrors,\n getFieldErrors,\n getValidatorErrors,\n hasValidatorErrors,\n hasRelatedEntityErrors,\n hasOutdatedError,\n getFirstErrorField,\n getRelatedEntityErrorsCompact,\n addErrors,\n outdatedResponseToFormError,\n getOutdatedError\n}\n","import PropTypes from 'prop-types'\nimport React, {memo} from 'react'\n\nimport StyledLayoutBox from './StyledLayoutBox'\n\n/**\n * Wrap as many <Layout.Box/> into a <Layout.Container> to layout them.\n */\nconst LayoutBox = ({children}) => (\n <StyledLayoutBox>\n {children}\n </StyledLayoutBox>\n)\n\nLayoutBox.propTypes = {\n children: PropTypes.node\n}\n\nexport default memo(LayoutBox)\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutContainer = styled.div`\n display: grid;\n padding-right: ${scale.space(0)};\n ${({\n containerWidth,\n theme,\n minBoxWidth\n }) => containerWidth < 600\n ? 'grid-template-columns: 100%;'\n : `grid-template-columns: repeat(auto-fit, minmax(${minBoxWidth}px, 1fr));\n grid-gap: ${scale.space(0.25)({theme})}`\n };\n ${({occupiesRemainingHeight}) => occupiesRemainingHeight && `\n flex: 1;\n `};\n`\n\nexport default StyledLayoutContainer\n","import PropTypes from 'prop-types'\nimport React, {useRef, useState, useEffect} from 'react'\n\nimport StyledLayoutContainer from './StyledLayoutContainer'\n\nconst LayoutContainer = ({\n children,\n occupiesRemainingHeight,\n minBoxWidth\n}) => {\n const ref = useRef(null)\n const [containerWidth, setContainerWidth] = useState(0)\n\n const setPixelWidth = () => {\n setContainerWidth(ref.current.offsetWidth)\n }\n\n useEffect(() => {\n setPixelWidth()\n window.addEventListener('resize', setPixelWidth)\n return () => window.removeEventListener('resize', setPixelWidth)\n }, [])\n\n return (\n <StyledLayoutContainer\n ref={ref}\n containerWidth={containerWidth}\n occupiesRemainingHeight={occupiesRemainingHeight}\n minBoxWidth={minBoxWidth}>\n {children}\n </StyledLayoutContainer>\n )\n}\n\nLayoutContainer.propTypes = {\n children: PropTypes.node,\n occupiesRemainingHeight: PropTypes.bool,\n minBoxWidth: PropTypes.number\n}\n\nLayoutContainer.defaultProps = {\n minBoxWidth: 250\n}\n\nexport default LayoutContainer\n","import Box from './LayoutBox'\nimport Container from './LayoutContainer'\nimport StyledLayoutBox from './StyledLayoutBox'\nimport StyledLayoutContainer from './StyledLayoutContainer'\nimport {StyledScrollbar} from './StyledScrollbar'\n\nexport {\n StyledLayoutBox,\n StyledLayoutContainer,\n StyledScrollbar\n}\n\nexport default {\n Box,\n Container\n}\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport _get from 'lodash/get'\nimport {StatedValue, Typography} from 'tocco-ui'\nimport {consoleLogger} from 'tocco-util'\n\nimport field from '../field'\nimport fromData from '../formData'\n\nconst FormFieldWrapper = props => {\n const hasValueOverwrite = props.typeEditable && props.typeEditable.hasValue\n && props.typeEditable.hasValue(props.formData.formValues, props.formField)\n\n return <StatedValue\n {...props}\n dirty={props.formData.isDirty || props.dirty}\n error={props.formData.errors || props.error}\n hasValue={hasValueOverwrite || props.hasValue}\n >\n {React.cloneElement(props.children, {formData: props.formData})}\n </StatedValue>\n}\n\nFormFieldWrapper.propTypes = {\n typeEditable: PropTypes.object,\n children: PropTypes.node,\n formData: PropTypes.object,\n formField: PropTypes.object,\n dirty: PropTypes.bool,\n error: PropTypes.object,\n hasValue: PropTypes.bool\n}\n\nconst displayFieldTypes = ['display', 'description']\nconst multiTypes = ['multi-select-box', 'multi-remote-field', 'search-filter']\n\nconst isMultipleFields = (value, dataType) =>\n Array.isArray(value) && !multiTypes.includes(dataType)\n\nconst displayFieldAsDisplayOnly = (value, componentType, dataType, parentReadOnly) => {\n if (parentReadOnly) {\n return true\n }\n\n if (displayFieldTypes.includes(componentType)) {\n return true\n }\n\n if (isMultipleFields(value, dataType)) {\n return true\n }\n\n return false\n}\n\nexport const formFieldFactory = (fieldMappingType, data, resources = {}) => {\n try {\n const {\n formDefinitionField,\n entityField,\n id,\n value,\n dirty,\n touched,\n events,\n error,\n submitting,\n parentReadOnly,\n formName,\n mode\n } = data\n\n const {\n componentType,\n dataType,\n readonly\n } = formDefinitionField\n\n const readOnly = (\n parentReadOnly\n || readonly\n || submitting\n || !_get(entityField, 'writable', true)\n )\n\n const mandatory = !readOnly && _get(formDefinitionField, 'validation.mandatory', false) && mode !== 'search'\n const hasValue = value !== null\n && value !== undefined\n && value !== false\n && (value.length === undefined || value.length > 0)\n const isDisplay = displayFieldAsDisplayOnly(value, componentType, dataType, parentReadOnly)\n\n const type = formDefinitionField.dataType || formDefinitionField.componentType\n let requestedFromData\n\n const typeEditable = field.editableTypeConfigs[type]\n\n if (typeEditable && typeEditable.dataContainerProps) {\n requestedFromData = typeEditable.dataContainerProps({formField: formDefinitionField, formName})\n }\n\n const fixLabel = typeEditable && typeEditable.fixLabel && typeEditable.fixLabel()\n\n return (\n <fromData.FormDataContainer {...requestedFromData}>\n <FormFieldWrapper\n typeEditable={typeEditable}\n dirty={dirty}\n error={error}\n hasValue={hasValue}\n id={id}\n immutable={readOnly}\n isDisplay={isDisplay}\n key={id}\n label={formDefinitionField.label}\n mandatory={mandatory}\n mandatoryTitle={resources.mandatoryTitle}\n touched={touched}\n fixLabel={fixLabel}\n formField={formDefinitionField}\n >\n <ValueField\n fieldMappingType={isDisplay ? 'readOnly' : fieldMappingType}\n formName={formName}\n formField={formDefinitionField}\n value={value}\n info={{id, readOnly, mandatory}}\n events={events}\n />\n </FormFieldWrapper>\n </fromData.FormDataContainer>\n )\n } catch (exception) {\n consoleLogger.logError('Error creating formField', exception)\n return <span/>\n }\n}\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst ValueField = ({\n fieldMappingType,\n formName,\n formField,\n value,\n info,\n events,\n formData\n}) => {\n const Field = useMemo(() =>\n field.factory(fieldMappingType, formField.dataType || formField.componentType), []\n )\n\n if (isMultipleFields(value, formField.dataType)) {\n return value\n .map((v, idx) => <Field\n formField={formField}\n formName={formName}\n value={v}\n info={info}\n events={events}\n formData={formData}\n key={'valueField-' + formField.id + idx}\n />)\n .reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n }\n\n return <Field\n formField={formField}\n formName={formName}\n value={value}\n info={info}\n events={events}\n formData={formData}\n />\n}\n\nValueField.propTypes = {\n events: PropTypes.objectOf(PropTypes.func),\n fieldMappingType: PropTypes.string.isRequired,\n formData: PropTypes.object,\n formField: PropTypes.object,\n formName: PropTypes.string,\n info: PropTypes.object,\n value: PropTypes.any\n}\n","import {formFieldFactory} from './formField'\n\nexport default {formFieldFactory}\n","import PropTypes from 'prop-types'\nimport _omit from 'lodash/omit'\nimport {injectIntl} from 'react-intl'\n\nimport formField from '../formField'\n\nconst extractEventsFromInput = input => (\n _omit(input, ['name', 'value'])\n)\n\nconst ReduxFormFieldAdapter = props => {\n const {\n input,\n meta: {dirty, touched, error, submitting},\n id,\n formDefinitionField,\n entityField,\n parentReadOnly,\n formName,\n mode\n } = props\n\n const events = extractEventsFromInput(input)\n\n const fomFieldData = {\n formDefinitionField,\n id,\n formName,\n value: input.value,\n dirty,\n touched,\n submitting,\n events,\n error,\n entityField,\n parentReadOnly,\n mode\n }\n const resources = {\n mandatoryTitle: props.intl.formatMessage({id: 'client.component.form.mandatoryFieldTitle'})\n }\n\n return formField.formFieldFactory(props.fieldMappingType, fomFieldData, resources)\n}\n\nReduxFormFieldAdapter.propTypes = {\n intl: PropTypes.object.isRequired,\n id: PropTypes.string,\n input: PropTypes.shape({\n value: PropTypes.any,\n name: PropTypes.string,\n onChange: PropTypes.func\n }).isRequired,\n meta: PropTypes.shape({\n touched: PropTypes.bool,\n error: PropTypes.objectOf(\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n ),\n dirty: PropTypes.bool,\n submitting: PropTypes.bool\n }).isRequired,\n formDefinitionField: PropTypes.object.isRequired,\n entityField: PropTypes.object,\n parentReadOnly: PropTypes.bool,\n fieldMappingType: PropTypes.string.isRequired,\n mode: PropTypes.string\n}\n\nexport default injectIntl(ReduxFormFieldAdapter)\n","export default Object.freeze({\n FIELD_SET: 'field-set',\n FIELD: 'field',\n ACTION: 'action',\n ACTION_BAR: 'action-bar',\n LAYOUT: 'layout',\n TABLE: 'table',\n SUB_TABLE: 'sub-table',\n DISPLAY: 'display'\n})\n","import _uniq from 'lodash/uniq'\n\nimport componentTypes from './enums/componentTypes'\n\nexport const getFieldId = (formName, fieldName) => (\n `input-${formName}-${fieldName}`\n)\n\nexport const getFieldDefinitions = formDefinition => {\n return getFieldsOfChildren(formDefinition)\n}\n\nconst validFieldTypes = [\n componentTypes.FIELD,\n componentTypes.DISPLAY\n]\n\nconst getFieldsOfChildren = definition => {\n const result = []\n\n for (let i = 0; i < definition.children.length; i++) {\n if (definition.children[i].children) {\n result.push(...getFieldsOfChildren(definition.children[i]))\n }\n\n const componentType = definition.children[i].componentType\n if (validFieldTypes.includes(componentType) && definition.hidden !== true) {\n result.push({\n ...definition.children[i],\n readonly: definition.readonly,\n ignoreCopy: definition.ignoreCopy\n })\n }\n }\n\n return result\n}\n\nexport const getDefaultValues = fieldDefinitions =>\n fieldDefinitions\n .filter(f => f.defaultValue !== null && f.defaultValue !== undefined) // have to check both, values may be falsy\n .reduce((valueObj, field) => ({\n ...valueObj,\n [field.path || field.id]: field.defaultValue\n }), {})\n\nconst typePathsHandlers = {\n location: fieldDefinition => Object.values(fieldDefinition.locationMapping).filter(v => v)\n}\n\nexport const getUsedPaths = fieldDefinitions =>\n _uniq(\n fieldDefinitions\n .filter(field => field.componentType === componentTypes.FIELD)\n .reduce((accumulator, field) =>\n [\n ...accumulator,\n ...(typePathsHandlers[field.dataType] ? typePathsHandlers[field.dataType](field) : [field.path || field.id])\n ],\n [])\n )\n","import _forOwn from 'lodash/forOwn'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\n\nimport {generalErrorField, entityValidatorErrorsField, relatedEntityErrorsField} from './formErrors'\n\nexport const validationErrorToFormError = (entity, errors) => {\n let result = {[generalErrorField]: {[relatedEntityErrorsField]: []}}\n\n if (!errors) {\n return result\n }\n errors.forEach(error => {\n if (error.model === entity.model && ((!entity.key && !error.key) || error.key === entity.key)) {\n result = {...result, ...error.paths}\n if (Object.prototype.hasOwnProperty.call(error, entityValidatorErrorsField)) {\n result[generalErrorField][entityValidatorErrorsField] = error[entityValidatorErrorsField]\n }\n } else {\n result[generalErrorField][relatedEntityErrorsField].push(error)\n }\n })\n return result\n}\n\n// workaround: redux-forms can't get the value of a field if the field-name contains a dot.\nexport const transformFieldName = fieldName => (fieldName.replace(/\\./g, '--'))\nexport const transformFieldNameBack = fieldName => (fieldName.replace(/--/g, '.'))\n\nexport const entityToFormValues = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldName(key)]: val}), {})\n}\n\nexport const formValuesToFlattenEntity = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldNameBack(key)]: val}), {})\n}\n\nexport const getDirtyFields = (initialValues, values, isCreate) => {\n const dirtyFields = []\n\n _forOwn(values, (value, key) => {\n if (isCreate || !_isEqual(value, initialValues[key])) {\n dirtyFields.push(key)\n }\n })\n\n return dirtyFields\n}\n\nexport const isValueEmpty = v =>\n v === null\n || v === undefined\n || v === ''\n || (Array.isArray(v) && v.length === 0)\n || (typeof v === 'object' && Object.keys(v).length === 0)\n","export default Object.freeze({\n VERTICAL_BOX: 'vertical-box',\n HORIZONTAL_BOX: 'horizontal-box'\n})\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledActionsWrapper = styled.div`\n background-color: ${theme.color('paper')};\n padding-bottom: ${scale.space(-0.5)};\n display: flex;\n flex-wrap: wrap;\n z-index: 2; // Higher than StyledIndicatorsContainerWrapper\n position: sticky;\n top: 0;\n\n & > * {\n margin-top: ${scale.space(-0.5)};\n }\n`\n","/* eslint-disable react/prop-types */\n// propTypes are not recognized properly in this file\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport {Field} from 'redux-form'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport {Layout, Panel, Typography} from 'tocco-ui'\nimport {consoleLogger, js} from 'tocco-util'\n\nimport ReduxFormFieldAdapter from './ReduxFormFieldAdapter'\nimport {getFieldId} from './formDefinition'\nimport {transformFieldName} from './reduxForm'\nimport actions from '../actions'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport {isAction} from '../actions/actions'\nimport {StyledActionsWrapper} from './StyledFormBuilder'\n\nconst FormBuilder = props => {\n const {\n componentMapping,\n entity,\n mode,\n beforeRenderField,\n formDefinition,\n formValues,\n formName,\n fieldMappingType,\n customRenderedActions\n } = props\n\n const modeFitsScope = (mode, scopes) => (\n !mode || !scopes || scopes.length === 0 || scopes.includes(mode)\n )\n\n const formTraverser = (children, parentReadOnly = false) => {\n const result = []\n for (const child of children) {\n if (child.componentType === componentTypes.LAYOUT) {\n result.push(createLayoutComponent(child, child.layoutType, parentReadOnly))\n } else if (isAction(child.componentType)) {\n result.push(createAction(child))\n } else if (child.componentType === componentTypes.FIELD_SET) {\n result.push(createFieldSet(child, parentReadOnly))\n } else if (componentMapping && componentMapping[child.componentType]) {\n return createCustomComponent(child)\n }\n }\n return result\n }\n\n const createFieldSet = (fieldSet, parentReadOnly) => {\n const fieldDefinition = fieldSet.children.find(child => !isAction(child.componentType))\n\n if (!fieldDefinition) {\n return null\n }\n\n const formDefinitionField = {\n ...fieldDefinition,\n ..._pick(fieldSet, ['label', 'hidden', 'readonly', 'scopes'])\n }\n\n const fieldName = formDefinitionField.path || formDefinitionField.id\n const entityField = _get(entity, 'paths.' + fieldName.split('.').join('.value.paths.'))\n\n const shouldRenderField = (formDefinitionField, entityField) => {\n if (!modeFitsScope(mode, formDefinitionField.scopes)) {\n return false\n }\n\n if (formDefinitionField.hidden) {\n return false\n }\n\n if (beforeRenderField && !beforeRenderField(fieldName)) {\n return false\n }\n\n if (fieldMappingType === 'search') {\n return true\n }\n\n const hasEmptyValue = (fieldName, formValues) => {\n if (!Object.prototype.hasOwnProperty.call(formValues || {}, fieldName)) {\n return true\n } else {\n const value = formValues[fieldName]\n return (value == null || value === '' || (Array.isArray(value) && value.length === 0))\n }\n }\n\n const readOnly = (\n parentReadOnly\n || formDefinition.readonly\n || (entityField && entityField.writable === false)\n || (mode !== 'create' && !entityField && formDefinitionField.componentType !== 'description'\n && formDefinitionField.dataType !== 'location')\n || formDefinitionField.readonly || formDefinitionField.componentType === 'display'\n )\n\n return !(readOnly && hasEmptyValue(transformFieldName(fieldName), formValues))\n }\n\n if (shouldRenderField(formDefinitionField, entityField)) {\n return <Field\n key={`field-${fieldName}`}\n parentReadOnly={parentReadOnly}\n name={transformFieldName(fieldName)}\n id={getFieldId(formName, fieldName)}\n formName={formName}\n component={ReduxFormFieldAdapter}\n formDefinitionField={formDefinitionField}\n entityField={entityField}\n fieldMappingType={fieldMappingType}\n format={null}\n mode={mode}\n />\n }\n\n return null\n }\n\n const createAction = action => {\n const entityName = _get(props, 'entity.model')\n const entityKey = _get(props, 'entity.key')\n\n return <StyledActionsWrapper\n key={`action-${action.id}`}\n >\n <actions.Action\n definition={action}\n selection={actions.getSingleEntitySelection(entityName, entityKey)}\n mode={mode}\n customRenderedActions={customRenderedActions}\n />\n </StyledActionsWrapper>\n }\n\n const createLayoutComponent = (field, type, parentReadOnly) => {\n let elements = formTraverser(field.children, parentReadOnly || field.readonly)\n\n if (Array.isArray(elements)) {\n elements = elements.filter(Boolean)\n }\n\n if (!elements || (Array.isArray(elements) && elements.length === 0)) {\n return null\n }\n\n const content = field.label\n ? <Panel.Wrapper isFramed={true} isOpen={true}>\n <Panel.Header><Typography.H4>{field.label}</Typography.H4></Panel.Header>\n <Panel.Body>{elements}</Panel.Body>\n </Panel.Wrapper>\n : elements\n\n const layoutMap = {\n [layoutTypes.HORIZONTAL_BOX]: Layout.Container,\n [layoutTypes.VERTICAL_BOX]: Layout.Box\n }\n\n const LayoutComponent = layoutMap[type]\n const key = `layoutcomponent-${field.id}-${field.layoutType}`\n\n if (LayoutComponent) {\n return <LayoutComponent\n key={key}\n occupiesRemainingHeight={field.occupiesRemainingHeight}>\n {content}\n </LayoutComponent>\n } else {\n consoleLogger.logWarning(`Layout type \"${type}\" for box \"${field.id}\" is unknown.`)\n return null\n }\n }\n\n const createCustomComponent = field => {\n if (!modeFitsScope(mode, field.scopes)) {\n return null\n }\n\n const key = `custom-component-${field.id}-${field.layoutType}`\n const component = componentMapping[field.componentType]\n\n return component(field, key)\n }\n\n return formTraverser(formDefinition.children, formDefinition.readonly)\n}\n\nFormBuilder.propTypes = {\n entity: PropTypes.object,\n formName: PropTypes.string.isRequired,\n formDefinition: PropTypes.object.isRequired,\n formValues: PropTypes.object,\n mode: PropTypes.string,\n componentMapping: PropTypes.objectOf(PropTypes.func),\n beforeRenderField: PropTypes.func,\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(FormBuilder, areEqual)\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport isEmail from 'validator/lib/isEmail'\nimport isUrl from 'validator/lib/isURL'\n\nexport const minLengthValidator = (value, minLength) =>\n value.length < minLength\n ? {\n minLength: [\n <FormattedMessage\n key=\"syncValidationMinLength\"\n id=\"client.component.form.syncValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n : null\n\nexport const minNumberValidator = (value, minValue) =>\n value < minValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMinNumber\"\n values={{minValue}}\n />\n ]\n }\n : null\n\nexport const maxLengthValidator = (value, maxLength) =>\n value.length > maxLength\n ? {\n maxLength: [\n <FormattedMessage\n key=\"syncValidationMaxLength\"\n id=\"client.component.form.syncValidationMaxLength\"\n values={{maxLength}}\n />\n ]\n }\n : null\n\nexport const maxNumberValidator = (value, maxValue) =>\n value > maxValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMaxNumber\"\n values={{maxValue}}\n />\n ]\n }\n : null\n\nexport const postPointValidator = (value, limit) =>\n value.toString().includes('.') && value.toString().split('.')[1].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const prePointValidator = (value, limit) =>\n limit > 0 && value.toString().split('.')[0].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const regexValidator = (value, pattern) =>\n !RegExp(pattern).test(value)\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationRegexPattern\"\n id=\"client.component.form.syncValidationRegexPattern\"\n values={{pattern}}\n />\n ]\n }\n : null\n\nexport const emailValidator = value =>\n !isEmail(value)\n ? {\n format: [<FormattedMessage\n key=\"invalidEmail\"\n id=\"client.component.form.invalidEmail\"\n />\n ]\n\n }\n : null\n\nexport const urlValidator = value =>\n !isUrl(value) && !(value.includes('localhost') && isUrl(value, {require_tld: false}))\n ? {\n format: [<FormattedMessage\n key=\"invalidUrl\"\n id=\"client.component.form.invalidUrl\"\n />\n ]\n }\n : null\n\nexport default {\n 'length.fromIncluding': minLengthValidator,\n 'length.toIncluding': maxLengthValidator,\n 'numberRange.fromIncluding': minNumberValidator,\n 'numberRange.toIncluding': maxNumberValidator,\n 'decimalDigits.postPointDigits': postPointValidator,\n 'decimalDigits.prePointDigits': prePointValidator,\n 'regex.pattern': regexValidator,\n 'email': emailValidator,\n 'url': urlValidator\n}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nconst DEFAULT_DEFAULT_REGION = 'CH'\nexport const phoneValidator = async(value, phoneValidation = {}) => {\n const libphone = await import(/* webpackChunkName: \"vendor-libphonenumber-js\" */ 'libphonenumber-js')\n const isValidCustomRegex = phoneValidation.customRegex && value.match(phoneValidation.customRegex)\n const isValidPhoneNumber = libphone.isValidNumber(\n value,\n (phoneValidation.defaultRegion) || DEFAULT_DEFAULT_REGION\n )\n\n return (isValidCustomRegex || isValidPhoneNumber)\n ? null\n : {\n phone: [<FormattedMessage\n key=\"invalidPhoneNumber\"\n id=\"client.component.form.invalidPhoneNumber\"\n />\n ]\n }\n}\n\nexport default {\n phone: phoneValidator\n}\n","import syncValidators from './syncValidators'\nimport asyncValidators from './asyncValidators'\nimport {mandatoryError, valueDefined} from './mandatory'\n\nexport default {syncValidators, asyncValidators, mandatoryError, valueDefined}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nexport const valueDefined = value => !(\n value === null\n || value === undefined\n || value === ''\n || (Array.isArray(value) && value.length === 0)\n || (typeof value === 'object' && Object.keys(value).length === 0)\n)\n\nexport const mandatoryError = {\n mandatory: [\n <FormattedMessage\n key=\"syncValidationRequired\"\n id=\"client.component.form.syncValidationRequired\"\n />\n ]\n}\n","import {SubmissionError} from 'redux-form/es/SubmissionError'\nimport {api} from 'tocco-util'\nimport _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport rest from '../rest'\nimport validators from './validators'\nimport formErrors from './formErrors'\nimport {formValuesToFlattenEntity, getDirtyFields, validationErrorToFormError} from './reduxForm'\n\nconst OUTDATED_ENTITY_ERROR_CODE = 'OUTDATED_ENTITY'\n\nconst hasError = errors => (\n errors && Object.keys(errors).length > 0\n)\n\nconst localeValidation = async(values, fieldDefinitions) => {\n let errors = {}\n for (const fieldDefinition of fieldDefinitions) {\n const value = values[fieldDefinition.path]\n if (validators.valueDefined(value)) {\n for (const asyncValidatorKey in validators.asyncValidators) {\n if (_has(fieldDefinition, ['validation', asyncValidatorKey])) {\n const validatorValue = _get(fieldDefinition, ['validation', asyncValidatorKey])\n const validator = validators.asyncValidators[asyncValidatorKey]\n const validatorErrors = await validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n }\n }\n }\n return errors\n}\n\nconst validateRequest = (formValues, initialValues, mode) => {\n const dirtyFields = getDirtyFields(initialValues, formValues)\n const flattenEntity = formValuesToFlattenEntity(formValues)\n const entity = api.toEntity(flattenEntity, dirtyFields)\n const options = {\n queryParams: {_validate: true},\n method: mode === 'create' ? 'POST' : 'PATCH',\n headers: {'X-Client-Questions': 'false'},\n body: entity,\n acceptedErrorCodes: [OUTDATED_ENTITY_ERROR_CODE]\n }\n\n return rest.simpleRequest(`entities/2.0/${entity.model}${entity.key ? `/${entity.key}` : ''}`, options)\n .then(resp => resp.body)\n .then(body => {\n if (body.valid) {\n return {}\n }\n\n if (body.errorCode === OUTDATED_ENTITY_ERROR_CODE) {\n return formErrors.outdatedResponseToFormError(body, entity)\n }\n\n return validationErrorToFormError(entity, body.errors)\n })\n}\n\nexport const submitValidation = (formValues, initialValues, mode) =>\n validateRequest(formValues, initialValues, mode)\n .then(errors => {\n if (hasError(errors)) {\n throw new SubmissionError(errors)\n }\n })\n\nexport const asyncValidation = async(formValues, initialValues, fieldDefinitions, mode) => {\n const localeValidationErrors = await localeValidation(formValues, fieldDefinitions)\n if (hasError(localeValidationErrors)) {\n throw localeValidationErrors\n }\n\n const validateRequestErrors = await validateRequest(formValues, initialValues, mode)\n if (hasError(validateRequestErrors)) {\n throw validateRequestErrors\n }\n}\n","export default Object.freeze({\n CREATE: 'create',\n UPDATE: 'update'\n})\n","import _get from 'lodash/get'\nimport {call} from 'redux-saga/effects'\n\nimport rest from '../rest'\n\nfunction* loadDisplays(fields, entityModel) {\n const displayRequest = fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n if (fieldModel && fieldModel.type === 'relation') {\n const targetEntity = fieldModel.targetEntity\n const arrayValue = Array.isArray(value) ? value : [value]\n\n return {\n ...acc,\n [targetEntity]: [\n ...(acc[targetEntity] || []),\n ...arrayValue\n ]\n }\n }\n return acc\n }\n , {})\n\n if (Object.keys(displayRequest).length === 0) {\n return null\n }\n\n return yield call(rest.fetchDisplays, displayRequest)\n}\n\nexport const NOT_FOUND_DISPLAY = '??'\nconst relationFieldTransformer = (value, displays, targetEntity) =>\n ({key: value, display: _get(displays, [targetEntity, value], NOT_FOUND_DISPLAY)})\n\nconst fieldTypeTransformer = (value, fieldModel, displays) => {\n if (fieldModel && fieldModel.type === 'relation') {\n const {targetEntity} = fieldModel\n\n if (fieldModel.multi) {\n return value.map(v => relationFieldTransformer(v, displays, targetEntity))\n } else {\n return relationFieldTransformer(value, displays, targetEntity)\n }\n }\n\n return value\n}\n\n/**\n * Takes an array of values and transforms it into usable form values and load displays where needed.\n *\n * @param {array} fields Input array with schema [{id: 'firstname', value: 'Donald'}, {id: 'relGender', value: '1'}]\n * @param {entityModel} entityModel\n *\n * @return {object} With schema {firstname: 'Donald', relGender: {key: '1', display: 'Male'}}\n */\nexport default function* transformInputValues(fields, entityModel) {\n const displays = yield call(loadDisplays, fields, entityModel)\n\n return fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n\n return {\n ...acc,\n [id]: fieldTypeTransformer(value, fieldModel, displays)\n }\n }, {})\n}\n","import formErrorsUtil from './formErrors'\nimport FormBuilder from './FormBuilder'\nimport {getFieldId, getFieldDefinitions, getDefaultValues, getUsedPaths} from './formDefinition'\nimport syncValidation from './syncValidation'\nimport {asyncValidation, submitValidation} from './asyncValidation'\nimport {\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n isValueEmpty\n} from './reduxForm'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport scopes from './enums/scopes'\nimport validators from './validators'\nimport transformInputValues from './transformInputValues'\n\nexport default {\n formErrorsUtil,\n FormBuilder,\n getFieldId,\n getFieldDefinitions,\n getDefaultValues,\n getUsedPaths,\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n syncValidation,\n componentTypes,\n layoutTypes,\n scopes,\n validators,\n transformInputValues,\n asyncValidation,\n submitValidation,\n isValueEmpty\n}\n","import _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport validators from './validators'\nimport formErrors from './formErrors'\n\nexport default fieldDefinitions => values => {\n let errors = {}\n\n fieldDefinitions.forEach(fieldDefinition => {\n const value = values[fieldDefinition.path]\n\n if (validators.valueDefined(value)) {\n Object.keys(validators.syncValidators).forEach(syncValidatorKey => {\n if (_has(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])) {\n const validatorValue = _get(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])\n const validator = validators.syncValidators[syncValidatorKey]\n const validatorErrors = validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n })\n } else {\n if (fieldDefinition.validation && fieldDefinition.validation.mandatory) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validators.mandatoryError)\n }\n }\n })\n\n return errors\n}\n","export const LOAD_RELATION_ENTITIES = 'formData/LOAD_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES = 'formData/SET_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES_LOADING = 'formData/SET_RELATION_ENTITIES_LOADING'\n\nexport const loadRelationEntities = (fieldName, entityName, options) => ({\n type: LOAD_RELATION_ENTITIES,\n payload: {\n fieldName,\n entityName,\n options\n }\n})\n\nexport const setRelationEntityLoading = fieldName => ({\n type: SET_RELATION_ENTITIES_LOADING,\n payload: {\n fieldName\n }\n})\n\nexport const setRelationEntities = (fieldName, entities, moreEntitiesAvailable = false) => ({\n type: SET_RELATION_ENTITIES,\n payload: {\n fieldName,\n entities,\n moreEntitiesAvailable\n }\n})\n","import * as actions from './actions'\n\nexport const setRelationEntities = (state, {payload: {fieldName, entities, moreEntitiesAvailable}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n data: entities,\n isLoading: false,\n moreEntitiesAvailable\n }\n }\n }\n)\n\nexport const setRelationEntitiesLoading = (state, {payload: {fieldName}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n isLoading: true,\n data: []\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_RELATION_ENTITIES]: setRelationEntities,\n [actions.SET_RELATION_ENTITIES_LOADING]: setRelationEntitiesLoading\n}\n\nconst initialState = {\n data: {}\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const LOAD_TOOLTIP = 'formData/LOAD_TOOLTIP'\nexport const SET_TOOLTIP = 'formData/SET_TOOLTIP'\n\nexport const loadTooltip = (entity, id) => ({\n type: LOAD_TOOLTIP,\n payload: {\n entity,\n id\n }\n})\n\nexport const setToolTip = (entity, id, tooltip) => ({\n type: SET_TOOLTIP,\n payload: {\n entity,\n id,\n tooltip\n }\n})\n","import * as actions from './actions'\n\nexport const setToolTip = (state, {payload: {entity, id, tooltip}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [entity]: {\n ...state.data[entity],\n [id]: tooltip\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_TOOLTIP]: setToolTip\n}\n\nconst initialState = {\n data: {}\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {all, call, put, select, takeEvery} from 'redux-saga/effects'\nimport _pick from 'lodash/pick'\nimport _get from 'lodash/get'\nimport {api} from 'tocco-util'\n\nimport * as relationEntitiesActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(relationEntitiesActions.LOAD_RELATION_ENTITIES, loadRelationEntity)\n ])\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* loadRelationEntity({payload: {fieldName, entityName, options = {}}}) {\n const fieldData = yield select(fieldDataSelector, fieldName)\n if (!dataLoaded(fieldData) || options.forceReload) {\n yield put(relationEntitiesActions.setRelationEntityLoading(fieldName))\n const query = yield call(getQuery, options)\n const requestOptions = {\n method: 'GET'\n }\n\n const model = yield call(rest.fetchModel, entityName)\n if (_get(model, 'paths.active.type') === 'boolean') {\n query.where = 'active'\n }\n let entities = yield call(rest.fetchEntities, entityName, query, requestOptions)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n entities = entities.map(entity => _pick(entity, api.relevantRelationAttributes))\n const moreEntitiesAvailable = options.limit ? entities.length > options.limit : false\n yield put(\n relationEntitiesActions.setRelationEntities(\n fieldName, options.limit ? entities.splice(0, options.limit) : entities, moreEntitiesAvailable)\n )\n }\n}\n\nexport const fieldDataSelector = (state, fieldName) => state.formData.relationEntities.data[fieldName]\n\nconst dataLoaded = fieldData => !!(fieldData && fieldData.data && fieldData.data.length > 0)\n\nexport const getQuery = options => (\n {\n ...(options.limit ? {limit: options.limit + 1} : {}),\n ...(options.searchTerm ? {search: options.searchTerm} : {}),\n ...(options.sorting ? {sorting: options.sorting} : {}),\n ...(options.constriction ? {constriction: options.constriction} : {}),\n ...(options.formName ? {form: options.formName} : {})\n }\n)\n","import _get from 'lodash/get'\nimport {all, call, put, select, takeEvery} from 'redux-saga/effects'\n\nimport * as tooltipActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.LOAD_TOOLTIP, loadToolTip)\n ])\n}\n\nexport const tooltipSelector = (state, entityName, id) =>\n _get(state, `formData.tooltips.data.${entityName}.${id}`, null)\n\nexport function* loadToolTip({payload: {entity, id}}) {\n if (entity) {\n const tooltip = yield select(tooltipSelector, entity, id)\n\n if (tooltip == null) {\n const display = yield call(rest.fetchDisplay, entity, id, 'tooltip')\n yield put(tooltipActions.setToolTip(entity, id, display))\n }\n }\n}\n","export const OPEN_ADVANCED_SEARCH = 'formData/OPEN_ADVANCED_SEARCH'\nexport const ADVANCED_SEARCH_UPDATE = 'formData/ADVANCED_SEARCH_UPDATE'\nexport const ADVANCED_SEARCH_CLOSE = 'formData/ADVANCED_SEARCH_CLOSE'\n\nexport const openAdvancedSearch = (formName, formField, value) => ({\n type: OPEN_ADVANCED_SEARCH,\n payload: {\n formName,\n formField,\n value\n }\n})\n\nexport const advancedSearchUpdate = ids => ({\n type: ADVANCED_SEARCH_UPDATE,\n payload: {\n ids\n }\n})\n\nexport const advancedSearchClose = () => ({\n type: ADVANCED_SEARCH_CLOSE\n})\n","export const CHANGE_FIELD_VALUE = 'formData/CHANGE_FIELD_VALUE'\nexport const TOUCH_FIELD = 'formData/TOUCH_FIELD'\n\nexport const changeFieldValue = (formName, fieldName, value) => ({\n type: CHANGE_FIELD_VALUE,\n payload: {\n formName,\n fieldName,\n value\n }\n})\n\nexport const touchField = (formName, fieldName) => ({\n type: TOUCH_FIELD,\n payload: {\n formName,\n fieldName\n }\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledAdvancedSearch = styled.div`\n && {\n > *:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport const StyledAdvancedSearchButtonWrapper = styled.div`\n background: ${theme.color('paper')};\n padding-top: ${scale.space(0.5)};\n z-index: 1;\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {v4 as uuid} from 'uuid'\n\nimport {StyledAdvancedSearch, StyledAdvancedSearchButtonWrapper} from './StyledAdvancedSearch'\n\nconst AdvancedSearch = ({\n entityName,\n formName,\n listFormDefinition,\n onSelectionChange,\n selection,\n emitAction,\n multi,\n onOkClick,\n ListApp\n}) => (\n <StyledAdvancedSearch>\n <ListApp\n id={`advancedSearch-${uuid()}`}\n entityName={entityName}\n formName={formName}\n listFormDefinition={listFormDefinition}\n limit={15}\n showSearchForm={true}\n onSelectChange={selection => {\n onSelectionChange(selection)\n }}\n selection={selection}\n emitAction={emitAction}\n selectionStyle={multi ? 'multi' : 'single'}\n selectOnRowClick={true}\n disableSelectionController={true}\n showActions={false}\n />\n <StyledAdvancedSearchButtonWrapper>\n <Button look=\"raised\" onClick={onOkClick}>\n <FormattedMessage id=\"client.common.ok\"/>\n </Button>\n </StyledAdvancedSearchButtonWrapper>\n </StyledAdvancedSearch>\n)\n\nAdvancedSearch.propTypes = {\n ListApp: PropTypes.func.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n listFormDefinition: PropTypes.shape({\n children: PropTypes.arrayOf(PropTypes.object)\n }),\n emitAction: PropTypes.func.isRequired,\n selection: PropTypes.array,\n field: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onOkClick: PropTypes.func,\n appId: PropTypes.string,\n showSearchForm: PropTypes.bool,\n multi: PropTypes.bool\n}\n\nexport default AdvancedSearch\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport AdvancedSearch from './AdvancedSearch'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(AdvancedSearch)\n","import React from 'react'\n\nimport AdvancedSearchContainer from './AdvancedSearchContainer'\n\nexport const getSelection = (value, multi) => value ? multi ? value.map(v => v.key) : [value.key] : []\n\nexport const getValue = (entities, multi) =>\n multi\n ? entities\n : (entities.length > 0\n ? {\n key: entities[0].key,\n display: entities[0].display\n }\n : null)\n\nexport const getAdvancedSearchComponent\n = (listApp, entity, formName, listFormDefinition, selection, onSelectionChange, onOkClick, fieldId, multi) =>\n () =>\n <AdvancedSearchContainer\n ListApp={listApp}\n entityName={entity}\n formName={formName}\n listFormDefinition={listFormDefinition}\n selection={selection}\n onSelectionChange={onSelectionChange}\n onOkClick={onOkClick}\n field={fieldId}\n multi={multi}\n />\n","import {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {all, call, put, select, spawn, take, takeEvery} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport notification from './../../notification'\nimport rest from '../../rest'\nimport * as advancedSearchActions from './actions'\nimport * as valueActions from '../values/actions'\nimport {getAdvancedSearchComponent, getSelection, getValue} from './utils'\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(advancedSearchActions.OPEN_ADVANCED_SEARCH, openAdvancedSearch, config)\n ])\n}\n\nexport function* openAdvancedSearch(config, {payload}) {\n const {listApp} = config\n const {formName, formField, value} = payload\n\n const {\n id: fieldId,\n label,\n formBase: fieldFormBase,\n targetEntity: entity,\n dataType,\n formName: formNameField\n } = formField\n const multi = dataType === 'multi-remote-field'\n const remoteFieldFormName = formNameField ? `${entity}_${formNameField}` : fieldFormBase || entity\n const listFormDefinition = yield call(rest.fetchForm, remoteFieldFormName, 'remotefield')\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const advancedSearchTitle = yield select(textResourceSelector, 'client.common.advancedSearch')\n const selection = yield call(getSelection, value, multi)\n\n const advancedSearchComponent = getAdvancedSearchComponent(\n listApp,\n entity,\n remoteFieldFormName,\n listFormDefinition,\n selection,\n ids => {\n answerChannel.put(advancedSearchActions.advancedSearchUpdate(ids))\n },\n () => {\n answerChannel.put(advancedSearchActions.advancedSearchClose())\n },\n fieldId,\n multi)\n\n yield put(notification.modal(modalId, `${label}: ${advancedSearchTitle}`, null, advancedSearchComponent, true))\n yield spawn(closeAdvancedSearch, answerChannel, modalId, fieldId, formName, entity, multi)\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* closeAdvancedSearch(answerChannel, modalId, fieldId, formName, entity, multi) {\n let modalOpen = true\n while (modalOpen) {\n const {payload, type} = yield take(answerChannel)\n if (type === advancedSearchActions.ADVANCED_SEARCH_UPDATE) {\n if (payload.ids && payload.ids.length > 0) {\n const query = {\n keys: payload.ids\n }\n let entities = yield call(rest.fetchEntities, entity, query)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n const value = yield call(getValue, entities, multi)\n yield call(advancedSearchUpdate, formName, fieldId, value)\n } else {\n yield call(advancedSearchUpdate, formName, fieldId, [])\n }\n if (!multi) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n } else if (type === advancedSearchActions.ADVANCED_SEARCH_CLOSE) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n }\n}\n\nexport function* advancedSearchUpdate(formName, field, ids) {\n yield put(valueActions.changeFieldValue(formName, field, ids))\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, put, takeEvery} from 'redux-saga/effects'\n\nimport form from '../../form'\nimport * as tooltipActions from './actions'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.CHANGE_FIELD_VALUE, changeValue),\n takeEvery(tooltipActions.TOUCH_FIELD, touchField)\n ])\n}\n\nexport function* changeValue({payload: {formName, fieldName, value}}) {\n yield put(formActions.change(formName, form.transformFieldName(fieldName), value))\n}\n\nexport function* touchField({payload: {formName, fieldName}}) {\n yield put(formActions.touch(formName, form.transformFieldName(fieldName)))\n}\n","import _pick from 'lodash/pick'\n\nconst UPLOAD_ENDPOINT_URL = `${__BACKEND_URL__}/nice2/upload`\n\n/**\n * Upload a file.\n *\n * @param file {File} File to upload\n *\n * @returns {Object} An object which contains the following options:\n * - contentType {String}\n * - fileName {String}\n * - id {String}\n * - size {String}\n * - sizeInBytes {Number}\n * - success {bool}\n * - binaryLink {string}\n * - thumbnailLink {string}\n */\nexport const uploadRequest = file => {\n const data = new FormData()\n data.append('file', file)\n\n const fetchOptions = {\n method: 'POST',\n credentials: 'include',\n body: data\n }\n\n return fetch(UPLOAD_ENDPOINT_URL, fetchOptions)\n .then(response => response.json())\n}\n\nexport const documentToFormValueTransformer = (uploadResponse, file) => {\n const responseAttributes = _pick(uploadResponse, ['id', 'fileName'])\n const mimeType = uploadResponse.contentType\n\n return {\n ...responseAttributes,\n binaryLink: file.preview,\n thumbnailLink: mimeType.startsWith('image') ? file.preview : null\n }\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, call, put, takeEvery} from 'redux-saga/effects'\n\nimport {documentToFormValueTransformer, uploadRequest} from './documents'\nimport * as actions from './actions'\nimport errorLogging from '../../errorLogging'\nimport form from '../../form'\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.UPLOAD_DOCUMENT, uploadDocument)\n ])\n}\n\nexport function* uploadDocument({payload}) {\n const {formName, file, field} = payload\n\n try {\n const uploadResponse = yield call(uploadRequest, file)\n\n if (uploadResponse.success) {\n const documentFormValue = yield call(documentToFormValueTransformer, uploadResponse, file)\n yield put(formActions.change(formName, form.transformFieldName(field), documentFormValue))\n } else {\n throw new Error(`upload not successful: ${JSON.stringify(uploadResponse)}`)\n }\n } catch (error) {\n // timestamp is needed as workaround, so that Upload component rerenders\n yield put(formActions.change(formName, field, {id: null, timestamp: Date.now()}))\n yield put(errorLogging.logError(\n 'client.component.form.uploadFailedTitle',\n 'client.component.form.uploadFailedMessage',\n error\n ))\n }\n}\n","export const UPLOAD_DOCUMENT = 'formData/UPLOAD_DOCUMENT'\n\nexport const uploadDocument = (formName, field, file) => ({\n type: UPLOAD_DOCUMENT,\n payload: {\n formName,\n file,\n field\n }\n})\n","export const LOAD_SEARCH_FILTERS = 'formData/LOAD_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER = 'formData/SET_SEARCH_FILTER'\n\nexport const loadSearchFilters = (entity, group) => ({\n type: LOAD_SEARCH_FILTERS,\n payload: {\n entity,\n group\n }\n})\n\nexport const setSearchFilter = (entity, filters) => ({\n type: SET_SEARCH_FILTER,\n payload: {\n entity,\n filters\n }\n})\n","import * as actions from './actions'\n\nconst setSearchFilter = (state, {payload: {entity, filters}}) => ({...state, [entity]: filters})\n\nconst ACTION_HANDLERS = {\n [actions.SET_SEARCH_FILTER]: setSearchFilter\n}\n\nconst initialState = {}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const searchFilterResponseTransformer = searchFilterResponse =>\n searchFilterResponse.body.filters.map(f => ({uniqueId: f.uniqueId, display: f.label, key: f.key}))\n","import {all, call, put, select, takeLatest} from 'redux-saga/effects'\n\nimport {searchFilterResponseTransformer} from './utils'\nimport * as actions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_SEARCH_FILTERS, loadSearchFilters)\n ])\n}\n\nexport const searchFiltersSelector = state => state.formData.searchFilters\n\nexport function* loadSearchFilters({payload}) {\n const {entity, group} = payload\n const searchFilter = yield select(searchFiltersSelector)\n\n if (!searchFilter[entity]) {\n const searchFilterResponse = yield call(\n rest.requestSaga, `client/searchfilters/${entity}${group ? `?group=${group}` : ''}`\n )\n const searchFilters = yield call(searchFilterResponseTransformer, searchFilterResponse)\n\n yield put(actions.setSearchFilter(entity, searchFilters))\n }\n}\n","export const LOAD_LOCATION_SUGGESTIONS = 'formData/LOAD_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS = 'formData/SET_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS_LOADING = 'formData/SET_LOCATION_SUGGESTIONS_LOADING'\n\nexport const loadLocationsSuggestions = (field, searchInput, countryValue, fieldCountries) => ({\n type: LOAD_LOCATION_SUGGESTIONS,\n payload: {\n field,\n searchInput,\n countryValue,\n fieldCountries\n }\n})\n\nexport const setLocationSuggestions = (field, suggestions) => ({\n type: SET_LOCATION_SUGGESTIONS,\n payload: {\n field,\n suggestions\n }\n})\n\nexport const setLocationSuggestionsLoading = field => ({\n type: SET_LOCATION_SUGGESTIONS_LOADING,\n payload: {\n field\n }\n})\n","import _uniq from 'lodash/uniq'\nimport _get from 'lodash/get'\nimport {all, call} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport rest from '../../rest'\n\nconst LOCATION_ENDPOINT = 'location/suggestions'\nconst countryCodeField = 'iso2'\n\n// Caches country response to reduce resolving of key or ISO code.\n// e.g. {'CH': {key: '22', display: 'Switzerland'}\nlet countryCache = {}\n\nexport const setCountryCache = newCountryCache => {\n countryCache = newCountryCache\n}\n\nexport const getCountryCache = () => countryCache\n\nexport function* getCountryCodeByKey(key) {\n for (const prop in countryCache) {\n if (countryCache[prop].key === key) {\n return prop\n }\n }\n\n const entity = yield call(rest.fetchEntity, 'Country', key, {paths: [countryCodeField]})\n const display = yield call(rest.fetchDisplay, 'Country', key)\n const countryCode = _get(entity, ['paths', countryCodeField, 'value'])\n countryCache = {\n ...countryCache,\n [countryCode]: {key: entity.key, display}\n }\n\n return countryCode\n}\n\nexport function* loadCountries(suggestions) {\n const allCountries = yield all(suggestions.map(suggestion => suggestion.country))\n\n const allCountriesUniq = yield call(_uniq, allCountries)\n\n const notLoaded = yield all(\n allCountriesUniq.reduce(\n (accumulator, currentValue) => [...accumulator, ...(countryCache[currentValue] ? [] : [currentValue])],\n []\n ))\n\n if (notLoaded.length > 0) {\n const query = {\n conditions: {\n [countryCodeField]: notLoaded\n },\n paths: [countryCodeField]\n }\n\n const countriesResponse = yield call(rest.fetchEntities, 'Country', query, {method: 'GET'})\n const displays = yield call(rest.fetchDisplays, api.getDisplayRequest(countriesResponse))\n\n countryCache = {\n ...countryCache,\n ...(countriesResponse.reduce(\n (acc, value) =>\n ({\n ...acc,\n [_get(value, ['paths', countryCodeField, 'value'])]: {\n key: value.key,\n display: _get(displays, ['Country', value.key])\n }\n }),\n {}\n ))\n }\n }\n\n return countryCache\n}\n\nexport const transformToSuggestions = (suggestions, countries) =>\n suggestions.map(suggestion => ({\n ...suggestion,\n country: countries[suggestion.country]\n }))\n\nexport function* requestSuggestions(city, postcode, country) {\n const options = {\n queryParams: {\n ...(city ? {city} : {}),\n ...(postcode ? {postcode} : {}),\n ...(country ? {country} : {})\n },\n method: 'GET'\n }\n\n const response = yield call(rest.requestSaga, LOCATION_ENDPOINT, options)\n return response.body.data\n}\n\nexport function* getCountry(country, fieldCountries) {\n return country\n ? yield call(getCountryCodeByKey, country.key)\n : fieldCountries\n}\n","import {all, call, put, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {loadCountries, transformToSuggestions, requestSuggestions, getCountry} from './utils'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_LOCATION_SUGGESTIONS, loadLocations)\n ])\n}\n\nexport function* loadLocations({payload: {field, searchInput, countryValue, fieldCountries}}) {\n yield put(actions.setLocationSuggestionsLoading(field))\n\n const {city, postcode} = searchInput\n const country = yield call(getCountry, countryValue, fieldCountries)\n const suggestionsResponse = yield call(requestSuggestions, city, postcode, country)\n\n const countries = yield call(loadCountries, suggestionsResponse)\n const suggestions = yield call(transformToSuggestions, suggestionsResponse, countries)\n\n yield put(actions.setLocationSuggestions(field, suggestions))\n}\n","import * as actions from './actions'\n\nexport const setLocationSuggestions = (state, {payload: {field, suggestions}}) => (\n {\n ...state,\n [field]: {\n suggestions\n }\n }\n)\n\nexport const setLocationSuggestionsLoading = (state, {payload: {field}}) => (\n {\n ...state,\n [field]: {\n isLoading: true\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_LOCATION_SUGGESTIONS]: setLocationSuggestions,\n [actions.SET_LOCATION_SUGGESTIONS_LOADING]: setLocationSuggestionsLoading\n}\n\nconst initialState = {}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import * as actions from './actions'\n\nexport const setNavigationStrategy = (state, {payload: {navigationStrategy}}) => {\n return {\n ...state,\n navigationStrategy\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_NAVIGATION_STRATEGY]: setNavigationStrategy\n}\n\nconst initialState = {\n navigationStrategy: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const SET_NAVIGATION_STRATEGY = 'formData/SET_NAVIGATION_STRATEGY'\n\nexport const setNavigationStrategy = navigationStrategy => ({\n type: SET_NAVIGATION_STRATEGY,\n payload: {\n navigationStrategy\n }\n})\n","export const OPEN_REMOTE_CREATE = 'formData/OPEN_REMOTE_CREATE'\nexport const FINISH_CREATION = 'formData/FINISH_CREATION'\n\nexport const openRemoteCreate = (formField, formName) => ({\n type: OPEN_REMOTE_CREATE,\n payload: {\n formField,\n formName\n }\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst handleEntityCreated = (close, answerChannel) => result => {\n close()\n answerChannel.put(result)\n}\n\nconst RemoteCreate = ({\n DetailApp,\n targetEntity,\n answerChannel,\n close,\n emitAction\n}) => {\n return <DetailApp\n entityName={targetEntity}\n formName={targetEntity}\n mode={'create'}\n onEntityCreated={handleEntityCreated(close, answerChannel)}\n emitAction={emitAction}\n />\n}\n\nRemoteCreate.propTypes = {\n DetailApp: PropTypes.func.isRequired,\n targetEntity: PropTypes.string.isRequired,\n answerChannel: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n close: PropTypes.func.isRequired\n}\n\nexport default RemoteCreate\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport RemoteCreate from './RemoteCreate'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(RemoteCreate)\n","import {all, call, put, take, takeEvery} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport React from 'react'\n\nimport * as actions from './actions'\nimport * as valueActions from '../values/actions'\nimport rest from '../../rest'\nimport notification from '../../notification'\nimport RemoteCreate from './RemoteCreateContainer'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.OPEN_REMOTE_CREATE, openRemoteCreate, config)\n ])\n}\n\nexport function* openRemoteCreate({detailApp}, {payload: {formName, formField}}) {\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const buildCreateForm = ({close}) => <RemoteCreate\n targetEntity={formField.targetEntity}\n answerChannel={answerChannel}\n close={close}\n DetailApp={detailApp}/>\n yield put(notification.modal(modalId, formField.label, null, buildCreateForm, true))\n\n const {id} = yield take(answerChannel)\n const display = yield call(rest.fetchDisplay, formField.targetEntity, id)\n yield put(valueActions.changeFieldValue(formName, formField.path, {key: id, display}))\n}\n","import {combineReducers} from 'redux'\nimport PropTypes from 'prop-types'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport relationEntities from './relationEntities/reducer'\nimport tooltips from './tooltips/reducer'\nimport relationEntitiesSagas from './relationEntities/sagas'\nimport tooltipsSaga from './tooltips/sagas'\nimport advancedSearchSagas from './advancedSearch/sagas'\nimport valueSagas from './values/sagas'\nimport uploadSagas from './upload/sagas'\nimport searchFilters from './searchFilters/reducer'\nimport searchFilterSagas from './searchFilters/sagas'\nimport {setRelationEntities} from './relationEntities/actions'\nimport locationSagas from './locations/sagas'\nimport locations from './locations/reducer'\nimport navigationStrategy from './navigationStrategy/reducer'\nimport {setNavigationStrategy} from './navigationStrategy/actions'\nimport remoteCreateSagas from './remoteCreate/sagas'\n\nexport const relationEntitiesSelector = store => store.formData.relationEntities.data\nexport const tooltipSelector = store => store.formData.tooltips.data\nexport const locationSuggestionsSelector = store => store.formData.locations\n\nexport const addToStore = (store, config) => {\n reducerUtil.injectReducers(store, {\n formData: combineReducers({\n relationEntities,\n tooltips,\n searchFilters,\n locations,\n navigationStrategy\n })\n })\n\n store.sagaMiddleware.run(relationEntitiesSagas)\n store.sagaMiddleware.run(tooltipsSaga)\n store.sagaMiddleware.run(advancedSearchSagas, config)\n store.sagaMiddleware.run(valueSagas)\n store.sagaMiddleware.run(uploadSagas)\n store.sagaMiddleware.run(searchFilterSagas)\n store.sagaMiddleware.run(locationSagas)\n store.sagaMiddleware.run(remoteCreateSagas, config)\n\n if (config.navigationStrategy) {\n store.dispatch(setNavigationStrategy(config.navigationStrategy))\n }\n\n const relationEntitiesData = _get(config, 'data.relationEntities', null)\n if (relationEntitiesData !== null) {\n Object.keys(relationEntitiesData).forEach(field => {\n store.dispatch(setRelationEntities(field, relationEntitiesData[field], false))\n })\n }\n}\n\nexport const formDataPropType = PropTypes.shape({\n relationEntities: PropTypes.objectOf(PropTypes.array)\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport _merge from 'lodash/merge'\nimport {\n isDirty as isDirtySelector,\n getFormSyncErrors,\n getFormAsyncErrors,\n getFormSubmitErrors\n} from 'redux-form'\n\nimport {loadRelationEntities} from './relationEntities/actions'\nimport {loadTooltip} from './tooltips/actions'\nimport {openAdvancedSearch} from './advancedSearch/actions'\nimport {changeFieldValue, touchField} from './values/actions'\nimport {uploadDocument} from './upload/actions'\nimport {loadSearchFilters} from './searchFilters/actions'\nimport {loadLocationsSuggestions} from './locations/actions'\nimport {openRemoteCreate} from './remoteCreate/actions'\n\nconst FormData = props =>\n <React.Fragment>{React.cloneElement(props.children, {formData: props})}</React.Fragment>\n\nFormData.propTypes = {\n children: PropTypes.node\n}\n\nconst mapStateToProps = (\n state,\n {formValues, tooltips, locations, relationEntities, searchFilters, isDirty, errors, navigationStrategy}\n) => ({\n ...(relationEntities ? {relationEntities: _pick(state.formData.relationEntities.data, relationEntities)} : {}),\n ...(tooltips ? {tooltips: _pick(state.formData.tooltips.data, tooltips)} : {}),\n ...(searchFilters ? {searchFilters: _pick(state.formData.searchFilters, searchFilters)} : {}),\n ...(locations ? {locations: _pick(state.formData.locations, locations)} : {}),\n ...(formValues && state.form[formValues.formName]\n ? {formValues: _pick(state.form[formValues.formName].values, formValues.fields)}\n : {}),\n ...(isDirty && state.form[isDirty.formName]\n ? {isDirty: isDirtySelector(isDirty.formName)(state, ...isDirty.fields)}\n : {}),\n ...(errors && state.form[errors.formName]\n ? {\n errors: _reduce(\n _merge(\n _pick(getFormSubmitErrors(errors.formName)(state), errors.fields),\n _pick(getFormSyncErrors(errors.formName)(state), errors.fields),\n _pick(getFormAsyncErrors(errors.formName)(state), errors.fields)\n ),\n (result, value) => ({...result, ...value}), null)\n }\n : null),\n ...(navigationStrategy && state.formData.navigationStrategy\n ? {navigationStrategy: state.formData.navigationStrategy.navigationStrategy}\n : {}\n ),\n entityModel: _get(state, 'entityDetail.entityModel')\n})\n\nconst mapActionCreators = {\n loadRelationEntities: loadRelationEntities,\n loadTooltip: loadTooltip,\n openAdvancedSearch: openAdvancedSearch,\n uploadDocument: uploadDocument,\n changeFieldValue: changeFieldValue,\n touchField: touchField,\n loadSearchFilters: loadSearchFilters,\n loadLocationsSuggestions: loadLocationsSuggestions,\n openRemoteCreate: openRemoteCreate\n}\n\nconst FormDataContainer = connect(\n mapStateToProps,\n mapActionCreators,\n null,\n {\n areStatePropsEqual: _isEqual\n }\n)(injectIntl(FormData))\n\nexport default FormDataContainer\n","import {addToStore} from './formData'\nimport FormDataContainer from './FormDataContainer'\n\nexport default {\n addToStore,\n FormDataContainer\n}\n","import {\n REMOTE_EVENT,\n remoteEvent\n} from './actions'\n\nexport default {\n REMOTE_EVENT,\n remoteEvent\n}\n","export const REMOTE_EVENT = 'remoteEvents/REMOTE_EVENT'\n\nexport const remoteEvent = event => ({\n type: REMOTE_EVENT,\n payload: {\n event\n }\n})\n","export const SET_INITIALIZED = 'entityList/SET_INITIALIZED'\nexport const INITIALIZE = 'entityList/INITIALIZE'\nexport const SET_SEARCH_FORM_TYPE = 'entityList/SET_SEARCH_FORM_TYPE'\nexport const SET_ENTITY_NAME = 'entityList/SET_ENTITY_NAME'\nexport const SET_PARENT = 'entityList/SET_PARENT'\nexport const SET_SEARCH_FORM_POSITION = 'entityList/SET_SEARCH_FORM_POSITION'\nexport const SET_FORM_NAME = 'entityList/SET_FORM_NAME'\nexport const RELOAD_ALL = 'entityList/RELOAD_ALL'\nexport const RELOAD_DATA = 'entityList/RELOAD_DATA'\nexport const SET_SEARCH_FORM_COLLAPSED = 'entityList/SET_SEARCH_FORM_COLLAPSED'\nexport const SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE = 'entityList/SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setSearchFormType = searchFormType => ({\n type: SET_SEARCH_FORM_TYPE,\n payload: {\n searchFormType\n }\n})\n\nexport const setEntityName = entityName => ({\n type: SET_ENTITY_NAME,\n payload: {\n entityName\n }\n})\n\nexport const setParent = parent => ({\n type: SET_PARENT,\n payload: {\n parent\n }\n})\n\nexport const setSearchFormPosition = searchFormPosition => ({\n type: SET_SEARCH_FORM_POSITION,\n payload: {\n searchFormPosition\n }\n})\n\nexport const setFormName = formName => ({\n type: SET_FORM_NAME,\n payload: {\n formName\n }\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n\nexport const reloadAll = () => ({\n type: RELOAD_ALL\n})\n\nexport const setSearchFormCollapsed = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED,\n payload: {\n searchFormCollapsed\n }\n})\n\nexport const setSearchFormCollapsedInitialValue = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE,\n payload: {\n searchFormCollapsed\n }\n})\n","import PropTypes from 'prop-types'\nconst searchFormTypes = {\n NONE: 'none',\n SIMPLE: 'simple',\n BASIC: 'basic',\n ADMIN: 'admin'\n}\n\nexport const searchFormTypePropTypes = PropTypes.oneOf(Object.values(searchFormTypes))\n\nexport default searchFormTypes\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport searchFormTypes from '../../util/searchFormTypes'\n\nconst setSearchFormType = (state, {payload}) => {\n const {searchFormType: newSearchFormType} = payload\n\n const searchFormType = Object.values(searchFormTypes).find(enumV => enumV === newSearchFormType)\n || searchFormTypes.BASIC\n\n return {...state, searchFormType}\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_ENTITY_NAME]: reducerUtil.singleTransferReducer('entityName'),\n [actions.SET_FORM_NAME]: reducerUtil.singleTransferReducer('formName'),\n [actions.SET_SEARCH_FORM_TYPE]: setSearchFormType,\n [actions.SET_SEARCH_FORM_POSITION]: reducerUtil.singleTransferReducer('searchFormPosition'),\n [actions.SET_PARENT]: reducerUtil.singleTransferReducer('parent'),\n [actions.SET_SEARCH_FORM_COLLAPSED]: reducerUtil.singleTransferReducer('searchFormCollapsed'),\n [actions.SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE]: reducerUtil.singleTransferReducer('searchFormCollapsed')\n}\n\nconst initialState = {\n initialized: false,\n entityName: '',\n formName: '',\n searchFormType: searchFormTypes.BASIC,\n searchFormPosition: 'top',\n parent: null,\n searchFormCollapsed: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const INITIALIZE = 'list/INITIALIZE'\nexport const REQUEST_ENTITIES = 'list/REQUEST_ENTITIES'\nexport const SET_ENTITIES = 'list/SET_ENTITIES'\nexport const SET_FORM_DEFINITION = 'list/SET_FORM_DEFINITION'\nexport const SET_ENTITY_MODEL = 'list/SET_ENTITY_MODEL'\nexport const SET_SORTING = 'list/SET_SORTING'\nexport const SET_LIMIT = 'list/SET_LIMIT'\nexport const SET_SCOPE = 'list/SET_SCOPE'\nexport const SET_CURRENT_PAGE = 'list/SET_CURRENT_PAGE'\nexport const SET_ENTITY_COUNT = 'list/SET_ENTITY_COUNT'\nexport const ADD_ENTITIES_TO_STORE = 'list/ADD_ENTITIES_TO_STORE'\nexport const CLEAR_ENTITY_STORE = 'list/CLEAR_ENTITIES_CACHE'\nexport const SET_IN_PROGRESS = 'list/SET_IN_PROGRESS'\nexport const CHANGE_PAGE = 'list/CHANGE_PAGE'\nexport const REFRESH = 'list/REFRESH'\nexport const SET_SHOW_SEARCH_FORM = 'list/SET_SEARCH_FORM'\nexport const SET_SEARCH_FILTERS = 'list/SET_SEARCH_FILTERS'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'list/SET_SIMPLE_SEARCH_FIELDS'\nexport const ON_ROW_CLICK = 'list/ON_ROW_CLICK'\nexport const NAVIGATE_TO_CREATE = 'entityList/NAVIGATE_TO_CREATE'\nexport const SET_FORM_SELECTABLE = 'list/SET_FORM_SELECTABLE'\nexport const SET_FORM_CLICKABLE = 'list/SET_FORM_CLICKABLE'\nexport const SET_ENDPOINT = 'list/SET_ENDPOINT'\nexport const SET_SEARCH_ENDPOINT = 'list/SET_SEARCH_ENDPOINT'\nexport const SET_CONSTRICTION = 'list/SET_CONSTRICTION'\nexport const QUERY_CHANGED = 'list/QUERY_CHANGED'\nexport const SET_SHOW_LINK = 'list/SET_SHOW_LINK'\nexport const SET_LAZY_DATA = 'list/SET_LAZY_DATA'\nexport const NAVIGATE_TO_ACTION = 'list/NAVIGATE_TO_ACTION'\nexport const SET_SORTING_INTERACTIVE = 'list/SET_SORTING_INTERACTIVE'\nexport const DEFINE_SORTING = 'list/DEFINE_SORTING'\nexport const SET_INPUT_TQL = 'list/SET_INPUT_TQL'\nexport const SET_INPUT_KEYS = 'list/SET_INPUT_KEYS'\nexport const SET_INPUT_SEARCH_FILTERS = 'list/SET_INPUT_SEARCH_FILTERS'\nexport const SET_INITIALIZED = 'list/SET_INITIALIZED'\nexport const SET_SORTABLE = 'list/SET_SORTABLE'\nexport const SET_MARKED = 'list/SET_MARKED'\nexport const TOGGLE_MARKINGS = 'list/TOGGLE_MARKINGS'\nexport const SET_DISABLE_PREFERENCES_MENU = 'list/SET_DISABLE_PREFERENCES_MENU'\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const requestEntities = (page, show) => ({\n type: REQUEST_ENTITIES,\n payload: {\n page,\n show\n }\n})\n\nexport const setEntities = entities => ({\n type: SET_ENTITIES,\n payload: {\n entities\n }\n})\n\nexport const addEntitiesToStore = (page, entities) => ({\n type: ADD_ENTITIES_TO_STORE,\n payload: {\n page,\n entities\n }\n})\n\nexport const clearEntityStore = () => ({\n type: CLEAR_ENTITY_STORE\n})\n\nexport const setEntityCount = entityCount => ({\n type: SET_ENTITY_COUNT,\n payload: {\n entityCount\n }\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const setEntityModel = entityModel => ({\n type: SET_ENTITY_MODEL,\n payload: {\n entityModel\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setLimit = limit => ({\n type: SET_LIMIT,\n payload: {\n limit\n }\n})\n\nexport const setScope = scope => ({\n type: SET_SCOPE,\n payload: {\n scope\n }\n})\n\nexport const setCurrentPage = currentPage => ({\n type: SET_CURRENT_PAGE,\n payload: {\n currentPage\n }\n})\n\nexport const setInProgress = inProgress => ({\n type: SET_IN_PROGRESS,\n payload: {\n inProgress\n }\n})\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const refresh = () => ({\n type: REFRESH\n})\n\nexport const setShowSearchForm = showSearchForm => ({\n type: SET_SHOW_SEARCH_FORM,\n payload: {\n showSearchForm\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const onRowClick = id => ({\n type: ON_ROW_CLICK,\n payload: {\n id\n }\n})\n\nexport const navigateToCreate = relationName => ({\n type: NAVIGATE_TO_CREATE,\n payload: {\n relationName\n }\n})\n\nexport const setFormSelectable = formSelectable => ({\n type: SET_FORM_SELECTABLE,\n payload: {\n formSelectable\n }\n})\n\nexport const setFormClickable = formClickable => ({\n type: SET_FORM_CLICKABLE,\n payload: {\n formClickable\n }\n})\n\nexport const setEndpoint = endpoint => ({\n type: SET_ENDPOINT,\n payload: {\n endpoint\n }\n})\n\nexport const setSearchEndpoint = searchEndpoint => ({\n type: SET_SEARCH_ENDPOINT,\n payload: {\n searchEndpoint\n }\n})\n\nexport const setConstriction = constriction => ({\n type: SET_CONSTRICTION,\n payload: {\n constriction\n }\n})\n\nexport const queryChanged = query => ({\n type: QUERY_CHANGED,\n payload: {\n query\n }\n})\n\nexport const setShowLink = showLink => ({\n type: SET_SHOW_LINK,\n payload: {\n showLink\n }\n})\n\nexport const setLazyData = (type, id, values) => ({\n type: SET_LAZY_DATA,\n payload: {\n type,\n id,\n values\n }\n})\n\nexport const navigateToAction = (definition, selection) => ({\n type: NAVIGATE_TO_ACTION,\n payload: {\n definition,\n selection\n }\n})\n\nexport const setSortingInteractive = (field, add) => ({\n type: SET_SORTING_INTERACTIVE,\n payload: {\n field,\n add\n }\n})\n\nexport const defineSorting = () => ({\n type: DEFINE_SORTING\n})\n\nexport const setInputTql = inputTql => ({\n type: SET_INPUT_TQL,\n payload: {\n inputTql\n }\n})\n\nexport const setInputKeys = inputKeys => ({\n type: SET_INPUT_KEYS,\n payload: {\n inputKeys\n }\n})\n\nexport const setInputSearchFilters = inputSearchFilters => ({\n type: SET_INPUT_SEARCH_FILTERS,\n payload: {\n inputSearchFilters\n }\n})\n\nexport const setInitialized = () => ({\n type: SET_INITIALIZED\n})\n\nexport const setSortable = sortable => ({\n type: SET_SORTABLE,\n payload: {\n sortable\n }\n})\n\nexport const setMarked = (entityName, entityKey, marked) => ({\n type: SET_MARKED,\n payload: {\n entityName,\n entityKey,\n marked\n }\n})\n\nexport const toggleMarkings = selection => ({\n type: TOGGLE_MARKINGS,\n payload: {\n selection\n }\n})\n\nexport const setDisablePreferencesMenu = disablePreferencesMenu => ({\n type: SET_DISABLE_PREFERENCES_MENU,\n payload: {\n disablePreferencesMenu\n }\n})\n","export const SET_INITIALIZED = 'searchForm/SET_INITIALIZED'\nexport const INITIALIZE = 'searchForm/INITIALIZE'\nexport const SET_FORM_DEFINITION = 'searchForm/SET_FORM_DEFINITION'\nexport const EXECUTE_SEARCH = 'searchForm/EXECUTE_SEARCH'\nexport const RESET_SEARCH = 'searchForm/RESET_SEARCH'\nexport const SET_SHOW_EXTENDED_SEARCH_FORM = 'searchForm/SET_SHOW_EXTENDED_SEARCH_FORM'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'searchForm/SET_SIMPLE_SEARCH_FIELDS'\nexport const SET_DISABLE_SIMPLE_SEARCH = 'searchForm/SET_DISABLE_SIMPLE_SEARCH'\nexport const SET_SEARCH_FORM_NAME = 'searchForm/SET_SEARCH_FORM_NAME'\nexport const SUBMIT_SEARCH_FORM = 'searchForm/SUBMIT_SEARCH_FORM'\nexport const SET_VALUES_INITIALIZED = 'searchForm/SET_VALUES_INITIALIZED'\nexport const ADVANCED_SEARCH_UPDATE = 'searchForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FORM_FIELDS_FLAT = 'searchForm/SET_FORM_FIELDS_FLAT'\nexport const SET_SEARCH_FILTERS = 'searchForm/SET_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER_ACTIVE = 'searchForm/SET_SEARCH_FILTER_ACTIVE'\nexport const DELETE_SEARCH_FILTER = 'searchForm/DELETE_SEARCH_FILTER'\nexport const SAVE_SEARCH_FILTER = 'searchForm/SAVE_SEARCH_FILTER'\nexport const SAVE_DEFAULT_SEARCH_FILTER = 'searchForm/SAVE_DEFAULT_SEARCH_FILTER'\nexport const RESET_DEFAULT_SEARCH_FILTER = 'searchForm/RESET_DEFAULT_SEARCH_FILTER'\nexport const DISPLAY_SEARCH_FIELDS_MODAL = 'searchForm/DISPLAY_SEARCH_FIELDS_MODAL'\nexport const RESET_SEARCH_FIELDS = 'searchForm/resetSearchFields'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const executeSearch = () => ({\n type: EXECUTE_SEARCH\n})\n\nexport const resetSearch = () => ({\n type: RESET_SEARCH\n})\n\nexport const setShowExtendedSearchForm = showExtendedSearchForm => ({\n type: SET_SHOW_EXTENDED_SEARCH_FORM,\n payload: {\n showExtendedSearchForm\n }\n})\n\nexport const setSimpleSearchFields = simpleSearchFields => ({\n type: SET_SIMPLE_SEARCH_FIELDS,\n payload: {\n simpleSearchFields\n }\n})\n\nexport const setDisableSimpleSearch = disableSimpleSearch => ({\n type: SET_DISABLE_SIMPLE_SEARCH,\n payload: {\n disableSimpleSearch\n }\n})\n\nexport const submitSearchForm = () => ({\n type: SUBMIT_SEARCH_FORM\n})\n\nexport const setValuesInitialized = valuesInitialized => ({\n type: SET_VALUES_INITIALIZED,\n payload: {\n valuesInitialized\n }\n})\n\nexport const setFormFieldsFlat = formFieldsFlat => ({\n type: SET_FORM_FIELDS_FLAT,\n payload: {\n formFieldsFlat\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const setSearchFilterActive = (searchFilterId, active, exclusive) => ({\n type: SET_SEARCH_FILTER_ACTIVE,\n payload: {\n searchFilterId,\n active,\n exclusive\n }\n})\n\nexport const deleteSearchFilter = primaryKey => ({\n type: DELETE_SEARCH_FILTER,\n payload: {\n primaryKey\n }\n})\n\nexport const saveSearchFilter = () => ({\n type: SAVE_SEARCH_FILTER\n})\n\nexport const saveDefaultSearchFilter = () => ({\n type: SAVE_DEFAULT_SEARCH_FILTER\n})\n\nexport const resetDefaultSearchFilter = () => ({\n type: RESET_DEFAULT_SEARCH_FILTER\n})\n\nexport const displaySearchFieldsModal = () => ({\n type: DISPLAY_SEARCH_FIELDS_MODAL\n})\n\nexport const resetSearchFields = () => ({\n type: RESET_SEARCH_FIELDS\n})\n","export const LOAD_PREFERENCES = 'preferences/LOAD_PREFERENCES'\nexport const SET_POSITIONS = 'preferences/SET_POSITIONS'\nexport const CHANGE_POSITION = 'preferences/CHANGE_POSITION'\nexport const SET_SORTING = 'preferences/SET_SORTING'\nexport const SET_COLUMNS = 'preferences/SET_COLUMNS'\nexport const CHANGE_WIDTH = 'preferences/CHANGE_WIDTH'\nexport const RESET_SORTING = 'preferences/RESET_SORTING'\nexport const RESET_COLUMNS = 'preferences/RESET_COLUMNS'\nexport const RESET_PREFERENCES = 'preferences/RESET_PREFERENCES'\nexport const DISPLAY_COLUMN_MODAL = 'preferences/DISPLAY_COLUMN_MODAL'\nexport const SET_PREFERENCES_LOADED = 'preferences/SET_PREFERENCES_LOADED'\n\nexport const loadPreferences = () => ({\n type: LOAD_PREFERENCES\n})\n\nexport const setPreferencesLoaded = preferencesLoaded => ({\n type: SET_PREFERENCES_LOADED,\n payload: {\n preferencesLoaded\n }\n})\n\nexport const setPositions = positions => ({\n type: SET_POSITIONS,\n payload: {\n positions\n }\n})\n\nexport const changePosition = (field, afterFieldPosition, columns) => ({\n type: CHANGE_POSITION,\n payload: {\n field,\n afterFieldPosition,\n columns\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setColumns = columns => ({\n type: SET_COLUMNS,\n payload: {\n columns\n }\n})\n\nexport const changeWidth = (field, width) => ({\n type: CHANGE_WIDTH,\n payload: {\n field,\n width\n }\n})\n\nexport const resetSorting = () => ({\n type: RESET_SORTING,\n payload: {}\n})\n\nexport const resetPreferences = () => ({\n type: RESET_PREFERENCES,\n payload: {}\n})\n\nexport const displayColumnModal = () => ({\n type: DISPLAY_COLUMN_MODAL,\n payload: {}\n})\n\nexport const resetColumns = () => ({\n type: RESET_COLUMNS,\n payload: {}\n})\n","import {put, call, all, take, takeLatest} from 'redux-saga/effects'\nimport {appFactory, externalEvents} from 'tocco-app-extensions'\n\nimport * as actions from './../entityList/actions'\nimport * as listActions from './../list/actions'\nimport * as searchFormActions from './../searchForm/actions'\nimport * as preferenceActions from './../preferences/actions'\n\nexport const entityListSelector = state => state.entityList\n\nexport default function* sagas() {\n yield all([\n call(initialize),\n takeLatest(actions.RELOAD_DATA, reloadData),\n takeLatest(actions.RELOAD_ALL, initialize, false),\n takeLatest(actions.SET_SEARCH_FORM_COLLAPSED, searchFormCollapsed)\n ])\n}\n\nexport function* initialize(waitForInputDispatch = true) {\n if (waitForInputDispatch) {\n yield take(appFactory.inputDispatchActionType)\n }\n yield put(listActions.initialize())\n yield put(preferenceActions.loadPreferences())\n yield put(searchFormActions.initialize())\n yield all([\n take(listActions.SET_INITIALIZED),\n take(searchFormActions.SET_INITIALIZED),\n take(preferenceActions.SET_PREFERENCES_LOADED)\n ])\n yield put(listActions.defineSorting())\n yield take(listActions.SET_SORTING)\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* reloadData() {\n yield put(searchFormActions.initialize())\n yield all([\n take(searchFormActions.SET_INITIALIZED)\n ])\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* searchFormCollapsed({payload: {searchFormCollapsed}}) {\n yield put(externalEvents.fireExternalEvent('onSearchFormCollapsedChange', {collapsed: searchFormCollapsed}))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst addEntityToStore = (state, {payload}) => ({\n ...state,\n entityStore: {\n ...state.entityStore,\n [payload.page]: payload.entities\n }\n})\n\nconst setLazyData = (state, {payload: {type, id, values}}) => ({\n ...state,\n lazyData: {\n ...state.lazyData,\n [type]: {\n ...state.lazyData[type],\n [id]: {..._get(state, ['lazyData', type, id], {}), ...values}\n }\n }\n})\n\nconst clearEntityStore = state => ({\n ...state,\n entityStore: {}\n})\n\nconst defaultOrder = 'asc'\nconst getOpposite = order => order === 'asc' ? 'desc' : 'asc'\nconst setSortingInteractive = (state, {payload: {field, add}}) => {\n if (!add) {\n const currentSorting = state.sorting\n const order = (currentSorting.length > 0 && currentSorting[0].field === field\n ? getOpposite(currentSorting[0].order)\n : defaultOrder)\n return {\n ...state,\n sorting: [{field, order}]\n }\n } else {\n const contains = state.sorting.filter(s => s.field === field)\n const order = contains.length > 0 ? getOpposite(contains[0].order) : defaultOrder\n\n return {\n ...state,\n sorting: [...state.sorting.filter(s => s.field !== field), {field, order}]\n }\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_ENTITIES]: reducerUtil.singleTransferReducer('entities'),\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_ENTITY_MODEL]: reducerUtil.singleTransferReducer('entityModel'),\n [actions.SET_LIMIT]: reducerUtil.singleTransferReducer('limit'),\n [actions.SET_SCOPE]: reducerUtil.singleTransferReducer('scope'),\n [actions.SET_CURRENT_PAGE]: reducerUtil.singleTransferReducer('currentPage'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_SORTING_INTERACTIVE]: setSortingInteractive,\n [actions.SET_ENTITY_COUNT]: reducerUtil.singleTransferReducer('entityCount'),\n [actions.ADD_ENTITIES_TO_STORE]: addEntityToStore,\n [actions.SET_LAZY_DATA]: setLazyData,\n [actions.CLEAR_ENTITY_STORE]: clearEntityStore,\n [actions.SET_IN_PROGRESS]: reducerUtil.singleTransferReducer('inProgress'),\n [actions.SET_SHOW_SEARCH_FORM]: reducerUtil.singleTransferReducer('showSearchForm'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_FORM_SELECTABLE]: reducerUtil.singleTransferReducer('formSelectable'),\n [actions.SET_FORM_CLICKABLE]: reducerUtil.singleTransferReducer('formClickable'),\n [actions.SET_ENDPOINT]: reducerUtil.singleTransferReducer('endpoint'),\n [actions.SET_SEARCH_ENDPOINT]: reducerUtil.singleTransferReducer('searchEndpoint'),\n [actions.SET_CONSTRICTION]: reducerUtil.singleTransferReducer('constriction'),\n [actions.SET_SHOW_LINK]: reducerUtil.singleTransferReducer('showLink'),\n [actions.SET_SORTABLE]: reducerUtil.singleTransferReducer('sortable'),\n [actions.SET_INPUT_TQL]: reducerUtil.singleTransferReducer('inputTql'),\n [actions.SET_INPUT_KEYS]: reducerUtil.singleTransferReducer('inputKeys'),\n [actions.SET_INPUT_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('inputSearchFilters'),\n [actions.SET_DISABLE_PREFERENCES_MENU]: reducerUtil.singleTransferReducer('disablePreferencesMenu')\n}\n\nconst initialState = {\n entityModel: {},\n entities: [],\n limit: 10,\n scope: 'list',\n currentPage: 1,\n sorting: [],\n formDefinition: null,\n entityCount: null,\n entityStore: {},\n inProgress: true,\n showSearchForm: true,\n searchFilters: [],\n createPermission: false,\n formSelectable: false,\n formClickable: false,\n showLink: false,\n sortable: true,\n lazyData: {},\n endpoint: null,\n searchEndpoint: null,\n constriction: null,\n inputTql: null,\n inputKeys: null,\n inputSearchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import _reduce from 'lodash/reduce'\nimport {tqlBuilder} from 'tocco-util'\n\nconst getFilterArray = v =>\n Array.isArray(v) ? v.map(e => e.uniqueId) : [v.uniqueId]\n\nexport const getFetchOptionsFromSearchForm = (searchFormValues, formFields = {}) => (\n _reduce(searchFormValues, (acc, value, path) => {\n const addition = {}\n if (path === 'searchFilter') {\n if (value) {\n addition.filters = getFilterArray(value)\n }\n } else {\n const fieldType = formFields[path]\n const tql = tqlBuilder.getTql(path, value, fieldType)\n addition.tql = [...(acc.tql ? [acc.tql] : []), tql].filter(Boolean).join(' and ')\n }\n\n return {...acc, ...addition}\n }, {})\n)\n","export const ON_SELECT_CHANGE = 'list/ON_ROW_SELECT'\nexport const SET_SELECTION = 'list/SET_SELECTION'\nexport const CLEAR_SELECTION = 'selection/CLEAR_SELECTION'\nexport const SET_SHOW_SELECTION_CONTROLLER = 'selection/SET_SHOW_SELECTION_CONTROLLER'\nexport const SET_TABLE_SELECTION_STYLE = 'selection/SET_TABLE_SELECTION_STYLE'\nexport const SET_QUERY = 'selection/SET_QUERY'\nexport const SET_QUERY_COUNT = 'selection/SET_QUERY_COUNT'\nexport const TOGGLE_SHOW_SELECTED_RECORDS = 'selection/TOOGLE_SHOW_SELECTED_RECORDS'\nexport const RELOAD_DATA = 'selection/RELOAD_DATA'\n\nexport const setSelection = selection => ({\n type: SET_SELECTION,\n payload: {\n selection\n }\n})\n\nexport const onSelectChange = (keys, isSelected) => ({\n type: ON_SELECT_CHANGE,\n payload: {\n keys,\n isSelected\n }\n})\n\nexport const clearSelection = () => ({\n type: CLEAR_SELECTION\n})\n\nexport const setShowSelectionController = showSelectionController => ({\n type: SET_SHOW_SELECTION_CONTROLLER,\n payload: {\n showSelectionController\n }\n})\n\nexport const setTableSelectionStyle = tableSelectionStyle => ({\n type: SET_TABLE_SELECTION_STYLE,\n payload: {\n tableSelectionStyle\n }\n})\n\nexport const setQuery = query => ({\n type: SET_QUERY,\n payload: {\n query\n }\n})\n\nexport const setQueryCount = queryCount => ({\n type: SET_QUERY_COUNT,\n payload: {\n queryCount\n }\n})\n\nexport const toggleShowSelectedRecords = () => ({\n type: TOGGLE_SHOW_SELECTED_RECORDS\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n","import styled from 'styled-components'\nimport {Button, scale} from 'tocco-ui'\n\nexport const StyledButton = styled(Button)`\n float: right;\n margin-top: ${scale.space(0)};\n margin-right: 0;\n`\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledActionWrapper = styled.div`\n ${StyledButton} {\n width: 100%;\n max-width: fit-content;\n justify-content: center;\n box-sizing: border-box;\n\n > * {\n overflow: hidden;\n }\n }\n`\n\nexport const StyledSpan = styled.span`\n p {\n margin-block-start: 0; // reset user agent style to prevent margin within table\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst LazyDataEnhancer = ({value, children}) => React.cloneElement(children, {value})\n\nLazyDataEnhancer.propTypes = {\n children: PropTypes.node,\n value: PropTypes.any\n}\n\nexport default LazyDataEnhancer\n","import _get from 'lodash/get'\n\nconst multiRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n\n return value.map(value => {\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n })\n}\n\nconst singleRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n}\n\nconst displayExpressionHandler = (value, lazyData, info) => (\n _get(lazyData, ['displayExpressions', info.formName, info.key, info.path], '')\n)\n\nconst typeHandlers = {\n 'multi-select-box': multiRelationHandler,\n 'multi-remote-field': multiRelationHandler,\n 'single-select-box': singleRelationHandler,\n 'single-remote-field': singleRelationHandler,\n 'displayExpression': displayExpressionHandler\n}\n\nexport const lazyValueEnhancer = (value, type, lazyData, info) => {\n const typeHandler = typeHandlers[type]\n\n if (!typeHandler) {\n return value\n }\n\n return typeHandler(value, lazyData, info)\n}\n","import {connect} from 'react-redux'\n\nimport LazyDataEnhancer from './LazyDataEnhancer'\nimport {lazyValueEnhancer} from '../../util/lazyLoading'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => {\n const infos = {\n path: props.path,\n formName: state.entityList.formName,\n key: props.entityKey\n }\n\n return {\n value: lazyValueEnhancer(props.value, props.type, state.list.lazyData, infos)\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LazyDataEnhancer)\n","import LazyDataEnhancerContainer from './LazyDataEnhancerContainer'\n\nexport default LazyDataEnhancerContainer\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography} from 'tocco-ui'\nimport {formData, field} from 'tocco-app-extensions'\nimport {js} from 'tocco-util'\n\nimport {StyledSpan} from './StyledComponents'\nimport LazyDataEnhancer from '../components/LazyDataEnhancer'\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst multiTypes = ['multi-select-box', 'multi-remote-field']\n\nexport default (fieldDefinition, entity, intl) => {\n const {\n id,\n path,\n dataType\n } = fieldDefinition\n const isMultiType = multiTypes.includes(dataType)\n const pathValue = entity[path]\n const values = !isMultiType && Array.isArray(pathValue) ? pathValue : [pathValue]\n const formDataContainer = values.map((v, idx) =>\n <formData.FormDataContainer key={`formDataContainer-${entity.__key}-${path}-${idx}`} navigationStrategy={true}>\n <FormattedValueWrapper type={dataType} value={v} intl={intl} formField={fieldDefinition}/>\n </formData.FormDataContainer>\n ).reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n\n return (\n <StyledSpan key={id}>\n {formDataContainer}\n </StyledSpan>\n )\n}\n\nconst FormattedValueWrapper = ({\n value,\n type,\n formData,\n intl,\n formField\n}) => {\n const modelField = {\n targetEntity: value && js.getOrFirst(value).model\n }\n\n const Field = useMemo(() => field.factory('list', type), [])\n\n return (\n <LazyDataEnhancer value={value} type={type}>\n <Field\n type={type}\n formField={formField}\n modelField={modelField}\n value={value}\n formData={formData}\n breakWords={false}\n />\n </LazyDataEnhancer>\n )\n}\n\nFormattedValueWrapper.propTypes = {\n value: PropTypes.any,\n type: PropTypes.string.isRequired,\n formData: PropTypes.shape({\n navigationStrategy: PropTypes.object\n }),\n intl: PropTypes.object.isRequired,\n formField: PropTypes.object.isRequired\n}\n","import React from 'react'\nimport {actions, form} from 'tocco-app-extensions'\nimport {FormattedValue} from 'tocco-ui'\n\nimport fieldFactory from './fieldFactory'\nimport LazyDataCell from '../components/LazyDataEnhancer'\nimport {StyledActionWrapper} from './StyledComponents'\n\nexport default (field, entity, parent, intl) => {\n const {componentType} = field\n\n if (actions.isAction(componentType)) {\n return getAction(field, entity, parent)\n } else if (componentType === form.componentTypes.FIELD) {\n return fieldFactory(field, entity, intl)\n } else if (componentType === form.componentTypes.DISPLAY) {\n return getDisplayExpression(field, entity)\n }\n}\n\nconst getDisplayExpression = (field, entity) =>\n <LazyDataCell\n key={'action-' + field.id}\n path={field.id}\n entityKey={entity.__key}\n type={'displayExpression'}\n value={null}\n >\n <FormattedValue type=\"html\" breakWords={false} value={entity[field.id]}/>\n </LazyDataCell>\n\nconst getAction = (field, entity, parent) =>\n <StyledActionWrapper\n key={'action-' + field.id}\n onClick={e => {\n e.stopPropagation()\n }}\n >\n <actions.Action\n key={'tableAction' + field.id}\n definition={field}\n selection={actions.getSingleEntitySelection(entity.__model, entity.__key)}\n parent={parent}\n />\n </StyledActionWrapper>\n","import _uniq from 'lodash/uniq'\nimport {actions, form} from 'tocco-app-extensions'\nimport {api} from 'tocco-util'\n\nimport cellRenderer from '../cellRenderer'\n\nexport const getTable = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.TABLE)\n\nexport const getActionBar = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.ACTION_BAR)\n\nexport const getSorting = formDefinition => {\n const table = getTable(formDefinition)\n return table.sorting ? table.sorting : []\n}\n\nexport const getSelectable = formDefinition => {\n const table = getTable(formDefinition)\n return table.selectable !== false\n}\n\nexport const getClickable = formDefinition => {\n const table = getTable(formDefinition)\n return table.clickable !== false\n}\n\nexport const getDisablePreferencesMenu = formDefinition =>\n formDefinition.disablePreferencesMenu === true\n\nexport const getEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.endpoint || null\n}\n\nexport const getSearchEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.searchEndpoint || null\n}\n\nexport const getConstriction = formDefinition => {\n const table = getTable(formDefinition)\n return table.constriction || null\n}\n\nconst isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\nexport const getColumnDefinition = ({\n table,\n sorting,\n sortable = true,\n parent,\n intl,\n columnDisplayPreferences = {},\n cellRenderers = {}\n}\n\n) => table.children\n .filter(column => Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? columnDisplayPreferences[column.id]\n : !column.hidden)\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map(c => (\n {\n id: c.id,\n label: c.label,\n sorting: {\n sortable: sortable && c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n shrinkToContent: c.shrinkToContent || false,\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) =>\n c.clientRenderer && cellRenderers[c.clientRenderer]\n ? cellRenderers[c.clientRenderer](rowData, column, child => cellRenderer(child, rowData, parent, intl))\n : column.children.map(child => cellRenderer(child, rowData, parent, intl))\n }\n ))\n\nexport const getFields = (formDefinition, columnDisplayPreferences) => {\n const relationFields = []\n const displayExpressionFields = []\n const columns = getColumnDefinition({table: getTable(formDefinition), columnDisplayPreferences})\n\n const fields = columns.reduce((accumulator, current) => (\n [\n ...accumulator,\n ...current.children\n .filter(child => !actions.isAction(child.componentType))\n .map(child => {\n if (api.relationFieldTypes.includes(child.dataType)) {\n relationFields.push(child.path)\n } else if (child.componentType === 'display') {\n displayExpressionFields.push(child.id)\n return null\n }\n\n return child.path\n }).filter(f => f)]\n ), [])\n\n return {paths: _uniq(fields), relationFields, displayExpressionFields}\n}\n\nexport const getFormFieldFlat = formDefinition =>\n searchChildren(formDefinition)\n\nconst searchChildren = node => {\n if (node.componentType === 'field-set') {\n return node.children.reduce((acc, value) => ({...acc, [value.path || value.id]: value.dataType}), {})\n } else if (node.children) {\n return node.children.reduce((acc, value) => ({\n ...acc,\n ...searchChildren(value)\n }), {})\n }\n}\n\n/**\n * If the search form contains a field pointing to the parent entity this must not be a full-text\n * search field and should be readonly. This function will search for the correct field and replace its\n * type and change the readonly attribute.\n */\nexport const changeParentFieldType = (formElement, parentPath) => {\n if (formElement.componentType === 'field-set') {\n const containsParentField = formElement.children.some(child => child.path === parentPath)\n\n return {\n ...formElement,\n ...(containsParentField && {readonly: true}),\n children: formElement.children.map(child =>\n child.path === parentPath\n ? {...child, dataType: 'single-select-box'}\n : child)\n }\n }\n if (formElement.children) {\n return {\n ...formElement,\n children: formElement.children.map(child => changeParentFieldType(child, parentPath))\n }\n }\n\n return formElement\n}\n\nexport const getTableColumns = (formDefinition, columnDisplayPreferences = {}, parent) =>\n getTable(formDefinition)\n .children\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .map(column => ({\n ...column,\n hidden: Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? !columnDisplayPreferences[column.id]\n : column.hidden\n }))\n","import React from 'react'\nimport _forOwn from 'lodash/forOwn'\nimport {FormattedMessage} from 'react-intl'\nimport {form} from 'tocco-app-extensions'\n\nexport const validateSearchFields = (values, formDefinition) => {\n const errors = {}\n\n _forOwn(values, (value, fieldName) => {\n let fieldDefinition = fieldDefinitionCache.get(fieldName)\n if (!fieldDefinition) {\n fieldDefinition = getFieldDefinition(form.transformFieldNameBack(fieldName), formDefinition)\n fieldDefinitionCache.add(fieldName, fieldDefinition)\n }\n\n if (fieldDefinition) {\n const fieldErrors = validateField(value, fieldDefinition)\n if (fieldErrors) {\n errors[fieldName] = fieldErrors\n }\n }\n })\n\n return errors\n}\n\nconst validateField = (value, definition) => {\n const type = definition.dataType\n const typeValidator = typeValidators[type]\n\n if (typeValidator) {\n return typeValidator(value)\n }\n return null\n}\n\nconst fieldDefinitionCache = (() => {\n const definitionCache = {}\n\n const addToCache = (name, definition) => {\n definitionCache[name] = definition\n }\n const getFromCache = name => definitionCache[name]\n\n return {\n add: addToCache,\n get: getFromCache\n }\n})()\n\nconst getFieldDefinition = (fieldName, fieldDefinition) => {\n if (fieldDefinition.id === fieldName) {\n return fieldDefinition.children[0]\n }\n\n let result = null\n if (fieldDefinition.children) {\n fieldDefinition.children.forEach(child => {\n const fieldDefinition = getFieldDefinition(fieldName, child)\n if (fieldDefinition) {\n result = fieldDefinition\n }\n })\n }\n\n return result\n}\n\nconst typeValidators = {\n 'string': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n },\n 'fulltext-search': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n }\n}\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\nimport {StyledLabel, StyledLi} from 'tocco-ui/src/Typography'\nimport {lighten} from 'polished'\n\nexport const StyledUl = styled.ul`\n list-style-type: none;\n margin-top: ${scale.space(-0.5)} !important; // Nice2 Reset\n padding-left: ${scale.space(-0.5)} !important; // Nice2 Reset\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n\n ${StyledLabel} {\n padding: 0 !important; // Nice2 Reset\n }\n`\n\nexport const StyledCheckbox = styled.input`\n vertical-align: top;\n margin-right: ${scale.space(-1)} !important; // Nice2 Reset\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledButtonWrapper = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n\nexport const StyledId = styled.span`\n color: ${theme.color('text')};\n font-style: italic;\n`\n\nexport const StyledItem = styled(StyledLi)`\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.secondary}` : 'none'};\n ${({draggable, theme}) => draggable && `\n &:hover {\n background-color: ${lighten(0.25, theme.colors.secondaryLight)};\n\n &,\n label {\n cursor: pointer;\n }\n }\n `\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useMemo} from 'react'\nimport {dragAndDrop} from 'tocco-util'\nimport {Button, SearchBox, Typography} from 'tocco-ui'\n\nimport {\n StyledCheckbox,\n StyledUl,\n StyledButtonWrapper,\n StyledId,\n StyledItem\n} from './StyledColumnPicker'\n\nconst ColumnPicker = ({onOk, dndEnabled, initialColumns, intl}) => {\n const [columns, setColumns] = useState(initialColumns)\n const [searchTerm, setSearchTerm] = useState(null)\n const changeColumnPosition = (currentlyDragging, currentlyDragOver) => {\n if (currentlyDragging !== currentlyDragOver) {\n const currentlyDraggingItem = columns.find(c => c.id === currentlyDragging)\n setColumns(cols => cols\n .filter(c => c !== currentlyDraggingItem)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key.id === currentlyDragOver ? [currentlyDraggingItem] : [])\n ], []))\n }\n }\n const {dndEvents, dndState} = dragAndDrop.useDnD(changeColumnPosition)\n\n const items = useMemo(() => columns\n .filter(column => searchTerm === null || column.label.match(new RegExp(searchTerm, 'i')))\n .map(column => <StyledItem\n key={column.id}\n draggable={dndEnabled}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n {...(dndEnabled && {...dndEvents(column.id)})}>\n <StyledCheckbox\n type={'checkbox'}\n id={column.id}\n checked={!column.hidden}\n onChange={value => setColumns(columns\n .map(c => c.id === column.id\n ? ({\n ...c,\n hidden: !value.target.checked\n })\n : c))}\n />\n <Typography.Label for={column.id}>\n {column.label || <StyledId>{column.id}</StyledId>}\n </Typography.Label>\n </StyledItem>), [searchTerm, columns, dndState])\n\n return (\n <div>\n <SearchBox\n placeholder={intl.formatMessage({id: 'client.entity-list.preferences.columns.search'})}\n onSearch={setSearchTerm}/>\n <StyledUl>{items}</StyledUl>\n <StyledButtonWrapper>\n <Button onClick={() => onOk(columns)} look={'raised'}>\n {intl.formatMessage({id: 'client.entity-list.preferences.columns.okButton'})}\n </Button>\n </StyledButtonWrapper>\n </div>\n )\n}\n\nColumnPicker.propTypes = {\n initialColumns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n label: PropTypes.string,\n hidden: PropTypes.bool.isRequired\n })).isRequired,\n onOk: PropTypes.func.isRequired,\n dndEnabled: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default ColumnPicker\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ColumnPicker from './ColumnPicker'\n\nconst mapStateToProps = (state, props) => ({\n columns: props.columns,\n onOk: props.onOk\n})\n\nexport default connect(mapStateToProps)(injectIntl(ColumnPicker))\n","import ColumnPicker from './ColumnPickerContainer'\n\nexport default ColumnPicker\n","import {form, rest, notification} from 'tocco-app-extensions'\nimport React, {useState} from 'react'\nimport _reduce from 'lodash/reduce'\nimport {\n actions as formActions,\n getFormValues,\n isDirty\n} from 'redux-form'\nimport * as formActionTypes from 'redux-form/es/actionTypes'\nimport {call, put, select, takeLatest, take, all} from 'redux-saga/effects'\nimport {EditableValue, StatedValue} from 'tocco-ui'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButton} from './StyledComponents'\nimport * as actions from './actions'\nimport {getFormFieldFlat, getEndpoint, changeParentFieldType} from '../../util/api/forms'\nimport {setSearchFormType} from '../entityList/actions'\nimport {validateSearchFields} from '../../util/searchFormValidation'\nimport {SET_ENTITY_MODEL, SET_FORM_DEFINITION} from '../list/actions'\nimport {getBasicQuery} from '../list/sagas'\nimport searchFormTypes from '../../util/searchFormTypes'\nimport ColumnPicker from '../../components/ColumnPicker'\n\nexport const inputSelector = state => state.input\nexport const searchFormSelector = state => state.searchForm\nexport const listSelector = state => state.list\nexport const entityListSelector = state => state.entityList\nexport const listFromDefinitionSelector = state => state.list.formDefinition\nexport const searchValuesSelector = getFormValues('searchForm')\nexport const isDirtySelector = isDirty('searchForm')\n\nconst FORM_ID = 'searchForm'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(formActionTypes.CHANGE, submitSearchFrom),\n takeLatest(actions.SUBMIT_SEARCH_FORM, submitSearchFrom),\n takeLatest(actions.RESET_SEARCH, resetSearch),\n takeLatest(actions.SAVE_SEARCH_FILTER, saveSearchFilter),\n takeLatest(actions.DELETE_SEARCH_FILTER, deleteSearchFilter),\n takeLatest(actions.SAVE_DEFAULT_SEARCH_FILTER, saveDefaultSearchFilter),\n takeLatest(actions.RESET_DEFAULT_SEARCH_FILTER, resetDefaultSearchFilter),\n takeLatest(actions.DISPLAY_SEARCH_FIELDS_MODAL, displaySearchFieldsModal),\n takeLatest(actions.RESET_SEARCH_FIELDS, resetSearchFields)\n ])\n}\n\nexport function* initialize() {\n const {searchFormType, entityName} = yield select(entityListSelector)\n const searchFormVisible = searchFormType !== searchFormTypes.NONE\n\n const formDefinition = searchFormVisible ? yield call(loadSearchForm) : null\n yield call(setInitialFormValues, searchFormVisible, formDefinition)\n if (searchFormType === searchFormTypes.ADMIN) {\n yield call(loadSearchFilter, entityName)\n }\n\n yield put(actions.setInitialized())\n}\n\nexport function* getListFormDefinition() {\n const formDefinition = yield select(listFromDefinitionSelector)\n if (!formDefinition) {\n const action = yield take(SET_FORM_DEFINITION)\n return action.payload.formDefinition\n }\n\n return formDefinition\n}\n\nexport function* setInitialFormValues(searchFormVisible, formDefinition) {\n const {preselectedSearchFields} = yield select(inputSelector)\n const {parent} = yield select(entityListSelector)\n let formValues = {}\n if (preselectedSearchFields) {\n const model = yield call(getEntityModel)\n const preselectedValues = searchFormVisible\n ? yield call(form.transformInputValues, preselectedSearchFields, model)\n : preselectedSearchFields\n\n formValues = {...formValues, ...preselectedValues}\n }\n\n if (parent && !Object.prototype.hasOwnProperty.call(formValues, parent.reverseRelationName)) {\n const listFormDefinition = yield call(getListFormDefinition)\n const endpoint = yield call(getEndpoint, listFormDefinition)\n if (!endpoint) {\n const display = yield call(rest.fetchDisplay, parent.model, parent.key)\n formValues[parent.reverseRelationName] = {key: parent.key, display}\n }\n }\n\n if (searchFormVisible && formDefinition) {\n const fieldDefinitions = yield call(form.getFieldDefinitions, formDefinition)\n const fromDefaultValues = yield call(form.getDefaultValues, fieldDefinitions)\n formValues = {...fromDefaultValues, ...formValues}\n }\n\n const transformedFromValues = yield call(transformFieldNames, formValues)\n const oldValues = yield select(getFormValues(FORM_ID))\n\n yield put(formActions.initialize(FORM_ID, transformedFromValues))\n if (oldValues) {\n yield all(Object.keys(oldValues).map(fieldId =>\n put(formActions.change(FORM_ID, fieldId, oldValues[fieldId]))\n ))\n }\n yield put(actions.setValuesInitialized(true))\n}\n\nexport function* transformFieldNames(formValues) {\n return _reduce(formValues, (acc, val, key) => (\n {...acc, [form.transformFieldName(key)]: val}\n ), {})\n}\n\nexport function* submitSearchFrom() {\n const values = yield select(getFormValues(FORM_ID))\n const {formDefinition} = yield select(searchFormSelector)\n const errors = yield call(validateSearchFields, values, formDefinition)\n\n if (Object.keys(errors).length === 0) {\n yield put(actions.executeSearch())\n }\n}\n\nexport function* loadSearchFilter(entityName) {\n const searchFilters = yield call(rest.fetchSearchFilters, entityName)\n\n const {parent} = yield select(entityListSelector)\n const listHasNoParent = !parent\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, ...(listHasNoParent && searchFilter.defaultFilter && {active: true})}))\n ))\n}\n\nexport function* setSimpleForm() {\n const formDefinition = {txtFulltext: 'fulltext-search'}\n yield put(actions.setFormFieldsFlat(formDefinition))\n}\n\nexport function* loadSearchForm(forceLoad = false) {\n const {searchFormType, formName} = yield select(entityListSelector)\n if (searchFormType === searchFormTypes.SIMPLE) {\n yield call(setSimpleForm)\n return null\n }\n\n let formDefinition = yield call(rest.fetchForm, formName, 'search', true, forceLoad)\n\n if (formDefinition) {\n const {parent} = yield select(inputSelector)\n if (parent && parent.reverseRelationName) {\n formDefinition = yield call(changeParentFieldType, formDefinition, parent.reverseRelationName)\n }\n\n yield put(actions.setFormDefinition(formDefinition))\n yield put(actions.setFormFieldsFlat(getFormFieldFlat(formDefinition)))\n return formDefinition\n } else {\n yield put(setSearchFormType(searchFormTypes.SIMPLE))\n yield call(setSimpleForm)\n return null\n }\n}\n\nexport function* getEntityModel() {\n const entityList = yield select(listSelector)\n if (Object.keys(entityList.entityModel).length === 0) {\n yield take(SET_ENTITY_MODEL)\n }\n\n const {entityModel} = yield select(listSelector)\n return entityModel\n}\n\nexport function* resetSearchFilters() {\n const {searchFilters} = yield select(searchFormSelector)\n\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, active: searchFilter.defaultFilter})\n )))\n}\n\nexport function* resetSearch() {\n yield call(resetSearchFilters)\n yield put(formActions.reset('searchForm'))\n yield call(submitSearchFrom)\n}\n\nexport function* getSearchFormValues() {\n const {valuesInitialized} = yield select(searchFormSelector)\n\n if (!valuesInitialized) {\n yield take(actions.SET_VALUES_INITIALIZED)\n }\n\n const searchValues = yield select(searchValuesSelector)\n\n return _reduce(searchValues, (result, value, key) => (\n {\n ...result,\n ...(!Array.isArray(value) || value.length) ? {[form.transformFieldNameBack(key)]: value} : {}\n }\n ), {})\n}\n\nexport function* saveSearchFilter() {\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-save',\n 'client.entity-list.search.settings.saveAsFilter',\n null,\n ({close}) => {\n const onSave = value => {\n close()\n answerChannel.put(value)\n }\n const [name, setName] = useState('')\n return <>\n <StatedValue label={'Name'}>\n <EditableValue type={'string'} value={name} events={{onChange: setName}}/>\n </StatedValue>\n <StyledButton onClick={() => onSave(name)} look={'raised'} ink={'primary'} disabled={!name}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter.button\"/>\n </StyledButton>\n </>\n },\n true\n ))\n\n const searchFilterName = yield take(answerChannel)\n const {where, filter} = yield call(getBasicQuery, false)\n const {sorting} = yield select(listSelector)\n const {entityName} = yield select(entityListSelector)\n\n const createdSearchFilter = yield call(saveNewSearchFilter, searchFilterName, entityName, where, sorting, filter)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n yield put(actions.setSearchFilterActive(createdSearchFilter.uniqueId, true, true))\n}\n\nexport function* saveNewSearchFilter(name, entityName, query, sorting, filters) {\n const order = rest.createSortingString(sorting)\n const resource = 'client/searchfilters'\n const body = {\n name,\n query,\n entityName,\n order,\n filters\n }\n const {body: response} = yield call(rest.requestSaga, resource, {method: 'POST', body})\n return response\n}\n\nexport function* deleteSearchFilter({payload: {primaryKey}}) {\n const {actionAppComponent: ActionAppComponent, navigationStrategy} = yield select(inputSelector)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-delete',\n 'client.actions.delete.title',\n null,\n ({close}) => {\n const onSuccess = () => {\n answerChannel.put(true)\n close()\n }\n\n const onCancel = () => {\n answerChannel.put(false)\n close()\n }\n\n return <ActionAppComponent\n appId={'delete'}\n selection={{\n entityName: 'Search_filter',\n ids: [primaryKey],\n type: 'ID'\n }}\n navigationStrategy={navigationStrategy}\n onSuccess={onSuccess}\n onCancel={onCancel}/>\n },\n true\n ))\n\n const isSearchFilterDeleted = yield take(answerChannel)\n if (isSearchFilterDeleted) {\n const {entityName} = yield select(entityListSelector)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n }\n}\n\nexport function* saveDefaultSearchFilter() {\n const {searchFilters, formDefinition} = yield select(searchFormSelector)\n const key = `${formDefinition.modelName}.${formDefinition.id}.searchfilter`\n const value = searchFilters.find(s => s.active).key\n yield call(rest.savePreferences, {[key]: value})\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.save.success'\n }))\n}\n\nexport function* resetDefaultSearchFilter() {\n const {formDefinition} = yield select(searchFormSelector)\n yield call(rest.deleteUserPreferences, `${formDefinition.modelName}.${formDefinition.id}.searchfilter`)\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.reset.success'\n }))\n}\n\nexport function* displaySearchFieldsModal() {\n const {formDefinition} = yield select(searchFormSelector)\n const columns = formDefinition.children.flatMap(f => f.children).map(f => ({\n id: f.id,\n label: f.label,\n hidden: f.hidden === true\n }))\n const columnsSorted = [\n ...columns.filter(f => !f.hidden),\n ...columns.filter(f => f.hidden)\n ]\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-search-fields-selection`,\n 'client.entity-list.search.settings.searchForm.edit',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={columnsSorted} onOk={onOk} dndEnabled={true}/>\n },\n true\n ))\n\n yield call(saveSearchFields, formDefinition.modelName, answerChannel)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n\nfunction* saveSearchFields(modelName, answerChannel) {\n const columns = yield take(answerChannel)\n const resource = `forms/${modelName}/search-fields`\n const options = {\n method: 'POST',\n body: {\n hiddenFields: columns.filter(c => c.hidden).map(c => c.id),\n displayedFields: columns.filter(c => !c.hidden).map(c => c.id)\n }\n }\n\n yield call(rest.requestSaga, resource, options)\n}\n\nexport function* resetSearchFields() {\n const {formDefinition} = yield select(searchFormSelector)\n const resource = `forms/${formDefinition.modelName}/search-fields/reset`\n const options = {\n method: 'POST'\n }\n\n yield call(rest.requestSaga, resource, options)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n","import {api} from 'tocco-util'\n\nexport const entitiesListTransformer = json => {\n return json.data.map(entity => api.getFlattenEntity(entity))\n}\n","import _isEqual from 'lodash/isEqual'\nimport _union from 'lodash/union'\nimport {externalEvents, rest, remoteEvents, actionEmitter} from 'tocco-app-extensions'\nimport _omit from 'lodash/omit'\nimport {call, put, fork, select, spawn, takeEvery, takeLatest, all, take, delay} from 'redux-saga/effects'\nimport {api, consoleLogger} from 'tocco-util'\n\nimport {getFetchOptionsFromSearchForm} from '../../util/api/fetchOptions'\nimport * as actions from './actions'\nimport * as searchFormActions from '../searchForm/actions'\nimport * as selectionActions from '../selection/actions'\nimport {getSearchFormValues} from '../searchForm/sagas'\nimport {\n getSorting,\n getSelectable,\n getClickable,\n getEndpoint,\n getSearchEndpoint,\n getConstriction,\n getFields,\n getDisablePreferencesMenu\n} from '../../util/api/forms'\nimport {entitiesListTransformer} from '../../util/api/entities'\nimport * as preferencesActions from '../preferences/actions'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const listSelector = state => state.list\nexport const searchFormSelector = state => state.searchForm\nexport const selectionSelector = state => state.selection\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.CHANGE_PAGE, changePage),\n takeLatest(searchFormActions.EXECUTE_SEARCH, reloadData),\n takeLatest(searchFormActions.EXECUTE_SEARCH, queryChanged),\n takeLatest(actions.SET_SORTING_INTERACTIVE, reloadData),\n takeLatest(actions.REFRESH, refreshData),\n takeLatest(actions.NAVIGATE_TO_CREATE, navigateToCreate),\n takeLatest(actions.NAVIGATE_TO_ACTION, navigateToAction),\n takeLatest(selectionActions.RELOAD_DATA, reloadData),\n takeLatest(actions.ON_ROW_CLICK, onRowClick),\n takeEvery(remoteEvents.REMOTE_EVENT, remoteEvent),\n takeLatest(searchFormActions.SET_SEARCH_FILTER_ACTIVE, setSorting),\n takeLatest(actions.DEFINE_SORTING, setSorting),\n takeLatest(actions.SET_MARKED, setMarked),\n takeLatest(actions.TOGGLE_MARKINGS, toggleMarkings)\n ])\n}\n\nexport function* initialize() {\n const {entityName, formName} = yield select(entityListSelector)\n const {scope} = yield select(listSelector)\n yield all([\n call(loadFormDefinition, formName, scope),\n call(loadEntityModel, entityName)\n ])\n\n yield put(actions.setInitialized())\n}\n\nexport function* queryChanged() {\n const query = yield call(getBasicQuery)\n yield put(selectionActions.setQuery(query))\n yield put(externalEvents.fireExternalEvent('onSearchChange', {query: query}))\n}\n\nexport function* loadData(page) {\n yield put(actions.setInProgress(true))\n yield fork(countEntities)\n yield put(actions.clearEntityStore())\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* getBasicQuery(regardSelection = true) {\n const {inputSearchFilters, inputTql, inputKeys, constriction} = yield select(listSelector)\n\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n if (regardSelection && showSelectedRecords) {\n return {\n keys: selection\n }\n }\n\n const {formFieldsFlat, searchFilters: searchFormSearchFilter} = yield select(searchFormSelector)\n const searchFormValues = yield call(getSearchFormValues)\n\n const searchFormFetchOptions = yield call(getFetchOptionsFromSearchForm, searchFormValues, formFieldsFlat)\n\n const relevantSearchFormFetchOptions = _omit(searchFormFetchOptions, ['filters', 'tql'])\n const filter = yield call(getSearchFilter, inputSearchFilters, searchFormFetchOptions.filters, searchFormSearchFilter)\n const where = yield call(getTql, inputTql, searchFormFetchOptions.tql)\n\n const hasUserChanges = Object.keys(relevantSearchFormFetchOptions).length > 0\n || !_isEqual(inputSearchFilters || [], filter)\n || (!!searchFormFetchOptions.tql && searchFormFetchOptions.tql.length > 0)\n\n return {\n ...relevantSearchFormFetchOptions,\n ...(filter && filter.length > 0 ? {filter} : {}),\n ...(where ? {where} : {}),\n ...(constriction && {constriction}),\n ...(inputKeys ? {keys: inputKeys} : {}),\n hasUserChanges\n }\n}\n\nexport function* prepareEndpointUrl(endpoint, searchEndpoint, hasUserChanges) {\n const {parent} = yield select(entityListSelector)\n const parentKey = parent ? parent.key : ''\n const selectedEndpoint = hasUserChanges && searchEndpoint ? searchEndpoint : endpoint\n return selectedEndpoint ? selectedEndpoint.replace('{parentKey}', parentKey) : null\n}\n\nexport function* countEntities() {\n const {entityName} = yield select(inputSelector)\n const {endpoint, searchEndpoint} = yield select(listSelector)\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n\n const regardSelection = !showSelectedRecords\n const query = yield call(getBasicQuery, regardSelection)\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, query.hasUserChanges)\n\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n const entityCount = yield call(rest.fetchEntityCount, entityName, query, requestOptions)\n\n if (showSelectedRecords) {\n yield put(actions.setEntityCount(selection.length))\n } else {\n yield put(actions.setEntityCount(entityCount))\n }\n\n yield put(selectionActions.setQueryCount(entityCount))\n}\n\nexport function* changePage({payload}) {\n const {page} = payload\n yield put(actions.setInProgress(true))\n yield put(actions.setCurrentPage(page))\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* refreshData() {\n const {currentPage} = yield select(listSelector)\n yield call(loadData, currentPage)\n}\n\nexport function* reloadData() {\n yield put(actions.setCurrentPage(1))\n yield call(loadData, 1)\n}\n\nexport function* getSearchFilter(inputSearchFilters, searchInputsFilters, adminSearchFormFilters = []) {\n const activeSearchFormFilters = adminSearchFormFilters && adminSearchFormFilters\n .filter(f => f.active).map(f => f.uniqueId)\n\n return yield call(_union, inputSearchFilters, searchInputsFilters, activeSearchFormFilters)\n}\n\nexport function* hasActiveSearchFilterOrderBy() {\n const {searchFilters} = yield select(searchFormSelector)\n return searchFilters && searchFilters.some(f => f.active && f.orderBy)\n}\n\nexport const getTql = (inputTql, searchTql) => [\n ...(inputTql && inputTql.length > 0 ? [`(${inputTql})`] : []),\n ...(searchTql && searchTql.length > 0 ? [`(${searchTql})`] : [])\n].join(' and ')\n\nexport function* loadDisplayExpressions(formName, scope, paths, entities) {\n if (paths && paths.length > 0 && entities.length > 0) {\n const keys = entities.map(e => e.__key)\n const entityName = entities[0].__model\n const result = yield call(rest.fetchDisplayExpressions, formName, scope, keys, paths, entityName)\n yield put(actions.setLazyData('displayExpressions', formName, result))\n }\n}\n\nexport function* loadRelationDisplays(relationFields, entities) {\n if (relationFields && relationFields.length > 0) {\n const {lazyData} = yield select(listSelector)\n const request = yield call(api.getPathDisplayRequest, entities, relationFields, lazyData)\n const displays = yield call(rest.fetchDisplays, request)\n yield all(Object.keys(displays).map(entity =>\n put(actions.setLazyData('defaultDisplays', entity, displays[entity]))\n ))\n }\n}\n\nexport function* loadMarkings(entities) {\n const {formDefinition, entityModel} = yield select(listSelector)\n if (entityModel.markable && formDefinition.markable && entities.length > 0) {\n const selection = {\n type: 'ID',\n entityName: entityModel.name,\n ids: entities.map(e => e.__key)\n }\n const result = yield call(rest.fetchMarkings, selection)\n yield call(setLazyDataMarked, entityModel.name, result)\n }\n}\n\nexport function* setMarked({payload: {entityName, entityKey, marked}}) {\n try {\n yield all([\n call(setLazyDataMarked, entityName, {\n [entityKey]: marked\n }),\n call(rest.setMarked, entityName, entityKey, marked)\n ])\n } catch (e) {\n consoleLogger.logError('Failed to set marked', e)\n yield call(setLazyDataMarked, entityName, {\n [entityKey]: !marked\n })\n }\n}\n\nexport function* toggleMarkings({payload: {selection}}) {\n try {\n const oldMarkings = yield call(rest.fetchMarkings, selection)\n const setToMarked = Object.values(oldMarkings).includes(false)\n const newMarkings = yield call(rest.setSelectionMarked, selection, setToMarked)\n yield call(setLazyDataMarked, selection.entityName, newMarkings)\n } catch (e) {\n consoleLogger.logError('Failed to toggle markings', e)\n }\n}\n\nexport function* setLazyDataMarked(entityName, markings) {\n const {lazyData} = yield select(listSelector)\n const currentEntityMarkings = lazyData.markings && lazyData.markings[entityName] ? lazyData.markings[entityName] : {}\n const newEntityMarkings = {\n ...currentEntityMarkings,\n ...markings\n }\n yield put(actions.setLazyData('markings', entityName, newEntityMarkings))\n}\n\nexport function* fetchEntitiesAndAddToStore(page) {\n const {entityName, formName} = yield select(entityListSelector)\n const {columns: columnPreferences} = yield select(preferencesSelector)\n const {entityStore, sorting, limit, formDefinition, endpoint, searchEndpoint, scope} = yield select(listSelector)\n if (!entityStore[page]) {\n const {paths, relationFields, displayExpressionFields} = yield call(getFields, formDefinition, columnPreferences)\n const basicQuery = yield call(getBasicQuery)\n const query = {\n ...basicQuery,\n page,\n sorting,\n limit,\n paths\n }\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, basicQuery.hasUserChanges)\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n\n const entities = yield call(rest.fetchEntities, entityName, query, requestOptions, entitiesListTransformer)\n\n yield put(actions.addEntitiesToStore(page, entities))\n yield spawn(loadRelationDisplays, relationFields, entities)\n yield spawn(loadDisplayExpressions, formName, scope, displayExpressionFields, entities)\n yield spawn(loadMarkings, entities)\n }\n}\n\nexport function* requestEntities(page) {\n const {entityStore} = yield select(listSelector)\n\n if (!entityStore[page]) {\n yield call(fetchEntitiesAndAddToStore, page)\n }\n\n yield call(displayEntity, page)\n yield spawn(delayedPreloadNextPage, page)\n}\n\nexport function* delayedPreloadNextPage(page) {\n yield delay(2000)\n yield call(preloadNextPage, page)\n}\n\nexport function* preloadNextPage(currentPage) {\n const list = yield select(listSelector)\n const {entityStore, limit} = list\n let {entityCount} = list\n const nextPage = currentPage + 1\n\n if (entityCount === null || entityCount === undefined) {\n const setCountAction = yield take(actions.SET_ENTITY_COUNT)\n entityCount = setCountAction.payload.entityCount\n }\n\n if (currentPage * limit < entityCount && !entityStore[nextPage]) {\n yield call(fetchEntitiesAndAddToStore, nextPage)\n }\n}\n\nexport function* displayEntity(page) {\n const list = yield select(listSelector)\n const entities = list.entityStore[page]\n yield put(actions.setEntities(entities))\n}\n\nfunction* getPreferencesSorting() {\n const preferences = yield select(preferencesSelector)\n if (!preferences.sorting) {\n const {payload} = yield take(preferencesActions.SET_SORTING)\n return payload.sorting\n } else {\n return preferences.sorting\n }\n}\n\nexport const FALLBACK_SORTING_FIELD = 'update_timestamp'\nexport function* setSorting() {\n const {formDefinition, entityModel} = yield select(listSelector)\n const tableSorting = yield call(getSorting, formDefinition)\n const preferencesSorting = yield call(getPreferencesSorting)\n const activeSearchFilterHasOrderBy = yield call(hasActiveSearchFilterOrderBy)\n if (preferencesSorting && preferencesSorting.length > 0) {\n yield put(actions.setSorting(preferencesSorting))\n } else if (tableSorting.length > 0) {\n yield put(actions.setSorting(tableSorting))\n } else if (!activeSearchFilterHasOrderBy && entityModel.paths[FALLBACK_SORTING_FIELD]) {\n yield put(actions.setSorting([{field: FALLBACK_SORTING_FIELD, order: 'desc'}]))\n } else {\n yield put(actions.setSorting([]))\n }\n}\n\nexport function* loadFormDefinition(formName, scope) {\n const fetchedFormDefinition = yield call(rest.fetchForm, formName, scope)\n yield put(actions.setFormDefinition(fetchedFormDefinition))\n yield call(extractFormInformation, fetchedFormDefinition)\n}\n\nexport function* extractFormInformation(formDefinition) {\n const selectable = yield call(getSelectable, formDefinition)\n yield put(actions.setFormSelectable(selectable))\n const clickable = yield call(getClickable, formDefinition)\n yield put(actions.setFormClickable(clickable))\n const endpoint = yield call(getEndpoint, formDefinition)\n yield put(actions.setEndpoint(endpoint))\n const searchEndpoint = yield call(getSearchEndpoint, formDefinition)\n yield put(actions.setSearchEndpoint(searchEndpoint))\n const constriction = yield call(getConstriction, formDefinition)\n yield put(actions.setConstriction(constriction))\n const disablePreferencesMenu = yield call(getDisablePreferencesMenu, formDefinition)\n yield put(actions.setDisablePreferencesMenu(disablePreferencesMenu))\n}\n\nexport function* loadEntityModel(entityName) {\n const model = yield call(rest.fetchModel, entityName)\n yield put(actions.setEntityModel(model))\n}\n\nexport function* onRowClick({payload}) {\n const {selectOnRowClick} = yield select(inputSelector)\n if (selectOnRowClick === true) {\n const list = yield select(selectionSelector)\n const selected = list.selection.includes(payload.id)\n yield put(selectionActions.onSelectChange([payload.id], !selected))\n }\n yield put(externalEvents.fireExternalEvent('onRowClick', {id: payload.id}))\n}\n\nexport function* navigateToCreate({payload}) {\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToCreateRelative, payload.relationName)\n}\n\nexport function* navigateToAction({payload}) {\n const {definition, selection} = payload\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToActionRelative, definition, selection)\n}\n\nexport const containsEntityOfModel = (event, entityName) =>\n !!event.payload.entities.find(entity => entity.entityName === entityName)\n\nexport function* remoteEvent(action) {\n const event = action.payload.event\n const {entityModel} = yield select(listSelector)\n if (['entity-create-event', 'entity-delete-event', 'entity-update-event'].includes(event.type)) {\n if (containsEntityOfModel(event, entityModel.name)) {\n yield call(reloadData)\n }\n }\n\n if (event.type === 'entity-delete-event') {\n const deletedEntityKeys = event.payload.entities.filter(e => e.entityName === entityModel.name).map(e => e.key)\n yield put(selectionActions.onSelectChange(deletedEntityKeys, false))\n }\n\n yield put(actionEmitter.emitAction(action))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst simpleSearchFieldsToArray = simpleSearchFields => (\n simpleSearchFields.split(',')\n .filter(s => s)\n .map(s => s.trim())\n)\n\nconst setSimpleSearchFields = (state, {payload}) => {\n const fieldArray = simpleSearchFieldsToArray(payload.simpleSearchFields)\n if (fieldArray.length > 0) {\n return {\n ...state,\n simpleSearchFields: fieldArray\n }\n }\n return state\n}\n\nconst setSearchFilterActive = (state, {payload: {searchFilterId, active, exclusive}}) => ({\n ...state,\n searchFilters: [...state.searchFilters.map(searchFilter =>\n ({...searchFilter, ...(searchFilterId === searchFilter.uniqueId ? {active} : exclusive ? {active: !active} : {})})\n )]\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_SIMPLE_SEARCH_FIELDS]: setSimpleSearchFields,\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_SHOW_EXTENDED_SEARCH_FORM]: reducerUtil.singleTransferReducer('showExtendedSearchForm'),\n [actions.SET_DISABLE_SIMPLE_SEARCH]: reducerUtil.singleTransferReducer('disableSimpleSearch'),\n [actions.SET_VALUES_INITIALIZED]: reducerUtil.singleTransferReducer('valuesInitialized'),\n [actions.SET_FORM_FIELDS_FLAT]: reducerUtil.singleTransferReducer('formFieldsFlat'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_SEARCH_FILTER_ACTIVE]: setSearchFilterActive\n}\n\nconst initialState = {\n initialized: false,\n formDefinition: {},\n showExtendedSearchForm: false,\n simpleSearchFields: ['txtFulltext'],\n disableSimpleSearch: false,\n valuesInitialized: false,\n searchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _uniq from 'lodash/uniq'\n\nimport * as actions from './actions'\n\nconst comparator = (a, b) => a - b\n\nconst setSelection = (state, {payload}) => ({\n ...state,\n selection: _uniq(payload.selection).sort(comparator)\n})\n\nconst clearSelection = (state, {payload}) => ({\n ...state,\n selection: [],\n showSelectedRecords: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.TOGGLE_SHOW_SELECTED_RECORDS]: reducerUtil.toggleReducer('showSelectedRecords'),\n [actions.SET_SELECTION]: setSelection,\n [actions.CLEAR_SELECTION]: clearSelection,\n [actions.SET_SHOW_SELECTION_CONTROLLER]: reducerUtil.singleTransferReducer('showSelectionController'),\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.SET_QUERY]: reducerUtil.singleTransferReducer('query'),\n [actions.SET_QUERY_COUNT]: reducerUtil.singleTransferReducer('queryCount')\n}\n\nconst initialState = {\n showSelectedRecords: false,\n selection: [],\n showSelectionController: false,\n tableSelectionStyle: 'none',\n query: {},\n queryCount: 0\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n MULTI_EXPLICIT: 'multi_explicit',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import _uniq from 'lodash/uniq'\n\nimport selectionStyles from './selectionStyles'\n\nexport const showSelectionComponent = (inputSelectionStyle, disableSelectionController, formSelectable) => {\n return disableSelectionController !== true\n && (!inputSelectionStyle || inputSelectionStyle === selectionStyles.MULTI)\n && formSelectable !== false\n}\n\nexport const getTableSelectionStyle = (inputSelectionStyle, fromSelectable) => {\n if (fromSelectable === false || inputSelectionStyle === selectionStyles.NONE) {\n return selectionStyles.NONE\n }\n\n if (inputSelectionStyle === selectionStyles.SINGLE) {\n return selectionStyles.SINGLE\n }\n\n return selectionStyles.MULTI\n}\n\n/**\n * Comparator function which can be used to sort numerical arrays in ascending order.\n */\nconst ascendingNumberComparator = (a, b) => a - b\n\n/**\n * Takes the existing selection and the new selection which can be either of the type selected or deselected and\n * combines them to a new selection which will be returned.\n */\nexport const combineSelection = (currentSelection, keys, isSelected) => {\n let newSelection = currentSelection.slice()\n for (const key of keys) {\n if (isSelected) {\n newSelection.push(key)\n } else {\n newSelection = newSelection.filter(k => k !== key)\n }\n }\n\n return _uniq(newSelection).sort(ascendingNumberComparator)\n}\n","import {externalEvents} from 'tocco-app-extensions'\nimport {call, put, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport selectionStyles from '../../util/selectionStyles'\nimport {SET_FORM_SELECTABLE} from '../list/actions'\nimport {combineSelection, showSelectionComponent, getTableSelectionStyle} from '../../util/selection'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const selectionSelector = state => state.selection\nexport const listSelector = state => state.list\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.TOGGLE_SHOW_SELECTED_RECORDS, reloadData),\n takeLatest(actions.ON_SELECT_CHANGE, onSelectChange),\n takeLatest(actions.CLEAR_SELECTION, clearSelection),\n takeLatest(SET_FORM_SELECTABLE, initialize)\n ])\n}\n\nexport function* onSelectChange({payload: {keys, isSelected}}) {\n const {selection: currentSelection} = yield select(selectionSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const newSelection = selectionStyle === selectionStyles.SINGLE\n ? keys\n : yield call(combineSelection, currentSelection, keys, isSelected)\n\n yield put(actions.setSelection(newSelection))\n yield put(externalEvents.fireExternalEvent('onSelectChange', newSelection))\n}\n\nexport function* clearSelection() {\n yield put(externalEvents.fireExternalEvent('onSelectChange', []))\n}\n\nexport function* reloadData() {\n yield put(actions.reloadData())\n}\n\nexport function* initialize() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle, disableSelectionController} = yield select(inputSelector)\n const {selectionMode} = yield select(selectionSelector)\n\n const selectionControllerVisible = yield call(\n showSelectionComponent,\n selectionStyle,\n disableSelectionController,\n formSelectable\n )\n yield put(actions.setShowSelectionController(selectionControllerVisible))\n\n yield call(setTableStyle, selectionMode)\n}\n\nexport function* setTableStyle() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const tableSelectionStyle = yield call(getTableSelectionStyle, selectionStyle, formSelectable)\n yield put(actions.setTableSelectionStyle(tableSelectionStyle))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst changeWidth = (state, {payload: {field, width}}) => ({\n ...state,\n widths: {\n ...state.widths,\n [field]: width\n }\n})\n\nconst resetSorting = state => ({\n ...state,\n sorting: []\n})\n\nconst resetColumns = state => ({\n ...state,\n positions: {},\n columns: {}\n})\n\nconst resetPreferences = state => ({\n ...state,\n positions: {},\n sorting: [],\n columns: {}\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_POSITIONS]: reducerUtil.singleTransferReducer('positions'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_COLUMNS]: reducerUtil.singleTransferReducer('columns'),\n [actions.CHANGE_WIDTH]: changeWidth,\n [actions.SET_PREFERENCES_LOADED]: reducerUtil.singleTransferReducer('preferencesLoaded'),\n [actions.RESET_SORTING]: resetSorting,\n [actions.RESET_COLUMNS]: resetColumns,\n [actions.RESET_PREFERENCES]: resetPreferences\n}\n\nconst initialState = {\n positions: {},\n sorting: [],\n columns: {},\n widths: {},\n preferencesLoaded: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const getPositions = preferences =>\n Object.keys(preferences)\n .filter(key => key.endsWith('.position'))\n .reduce((acc, key) => {\n const fieldName = key.match(/.*\\.([^.]+)\\.position$/)\n return {\n ...acc,\n [fieldName[1]]: Number(preferences[key])\n }\n }, {})\n\nexport const getPositionsFromColumns = columns =>\n columns\n .filter(c => !c.fixedPosition)\n .reduce((acc, c, idx) => ({\n ...acc,\n [c.id]: idx\n }), {})\n\nexport const changePosition = (positions, field, fieldAfterPosition) =>\n Object.keys(positions)\n .sort((a, b) => positions[a] - positions[b])\n .filter(key => key !== field)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key === fieldAfterPosition ? [field] : [])\n ]\n , [])\n .reduce((acc, key, idx) => ({\n ...acc,\n [key]: idx\n })\n , {})\n\nexport const getPositionsPreferencesToSave = (formName, positions) =>\n Object.keys(positions)\n .reduce((acc, key) => ({\n ...acc,\n [`${formName}.${key}.position`]: positions[key].toString()\n }), {})\n\nexport const getSorting = preferences => {\n const keyRegex = /^.*\\.sorting(Field|Direction)\\.?([1-9]*)$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .map(([key, value]) => [transformSortingKey(key.match(keyRegex)), value])\n .reduce((acc, [key, value]) => {\n acc[key.index] = {\n ...acc[key.index],\n [key.field]: value\n }\n return acc\n }, [])\n}\n\nconst transformSortingKey = keyMatch => ({\n field: transformSortingField(keyMatch[1]),\n index: keyMatch[2] ? parseInt(keyMatch[2]) : 0\n})\n\nconst transformSortingField = field => field === 'Direction' ? 'order' : field.toLowerCase()\n\nexport const getSortingPreferencesToSave = (formName, sorting) => ({\n [`${formName}.sortingField`]: sorting.field,\n [`${formName}.sortingDirection`]: sorting.order\n})\n\nexport const getAdditionalSortingPreferencesToSave = (formName, sorting, index) => ({\n [`${formName}.sortingField.${index}`]: sorting.field,\n [`${formName}.sortingDirection.${index}`]: sorting.order\n})\n\nexport const getColumns = preferences => {\n const keyRegex = /^[^.]+\\.(.+)\\.hidden$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .reduce((acc, [key, value]) => {\n const fieldName = key.match(keyRegex)[1]\n return {\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [fieldName]: value === 'false'\n }\n }, {})\n}\n\nexport const getColumnPreferencesToSave = (formName, columns) =>\n Object.keys(columns)\n .reduce((acc, key) => ({\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [`${formName}.${key}.hidden`]: (!columns[key]).toString()\n }), {})\n","import {rest, notification} from 'tocco-app-extensions'\nimport {all, call, put, select, take, takeLatest} from 'redux-saga/effects'\nimport React from 'react'\nimport {channel} from 'redux-saga'\n\nimport * as actions from './actions'\nimport {setPositions, setSorting, setColumns, setPreferencesLoaded} from './actions'\nimport * as listActions from '../list/actions'\nimport * as listSagas from '../list/sagas'\nimport * as util from '../../util/preferences'\nimport ColumnPicker from '../../components/ColumnPicker'\nimport {getTableColumns} from '../../util/api/forms'\n\nexport const inputSelector = state => state.input\n\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_PREFERENCES, loadPreferences),\n takeLatest(actions.CHANGE_POSITION, changePosition),\n takeLatest(listActions.SET_SORTING_INTERACTIVE, saveSorting),\n takeLatest(actions.RESET_SORTING, resetSorting),\n takeLatest(actions.RESET_COLUMNS, resetColumns),\n takeLatest(actions.RESET_PREFERENCES, resetPreferences),\n takeLatest(actions.DISPLAY_COLUMN_MODAL, displayColumnModal)\n ])\n}\n\nexport function* loadPreferences() {\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n const formName = `${entityListState.formName}_${listState.scope}`\n const preferences = yield call(rest.fetchUserPreferences, `${formName}*`)\n yield put(setPositions(util.getPositions(preferences)))\n yield put(setSorting(util.getSorting(preferences)))\n yield put(setColumns(util.getColumns(preferences)))\n yield put(setPreferencesLoaded(true))\n}\n\nexport function* changePosition({payload}) {\n const {field, afterFieldPosition, columns} = payload\n let {positions} = yield select(preferencesSelector)\n\n if (Object.keys(positions).length === 0) {\n positions = yield call(util.getPositionsFromColumns, columns)\n }\n\n const newPositions = yield call(util.changePosition, positions, field, afterFieldPosition)\n yield put(setPositions(newPositions))\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n const formName = `${entityListState.formName}_${listState.scope}`\n yield call(rest.deleteUserPreferences, `${formName}.*.positions`)\n const positionPreferences = yield call(util.getPositionsPreferencesToSave, formName, newPositions)\n yield call(rest.savePreferences, positionPreferences)\n}\n\nexport function* saveSorting() {\n const {sorting: sortings} = yield select(listSagas.listSelector)\n if (sortings.length > 0) {\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n const formName = `${entityListState.formName}_${listState.scope}`\n yield all([\n call(rest.deleteUserPreferences, `${formName}.sortingField*`),\n call(rest.deleteUserPreferences, `${formName}.sortingDirection*`)\n ])\n const sortingPreferences = sortings.slice(1)\n .map((sorting, index) => util.getAdditionalSortingPreferencesToSave(formName, sorting, index + 1))\n .reduce((acc, sorting) => ({\n ...acc,\n ...sorting\n }), util.getSortingPreferencesToSave(formName, sortings[0]))\n yield call(rest.savePreferences, sortingPreferences)\n }\n}\n\nexport function* resetSorting() {\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n yield all([\n call(rest.deleteUserPreferences, `${entityListState.formName}_${listState.scope}.sortingField*`),\n call(rest.deleteUserPreferences, `${entityListState.formName}_${listState.scope}.sortingDirection*`)\n ])\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* resetPreferences() {\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n yield call(rest.deleteUserPreferences, `${entityListState.formName}_${listState.scope}.*`)\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* displayColumnModal() {\n const {formDefinition} = yield select(listSagas.listSelector)\n const {columns: preferencesColumns} = yield select(preferencesSelector)\n const {parent} = yield select(listSagas.entityListSelector)\n const formColumns = getTableColumns(formDefinition, preferencesColumns, parent)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-column-selection`,\n 'client.entity-list.preferences.columns',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={formColumns} onOk={onOk} dndEnabled={false}/>\n },\n true\n ))\n\n yield saveColumnPreferences(answerChannel, preferencesColumns, formDefinition)\n}\n\nfunction* saveColumnPreferences(answerChannel, preferencesColumns, formDefinition) {\n const columns = (yield take(answerChannel)).reduce((accumulator, item) => ({\n ...accumulator,\n [item.id]: !item.hidden\n }), {})\n const diffColumns = Object.keys(columns).reduce((accumulator, columnName) => ({\n ...accumulator,\n ...(columns[columnName] !== preferencesColumns[columnName]\n ? {[columnName]: columns[columnName]}\n : {})\n }), {})\n yield put(setColumns(columns))\n if (Object.entries(diffColumns).some(([, value]) => value)) {\n yield put(listActions.refresh())\n }\n const columnPreferences = yield call(util.getColumnPreferencesToSave, formDefinition.id, diffColumns)\n yield call(rest.savePreferences, columnPreferences)\n}\n\nexport function* resetColumns() {\n const entityListState = yield select(listSagas.entityListSelector)\n const listState = yield select(listSagas.listSelector)\n yield all([\n call(rest.deleteUserPreferences, `${entityListState.formName}_${listState.scope}.*.position`),\n call(rest.deleteUserPreferences, `${entityListState.formName}_${listState.scope}.*.hidden`)\n ])\n yield put(listActions.refresh())\n}\n","import {reducer as form} from 'redux-form'\n\nimport entityListReducer, {sagas as entityListSagas} from './entityList'\nimport listReducer, {sagas as listSagas} from './list'\nimport searchFormReducer, {sagas as searchFormSagas} from './searchForm'\nimport selectionReducer, {sagas as selectionSagas} from './selection'\nimport preferencesReducer, {sagas as preferencesSaga} from './preferences'\n\nexport default {\n entityList: entityListReducer,\n list: listReducer,\n searchForm: searchFormReducer,\n form,\n selection: selectionReducer,\n preferences: preferencesReducer\n}\n\nexport const sagas = [\n entityListSagas,\n listSagas,\n searchFormSagas,\n selectionSagas,\n preferencesSaga\n]\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {reduxForm, Field} from 'redux-form'\nimport {form} from 'tocco-app-extensions'\nimport {SearchBox} from 'tocco-ui'\n\nconst FullTextSearchForm = props => {\n const {submitSearchForm, intl} = props\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const msg = id => (intl.formatMessage({id}))\n\n const field = useMemo(() => ({input}) =>\n <SearchBox\n value={input.value}\n liveSearch={true}\n onSearch={value => input.onChange(value)}\n placeholder={msg('client.entity-list.fullTextPlaceholder')}\n />, [])\n\n return (\n <form onSubmit={handleSubmit}>\n <Field name=\"txtFulltext\" component={field}/>\n </form>\n )\n}\n\nFullTextSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n input: PropTypes.string\n}\n\nexport default reduxForm({\n form: 'searchForm',\n destroyOnUnmount: false\n})(FullTextSearchForm)\n","import FullTextSearchForm from './FullTextSearchForm'\n\nexport default FullTextSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport FullTextSearchForm from '../components/FullTextSearchForm'\nimport {submitSearchForm} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(FullTextSearchForm))\n","import styled from 'styled-components'\nimport {StyledLayoutBox, StyledScrollbar} from 'tocco-ui/src/Layout'\n\nexport const StyledBasicSearchForm = styled.div`\n ${StyledScrollbar}\n\n && {\n ${StyledLayoutBox} {\n padding-bottom: 0;\n }\n }\n`\n\nexport const StyledSearchFormButtons = styled.div`\n && {\n width: 100%;\n text-align: center;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reduxForm} from 'redux-form'\nimport {Ball} from 'tocco-ui'\nimport {form} from 'tocco-app-extensions'\n\nimport {\n StyledBasicSearchForm,\n StyledSearchFormButtons\n} from './StyledBasicSearchForm'\n\nconst REDUX_FORM_NAME = 'searchForm'\n\nconst BasicSearchForm = ({\n disableSimpleSearch,\n entity,\n form: formName,\n formValues,\n intl,\n preselectedSearchFields,\n searchFormDefinition,\n setShowExtendedSearchForm,\n showExtendedSearchForm,\n simpleSearchFields,\n submitSearchForm\n}) => {\n if (!searchFormDefinition.children) {\n return null\n }\n\n const msg = id => intl.formatMessage({id})\n\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const isHidden = (preselectedSearchFields, name) => {\n if (!preselectedSearchFields) {\n return false\n }\n const field = preselectedSearchFields.find(f => f.id === name)\n return field && field.hidden\n }\n\n const shouldRenderField = (\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields) => name => (\n !isHidden(preselectedSearchFields, name)\n && (\n disableSimpleSearch\n || showExtendedSearchForm\n || simpleSearchFields.includes(name)\n )\n )\n\n const toggleExtendedSearchForm = () => {\n setShowExtendedSearchForm(!showExtendedSearchForm)\n }\n\n const fields = form.getFieldDefinitions(searchFormDefinition)\n const hasExtendedOnlySearchFields = !fields.every(field => simpleSearchFields.includes(field.id))\n\n return (\n <StyledBasicSearchForm>\n <form onSubmit={handleSubmit}>\n {hasExtendedOnlySearchFields && !disableSimpleSearch\n && <StyledSearchFormButtons>\n <Ball\n data-cy=\"extend-search-button\"\n icon={`chevron-${showExtendedSearchForm ? 'up' : 'down'}`}\n onClick={toggleExtendedSearchForm}\n title={msg('client.entity-list.extendedSearch')}\n />\n </StyledSearchFormButtons>\n }\n <form.FormBuilder\n entity={entity}\n formName={formName}\n formDefinition={searchFormDefinition}\n formValues={formValues}\n fieldMappingType=\"search\"\n beforeRenderField={shouldRenderField(\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields)\n }\n mode=\"search\"\n />\n </form>\n </StyledBasicSearchForm>\n )\n}\n\nBasicSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFormDefinition: PropTypes.shape({\n children: PropTypes.array\n }).isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.arrayOf(\n PropTypes.string\n ),\n showExtendedSearchForm: PropTypes.bool,\n setShowExtendedSearchForm: PropTypes.func.isRequired,\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n hidden: PropTypes.bool\n })\n ),\n entity: PropTypes.object,\n form: PropTypes.string,\n formValues: PropTypes.object\n}\n\nexport default reduxForm({\n form: REDUX_FORM_NAME,\n destroyOnUnmount: false\n})(BasicSearchForm)\n","import BasicSearchForm from './BasicSearchForm'\n\nexport default BasicSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport BasicSearchForm from '../components/BasicSearchForm'\nimport {\n submitSearchForm,\n setShowExtendedSearchForm\n} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm,\n setShowExtendedSearchForm\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFormDefinition: state.searchForm.formDefinition,\n entityModel: state.list.entityModel,\n searchInputs: state.searchForm.searchInputs,\n disableSimpleSearch: props.disableSimpleSearch || state.searchForm.disableSimpleSearch,\n simpleSearchFields: state.searchForm.simpleSearchFields,\n showExtendedSearchForm: state.searchForm.showExtendedSearchForm,\n preselectedSearchFields: state.input.preselectedSearchFields\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(BasicSearchForm))\n","import styled from 'styled-components'\nimport {StyledScrollbar, theme, Menu, Button, scale} from 'tocco-ui'\nimport Split from 'react-split'\n\nexport const StyledSplit = styled(Split)``\n\nexport const StyledSplitWrapper = styled.div`\n height: 100%;\n`\n\nexport const StyledHeader = styled.div`\n background-color: ${theme.color('paper')};\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n display: flex;\n justify-content: flex-end;\n padding: 9px;\n position: relative;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n\n ${Menu} {\n z-index: 3; //higher than rest to lay over search filter list\n }\n`\n\nexport const AdminSearchGrid = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'none' : 'block'};\n height: 100%;\n overflow: hidden;\n\n ${StyledSplit} {\n height: calc(100% - 40px);\n display: flex;\n flex-direction: column;\n }\n`\n\nexport const StyledPlaceHolder = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'flex' : 'none'};\n flex: 1;\n align-items: flex-start;\n background: ${theme.color('paper')};\n padding-top: ${scale.space(-0.5)};\n padding-left: ${scale.space(-2.5)};\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledToggleCollapseButton = styled(Button)`\n font-size: ${scale.font(0)};\n padding: 0;\n margin-right: auto;\n position: relative;\n left: ${({isCollapsed}) => !isCollapsed ? '-5px' : '2.5px'};\n\n &:hover,\n ${/* sc-selector */StyledPlaceHolder}:hover & {\n background-color: transparent;\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const Box = styled.div`\n background-color: ${theme.color('paper')};\n overflow-y: auto;\n padding: .6rem 1rem 0 .6rem;\n position: relative;\n\n &:first-of-type {\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n }\n ${StyledScrollbar}\n`\n\nexport const StyledGutter = styled.div`\n background-color: ${theme.color('paper')};\n display: flex;\n padding-top: 3px;\n justify-content: center;\n align-items: center;\n height: calc(100% - 1px); //subtract border height from total height\n font-size: 20px;\n border-top: 1px solid ${theme.color('backgroundBody')};\n position: relative;\n z-index: 2;\n\n &:hover {\n cursor: row-resize;\n }\n`\n","export const searchFilterCompare = (a, b) => {\n return a.defaultFilter || b.defaultFilter\n ? a.defaultFilter ? -1 : 1\n : (a.sorting === null) - (b.sorting === null) || a.sorting - b.sorting\n}\n","/* stylelint-disable no-descending-specificity */\n/* stylelint-disable rule-empty-line-before */\nimport styled from 'styled-components'\nimport {Button, scale, StyledSpan, theme, StyledItemLabel} from 'tocco-ui'\n\nexport const SearchFilterListWrapper = styled.div`\n margin-top: .4rem;\n margin-bottom: .4rem;\n`\n\nexport const StyledSpanSearchFilter = styled(StyledSpan)`\n width: 90%;\n`\n\nexport const StyledAddRemoveButton = styled(Button)`\n && {\n background-color: transparent;\n border: 0;\n height: auto;\n border-radius: 0;\n padding: 0 ${scale.space(-2.5)} 0 0;\n\n &:hover * {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')} !important;\n }\n }\n`\n\nexport const StyledMenuWrapper = styled.div`\n &&& {\n button {\n background-color: transparent;\n padding: 0 ${scale.space(-1)} 0 0;\n }\n\n &:hover button {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')};\n cursor: pointer;\n }\n }\n`\n\nexport const StyleButtonWrapper = styled.div`\n display: flex;\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: transparent;\n }\n`\n\nexport const StyledSearchFilterButton = styled.div`\n border-radius: ${theme.radii('medium')};\n display: flex;\n padding: .3rem 0 .3rem 1rem;\n margin-bottom: .2rem;\n background-color: ${({active}) => active && theme.color('secondary')};\n justify-content: flex-end;\n\n && {\n *:not(${/* sc-selector */StyledItemLabel}) {\n color: ${({active}) => active && theme.color('paper')};\n }\n }\n\n &:hover {\n ${/* sc-selector */StyledSpanSearchFilter},\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: ${theme.color('paper')};\n }\n background-color: ${({active}) => !active && theme.color('secondaryLight')};\n cursor: pointer;\n }\n`\n\nexport const StyledMessageWrapper = styled.div`\n padding-left: 8px;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, BallMenu, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {searchFilterCompare} from './utils'\nimport {\n SearchFilterListWrapper,\n StyledSpanSearchFilter,\n StyledAddRemoveButton,\n StyledMenuWrapper,\n StyledSearchFilterButton,\n StyledMessageWrapper,\n StyleButtonWrapper\n} from './StyledComponents'\n\nconst EllipsisMenu = ({canEdit, canDelete, navigationStrategy, deleteSearchFilter, primaryKey, active}) => {\n const entries = []\n\n if (canEdit) {\n entries.push(\n <MenuItem key={'edit-button'} onClick={() => navigationStrategy.openDetail('Search_filter', primaryKey)}>\n <FormattedMessage id=\"client.entity-list.search.settings.editFilter\"/>\n </MenuItem>\n )\n }\n if (canDelete) {\n entries.push(\n <MenuItem key={'delete-button'} onClick={deleteSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.deleteFilter\"/>\n </MenuItem>\n )\n }\n\n if (entries.length === 0) {\n return null\n }\n\n return (\n <StyledMenuWrapper active={active}>\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n {entries}\n </BallMenu>\n </StyledMenuWrapper>\n )\n}\n\nEllipsisMenu.propTypes = {\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n active: PropTypes.bool\n}\n\nconst SearchFilterButton = ({\n setActive,\n active,\n label,\n canEdit,\n canDelete,\n primaryKey,\n navigationStrategy,\n deleteSearchFilter\n}) =>\n <StyledSearchFilterButton active={active} onClick={() => setActive(!active)}>\n <StyledSpanSearchFilter title={label}>{label}</StyledSpanSearchFilter>\n <StyleButtonWrapper>\n <StyledAddRemoveButton\n active={active}\n onClick={e => {\n setActive(false)\n e.stopPropagation()\n }}\n icon={active ? 'minus' : 'plus'}\n dense/>\n <EllipsisMenu\n canEdit={canEdit}\n canDelete={canDelete}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={deleteSearchFilter}\n primaryKey={primaryKey}\n active={active}\n />\n </StyleButtonWrapper>\n </StyledSearchFilterButton>\n\nSearchFilterButton.propTypes = {\n label: PropTypes.string,\n setActive: PropTypes.func.isRequired,\n active: PropTypes.bool,\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func)\n}\n\nconst AdminSearchForm = props => {\n const {searchFilters, setSearchFilterActive, executeSearch, navigationStrategy, deleteSearchFilter} = props\n if (!searchFilters) {\n return null\n }\n\n if (searchFilters.length === 0) {\n return <StyledMessageWrapper>\n <Typography.I>\n <FormattedMessage id=\"client.entity-list.noSearchFilters\"/>\n </Typography.I>\n </StyledMessageWrapper>\n }\n\n return <SearchFilterListWrapper>\n {[...searchFilters]\n .sort(searchFilterCompare)\n .map(searchFilter =>\n <SearchFilterButton\n key={searchFilter.uniqueId}\n primaryKey={searchFilter.key}\n active={searchFilter.active}\n label={searchFilter.label}\n setActive={exclusive => {\n setSearchFilterActive(searchFilter.uniqueId, !searchFilter.active, exclusive)\n executeSearch()\n }}\n canEdit={searchFilter.editAllowed}\n canDelete={searchFilter.deleteAllowed}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={() => deleteSearchFilter(searchFilter.key)}\n />\n )\n }\n </SearchFilterListWrapper>\n}\n\nAdminSearchForm.propTypes = {\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n setSearchFilterActive: PropTypes.func.isRequired,\n executeSearch: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n deleteSearchFilter: PropTypes.func.isRequired\n}\n\nexport default AdminSearchForm\n","import {connect} from 'react-redux'\n\nimport SearchFilterList from './SearchFilterList'\nimport {setSearchFilterActive, executeSearch, deleteSearchFilter} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n setSearchFilterActive,\n executeSearch,\n deleteSearchFilter\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n navigationStrategy: state.input.navigationStrategy\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(SearchFilterList)\n","import SearchFilterList from './SearchFilterListContainer'\n\nexport default SearchFilterList\n","import React, {useRef, useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport ReactDOM from 'react-dom'\nimport {Icon, Ball, BallMenu, MenuItem, Popover} from 'tocco-ui'\nimport {withTheme} from 'styled-components'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport {\n StyledSplit,\n AdminSearchGrid,\n Box,\n StyledGutter,\n StyledHeader,\n StyledSplitWrapper,\n StyledToggleCollapseButton,\n StyledPlaceHolder\n} from './StyedComponents'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport SearchFilterList from '../SearchFilterList'\n\nconst SEARCH_FILTER_BUTTON_HEIGHT = 28\nconst SEARCH_FILTER_PADDING = 10\nconst MAX_HEIGHT_THRESHOLD = 30\nconst MAX_SIZE_SEARCH_FILTER = 25\n\nconst getGutter = () => () => {\n const gutterEl = document.createElement('div')\n ReactDOM.render(\n <StyledGutter tabIndex={0}>\n <Icon icon=\"horizontal-rule\"/>\n </StyledGutter>, gutterEl\n )\n return gutterEl\n}\n\nconst AdminSearchForm = ({\n resetSearch,\n intl,\n searchFilters,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields,\n searchFormDirty,\n isCollapsed,\n toggleCollapse\n}) => {\n const splitWrapperEl = useRef(null)\n const [size, setSize] = useState([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n const [searchFilterExpanded, setSearchFilterExpanded] = useState(false)\n const [showExpandSearchFilter, setShowExpandSearchFilter] = useState(false)\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n const searchFilterHeight = searchFilters\n ? searchFilters.length * SEARCH_FILTER_BUTTON_HEIGHT + SEARCH_FILTER_PADDING\n : SEARCH_FILTER_BUTTON_HEIGHT\n const splitWrapperHeight = splitWrapperEl.current.clientHeight\n const searchFilterHeightPercentage = Math.ceil(100 / (splitWrapperHeight / searchFilterHeight))\n\n if (!searchFilterExpanded && searchFilterHeightPercentage > MAX_HEIGHT_THRESHOLD) {\n setShowExpandSearchFilter(true)\n setSize([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n } else {\n setSize([searchFilterHeightPercentage, 100 - searchFilterHeightPercentage])\n }\n }, [searchFilters, searchFilterExpanded])\n\n const isSingleSearchFilterActive = searchFilters?.filter(s => s.active).length === 1\n\n return <>\n <AdminSearchGrid isCollapsed={isCollapsed}>\n <StyledHeader>\n <StyledToggleCollapseButton icon={'chevron-left'} isCollapsed={isCollapsed} onClick={toggleCollapse}/>\n {showExpandSearchFilter && <Ball\n icon={searchFilterExpanded ? 'chevron-up' : 'chevron-down'}\n onClick={() => setSearchFilterExpanded(!searchFilterExpanded)}\n title={searchFilterExpanded ? msg('client.entity-list.contract') : msg('client.entity-list.expand')}\n />}\n <Ball\n data-cy=\"reset-button\"\n icon=\"times\"\n onClick={resetSearch}\n title={msg('client.entity-list.reset')}\n />\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem disabled={!isSingleSearchFilterActive} onClick={saveDefaultSearchFilter}>\n <Popover content={!isSingleSearchFilterActive\n && <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save.info\"/>\n }>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save\"/>\n </Popover>\n </MenuItem>\n <MenuItem onClick={resetDefaultSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.reset\"/>\n </MenuItem>\n <MenuItem onClick={saveSearchFilter} disabled={!searchFormDirty}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter\"/>\n </MenuItem>\n <MenuItem onClick={displaySearchFieldsModal}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.edit\"/>\n </MenuItem>\n <MenuItem onClick={resetSearchFields}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.reset\"/>\n </MenuItem>\n </BallMenu>\n </StyledHeader>\n <StyledSplitWrapper ref={splitWrapperEl}>\n <StyledSplit\n direction=\"vertical\"\n gutterSize={20}\n sizes={size}\n minSize={[90, 0]}\n gutter={getGutter()}\n >\n <Box>\n <SearchFilterList/>\n </Box>\n <Box>\n <BasicSearchFormContainer disableSimpleSearch={true}/>\n </Box>\n </StyledSplit>\n </StyledSplitWrapper>\n </AdminSearchGrid>\n <StyledPlaceHolder onClick={toggleCollapse} isCollapsed={isCollapsed}>\n <StyledToggleCollapseButton icon={'chevron-right'} isCollapsed={isCollapsed}/>\n </StyledPlaceHolder>\n </>\n}\n\nAdminSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n resetSearch: PropTypes.func.isRequired,\n theme: PropTypes.object,\n saveSearchFilter: PropTypes.func.isRequired,\n saveDefaultSearchFilter: PropTypes.func.isRequired,\n resetDefaultSearchFilter: PropTypes.func.isRequired,\n displaySearchFieldsModal: PropTypes.func.isRequired,\n resetSearchFields: PropTypes.func.isRequired,\n searchFormDirty: PropTypes.bool,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func.isRequired\n}\n\nexport default injectIntl(withTheme(AdminSearchForm))\n","import {connect} from 'react-redux'\nimport {isDirty} from 'redux-form'\n\nimport AdminSearchForm from './AdminSearchForm'\nimport {\n displaySearchFieldsModal,\n resetSearch,\n resetSearchFields,\n resetDefaultSearchFilter,\n saveDefaultSearchFilter,\n saveSearchFilter\n} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n resetSearch,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n searchFormDirty: isDirty('searchForm')(state)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(AdminSearchForm)\n","import AdminSearchFormContainer from './AdminSearchFormContainer'\n\nexport default AdminSearchFormContainer\n","import styled from 'styled-components'\n\nexport const StyledAdminSearchFormWrapper = styled.div`\n display: flex; // enables StyledPlaceHolder to take full height\n flex-direction: column;\n height: calc(var(--vh, 1vh) * 100 - 77px); // TODO: This is only a temporary workaround, height needs to be 100%\n overflow-y: auto;\n overflow-x: hidden;\n`\n","import React from 'react'\nimport {Panel} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport FullTextSearchForm from '../../containers/FullTextSearchFormContainer'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport AdminSearchForm from '../AdminSearchForm'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\nimport {StyledAdminSearchFormWrapper} from './StyledComponents'\n\nconst SearchView = ({searchFormType, isCollapsed, toggleCollapse}) => {\n if (searchFormType === searchFormTypes.ADMIN) {\n return (\n <StyledAdminSearchFormWrapper>\n <AdminSearchForm isCollapsed={isCollapsed} toggleCollapse={toggleCollapse}/>\n </StyledAdminSearchFormWrapper>\n )\n }\n\n return <Panel.Wrapper isToggleable={false} isFramed={false}>\n <Panel.Body>\n {searchFormType === searchFormTypes.SIMPLE ? <FullTextSearchForm/> : <BasicSearchFormContainer/>}\n </Panel.Body>\n </Panel.Wrapper>\n}\n\nSearchView.propTypes = {\n searchFormType: searchFormTypePropTypes,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func\n}\n\nexport default SearchView\n","import SearchView from './SearchView'\n\nexport default SearchView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SearchView from '../components/SearchView'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => ({\n searchFormType: state.entityList.searchFormType\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SearchView))\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport default styled.div`\n display: flex;\n width: max-content;\n`\n\nexport const StyledButton = styled.span`\n border-radius: ${theme.radii('medium')};\n padding: .3rem 1.3rem;\n display: ${({disabled}) => disabled ? 'none' : 'flex'};\n margin-right: 1rem;\n align-items: center;\n cursor: pointer;\n background-color: ${({active}) => active && theme.color('secondary')};\n\n &:hover {\n background-color: ${theme.color('secondaryLight')};\n\n * {\n color: ${theme.color('paper')};\n }\n }\n\n && {\n * {\n color: ${({active}) => active && theme.color('paper')};\n }\n\n button {\n background-color: transparent;\n margin-left: .5rem;\n margin-top: -.2rem;\n margin-right: -.8rem;\n\n &:hover * {\n color: ${theme.color('secondary')};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\nimport {Button, Typography} from 'tocco-ui'\n\nimport StyledSelectionController, {StyledButton} from './StyledSelectionController'\n\nconst SelectionController = ({\n intl,\n selection,\n showSelectedRecords,\n toggleShowSelectedRecords,\n queryCount,\n clearSelection\n}) => {\n const msg = id => intl.formatMessage({id})\n const selectionPossible = selection.length !== 0\n\n return (\n <StyledSelectionController>\n <StyledButton\n active={!showSelectedRecords}\n onClick={() => {\n if (showSelectedRecords || selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionAll\"\n values={{count: queryCount}}/>\n </Typography.Span>\n </StyledButton>\n <StyledButton\n active={showSelectedRecords}\n disabled={!selectionPossible}\n onClick={() => {\n if (selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n data-cy=\"selection-controller-selection\"\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionSelection\"\n values={{count: selection.length}}/>\n {selection.length > 0 && <Button\n data-cy=\"selection-controller-delete-selection\"\n dense\n icon=\"times\"\n title={msg('client.entity-list.clearSelection')}\n onClick={e => {\n e.stopPropagation()\n if (showSelectedRecords) {\n toggleShowSelectedRecords()\n }\n clearSelection()\n }}\n />}\n </Typography.Span>\n </StyledButton>\n </StyledSelectionController>\n )\n}\n\nSelectionController.propTypes = {\n clearSelection: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n queryCount: PropTypes.number.isRequired,\n selection: PropTypes.array.isRequired,\n showSelectedRecords: PropTypes.bool,\n toggleShowSelectedRecords: PropTypes.func.isRequired\n}\n\nexport default SelectionController\n","import SelectionController from './SelectionController'\n\nexport default SelectionController\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SelectionController from '../components/SelectionController'\nimport {clearSelection, toggleShowSelectedRecords} from '../modules/selection/actions'\n\nconst mapActionCreators = {\n clearSelection,\n toggleShowSelectedRecords\n}\n\nconst mapStateToProps = (state, props) => (\n {\n queryCount: state.selection.queryCount,\n selection: state.selection.selection,\n showSelectedRecords: state.selection.showSelectedRecords\n }\n)\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SelectionController))\n","import React from 'react'\nimport {BallMenu, MenuItem} from 'tocco-ui'\nimport {connect} from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {displayColumnModal, resetSorting, resetPreferences, resetColumns} from '../../modules/preferences/actions'\n\nconst NavigationCellHeader = props =>\n !props.disablePreferencesMenu\n ? <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem onClick={props.displayColumnModal}>\n <FormattedMessage id=\"client.entity-list.preferences.columns\"/>\n </MenuItem>\n <MenuItem onClick={props.resetColumns}>\n <FormattedMessage id=\"client.entity-list.preferences.columns.reset\"/>\n </MenuItem>\n {props.sortable\n && <MenuItem onClick={props.resetSorting}>\n <FormattedMessage id=\"client.entity-list.sorting.reset\"/>\n </MenuItem>\n }\n <MenuItem onClick={props.resetPreferences}>\n <FormattedMessage id=\"client.entity-list.preferences.reset\"/>\n </MenuItem>\n </BallMenu>\n : null\n\nNavigationCellHeader.propTypes = {\n displayColumnModal: PropTypes.func.isRequired,\n resetSorting: PropTypes.func.isRequired,\n resetPreferences: PropTypes.func.isRequired,\n resetColumns: PropTypes.func.isRequired,\n sortable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst mapActionCreators = {\n displayColumnModal,\n resetSorting,\n resetPreferences,\n resetColumns\n}\n\nconst mapStateToProps = (state, props) => ({\n sortable: state.list.sortable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(NavigationCellHeader)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport NavigationCellHeader from './NavigationCellHeader'\n\nconst CellRenderer = ({showNavigation, rowData, navigationStrategy, parent}) =>\n showNavigation && navigationStrategy.DetailLinkRelative\n ? <span\n onClick={e => e.stopPropagation()}\n data-cy=\"list-navigation-arrow\"\n >\n <navigationStrategy.DetailLinkRelative\n entityKey={rowData.__key}\n entityModel={rowData.__model}\n {...(parent && parent.relationName && {relation: parent.relationName})}\n >\n <Icon icon=\"arrow-right\"/>\n </navigationStrategy.DetailLinkRelative>\n </span>\n : null\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired,\n __model: PropTypes.string.isRequired\n }).isRequired,\n showNavigation: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.shape({\n DetailLinkRelative: PropTypes.func\n }).isRequired,\n parent: PropTypes.shape({\n relationName: PropTypes.string\n })\n}\n\nexport const navigationCell = (showNavigation, navigationStrategy, parent) => ({\n id: 'navigation-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n HeaderRenderer: NavigationCellHeader,\n CellRenderer: props => <CellRenderer\n {...props}\n showNavigation={showNavigation}\n navigationStrategy={navigationStrategy}\n parent={parent}\n />\n})\n","import styled from 'styled-components'\nimport {theme, declareFont} from 'tocco-ui'\n\nexport const StyledMarkingWrapper = styled.span`\n ${declareFont()}\n display: flex;\n height: 100%;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n ${({marked, theme}) => marked && `color: ${theme.colors.secondary};`}\n`\n","import React, {useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\nimport {connect} from 'react-redux'\n\nimport {setMarked} from '../../modules/list/actions'\nimport {StyledMarkingWrapper} from './StyledComponents'\n\nconst CellRenderer = ({rowData, markings, setMarked}) => {\n const [mouseOver, setMouseOver] = useState(false)\n\n const marked = markings && markings[rowData.__model] && markings[rowData.__model][rowData.__key]\n\n useEffect(() => {\n if (!marked) {\n setMouseOver(false) // reset mouse over to false to show empty star when user unmarks even if still hovering\n }\n }, [marked])\n\n const handleClick = e => {\n e.stopPropagation()\n setMarked(rowData.__model, rowData.__key, !marked)\n }\n\n return (\n <StyledMarkingWrapper\n marked={marked}\n onClick={handleClick}\n onMouseEnter={() => setMouseOver(true)}\n onMouseLeave={() => setMouseOver(false)}>\n <Icon icon={marked || mouseOver ? 'star-full' : 'star'}/>\n </StyledMarkingWrapper>\n )\n}\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired,\n __model: PropTypes.string.isRequired\n }).isRequired,\n markings: PropTypes.objectOf(PropTypes.objectOf(PropTypes.bool)),\n setMarked: PropTypes.func.isRequired\n}\n\nconst mapActionCreators = {\n setMarked\n}\n\nconst mapStateToProps = state => ({\n markings: state.list.lazyData.markings\n})\n\nconst MarkingCellRenderer = connect(mapStateToProps, mapActionCreators)(CellRenderer)\n\nexport const markingCell = () => ({\n id: 'mark-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n CellRenderer: MarkingCellRenderer\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\nimport {columnPropType, selectionStylePropType, Table as UiTable} from 'tocco-ui'\nimport _get from 'lodash/get'\n\nimport {navigationCell} from './navigationCell'\nimport {markingCell} from './markingCell'\n\nconst Table = props => {\n const showNavigationLink = props.showLink\n && props.clickable\n && props.navigationStrategy\n && !!props.navigationStrategy.DetailLinkRelative\n const showPreferencesMenu = !props.disablePreferencesMenu\n const columns = [\n ...((showNavigationLink || showPreferencesMenu)\n ? [navigationCell(showNavigationLink,\n props.navigationStrategy,\n props.parent)]\n : []),\n ...(props.markable ? [markingCell()] : []),\n ...props.columnDefinitions\n .map(a => ({...a, width: _get(props.widths, a.id)}))\n .sort((a, b) =>\n _get(props.positions, [a.id]) - _get(props.positions, [b.id])\n )\n ]\n return <UiTable\n data={props.entities}\n columns={columns}\n onColumnWidthChange={props.changeWidth}\n dataLoadingInProgress={props.inProgress}\n paginationInfo={{\n currentPage: props.currentPage,\n totalCount: props.entityCount,\n recordsPerPage: props.limit\n }}\n onPageChange={props.changePage}\n onPageRefresh={props.refresh}\n onSortingChange={props.setSortingInteractive}\n selectionStyle={props.tableSelectionStyle}\n onSelectionChange={props.onSelectChange}\n selection={props.selection}\n onRowClick={props.onRowClick}\n clickable={props.clickable}\n onColumnPositionChange={(dragging, dragOver) => props.changePosition(dragging, dragOver, columns)}\n />\n}\n\nTable.propTypes = {\n columnDefinitions: PropTypes.arrayOf(columnPropType).isRequired,\n entities: PropTypes.array.isRequired,\n entityCount: PropTypes.number,\n inProgress: PropTypes.bool,\n currentPage: PropTypes.number,\n limit: PropTypes.number,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool,\n setSortingInteractive: PropTypes.func,\n refresh: PropTypes.func,\n changePage: PropTypes.func.isRequired,\n tableSelectionStyle: selectionStylePropType,\n onSelectChange: PropTypes.func,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string,\n relation: PropTypes.string\n }),\n showLink: PropTypes.bool,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n changePosition: PropTypes.func.isRequired,\n positions: PropTypes.objectOf(PropTypes.number),\n changeWidth: PropTypes.func.isRequired,\n widths: PropTypes.objectOf(PropTypes.number),\n markable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = js.difference(prevProps, nextProps)\n return Object.keys(diff).length === 0\n}\n\nexport default React.memo(Table, areEqual)\n","import Table from './Table'\n\nexport default Table\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Table from '../components/Table'\nimport {\n changePage,\n refresh,\n initialize,\n onRowClick,\n setSortingInteractive\n} from '../modules/list/actions'\nimport {\n onSelectChange,\n setSelection\n} from '../modules/selection/actions'\nimport {\n changePosition,\n resetSorting,\n changeWidth\n} from '../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n changePage,\n refresh,\n setSortingInteractive,\n onRowClick,\n onSelectChange,\n setSelection,\n changePosition,\n resetSorting,\n changeWidth\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: state.list.currentPage,\n entities: state.list.entities,\n entityCount: state.list.entityCount,\n limit: state.list.limit,\n inProgress: state.list.inProgress,\n tableSelectionStyle: state.selection.tableSelectionStyle,\n clickable: state.list.formClickable,\n selection: state.selection.selection,\n parent: state.entityList.parent,\n showLink: state.list.showLink,\n navigationStrategy: state.input.navigationStrategy,\n positions: state.preferences.positions,\n widths: state.preferences.widths,\n markable: state.list.entityModel.markable && state.list.formDefinition.markable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Table))\n","export const deriveSelectionFromState = state => {\n const {selection, input} = state\n\n if (selection.selection.length > 0 || input.selectionStyle === 'multi_explicit') {\n return {\n entityName: state.entityList.entityName,\n type: 'ID',\n ids: selection.selection,\n count: selection.selection.length || 0\n }\n }\n\n return {\n entityName: state.entityList.entityName,\n type: 'QUERY',\n query: selection.query,\n count: selection.queryCount || 0\n }\n}\n","import {connect} from 'react-redux'\nimport {actions} from 'tocco-app-extensions'\n\nimport {deriveSelectionFromState} from '../util/actions'\n\nconst mapStateToProps = (state, props) => ({\n selection: deriveSelectionFromState(state)\n})\n\nconst mapActionCreators = {}\n\nexport default connect(mapStateToProps, mapActionCreators)(actions.Action)\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport const StyledListWrapper = styled.div`\n grid-row-start: table-start;\n`\n\nexport const StyledActionWrapper = styled.div`\n display: flex;\n background-color: ${theme.color('paper')};\n margin-bottom: 3px;\n padding: 0 8px 8px;\n grid-row-start: action-start;\n flex-wrap: wrap;\n\n & > * {\n margin-top: 8px;\n }\n`\n\nexport const StyledListView = styled.div`\n display: grid;\n grid-template-rows: [action-start] auto [table-start] minmax(230px, 1fr);\n height: 100%;\n`\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport {LoadMask} from 'tocco-ui'\nimport {js} from 'tocco-util'\n\nimport SelectionControllerContainer from '../../containers/SelectionControllerContainer'\nimport {getColumnDefinition, getTable, getActionBar} from '../../util/api/forms'\nimport TableContainer from '../../containers/TableContainer'\nimport ActionContainer from '../../containers/ActionContainer'\nimport {StyledListWrapper, StyledActionWrapper, StyledListView} from './StyledComponents'\n\nconst ListView = ({\n dataLoadingInProgress,\n formDefinition,\n parent,\n searchFormPosition,\n showActions,\n showSelectionController,\n sorting,\n columnDisplayPreferences,\n cellRenderers,\n preferencesLoaded,\n intl,\n sortable\n}) => {\n const msg = (id, values = {}) => intl.formatMessage({id}, values)\n\n const List = useMemo(() => {\n if (formDefinition && preferencesLoaded) {\n const table = getTable(formDefinition)\n const columnsDefinitions = getColumnDefinition(\n {table, sorting, sortable, parent, intl, columnDisplayPreferences, cellRenderers}\n )\n\n return <StyledListWrapper searchFormPosition={searchFormPosition} key={`tableWrapper-${table.id}`}>\n <TableContainer\n key={`table-${table.id}`}\n columnDefinitions={columnsDefinitions}\n />\n </StyledListWrapper>\n }\n }, [formDefinition, sorting, columnDisplayPreferences, preferencesLoaded])\n\n const ActionBar = useMemo(() => {\n if (formDefinition) {\n const actionBar = getActionBar(formDefinition)\n const content = [\n ...(showSelectionController ? [<SelectionControllerContainer key=\"selectionController\"/>] : []),\n ...(showActions !== false && actionBar\n ? [<ActionContainer\n key={`listAction-${actionBar.id}`}\n definition={actionBar}\n parent={parent}\n disabled={dataLoadingInProgress}\n />]\n : [])\n ]\n\n if (content.length > 0 && actionBar) {\n return <StyledActionWrapper key={`listActionWrapper-${actionBar.id}`}>\n {content}\n </StyledActionWrapper>\n }\n }\n }, [dataLoadingInProgress, formDefinition])\n\n return (\n <LoadMask\n required={[formDefinition]}\n loadingText={msg('client.entity-list.loadingText')}\n >\n <StyledListView>\n {ActionBar}\n {List}\n </StyledListView>\n </LoadMask>\n )\n}\n\nListView.propTypes = {\n intl: PropTypes.object.isRequired,\n formDefinition: PropTypes.shape({\n children: PropTypes.array\n }),\n selection: PropTypes.arrayOf(PropTypes.string),\n currentPageIds: PropTypes.arrayOf(PropTypes.string),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n dataLoadingInProgress: PropTypes.bool,\n showSelectionController: PropTypes.bool,\n entityName: PropTypes.string,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n showActions: PropTypes.bool,\n sorting: PropTypes.arrayOf(PropTypes.shape({\n field: PropTypes.string,\n order: PropTypes.string\n })),\n sortable: PropTypes.bool,\n columnDisplayPreferences: PropTypes.objectOf(PropTypes.bool),\n cellRenderers: PropTypes.objectOf(PropTypes.func),\n preferencesLoaded: PropTypes.bool\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(ListView, areEqual)\n","import ListView from './ListView'\n\nexport default ListView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ListView from '../components/ListView'\n\nconst mapStateToProps = (state, props) => ({\n formDefinition: state.list.formDefinition,\n selection: state.selection.selection,\n currentPageIds: state.list.entities.map(e => e.__key),\n entityName: state.entityList.entityName,\n parent: state.entityList.parent,\n dataLoadingInProgress: state.list.inProgress,\n showSelectionController: state.selection.showSelectionController,\n searchFormPosition: state.input.searchFormPosition,\n showActions: state.input.showActions,\n sorting: state.list.sorting,\n sortable: state.list.sortable,\n columnDisplayPreferences: state.preferences.columns,\n preferencesLoaded: state.preferences.preferencesLoaded,\n cellRenderers: state.input.cellRenderers\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(ListView))\n","import styled from 'styled-components'\nimport {scale, StyledScrollbar} from 'tocco-ui'\n\nexport const TopPositioning = styled.div`\n height: 100%;\n display: grid;\n row-gap: 8px;\n grid-template-areas:\n 'search'\n 'list';\n grid-auto-rows: auto minmax(${({searchFormType}) => searchFormType === 'simple' ? 'auto' : '400px'}, 1fr);\n\n /* remove bottom space and set width in modal */\n ${({searchFormType}) => searchFormType !== 'simple' && `\n grid-template-columns: minmax(100%, 700px);\n `\n}\n`\n\nexport const LeftPositioning = styled.div`\n display: grid;\n column-gap: 1rem;\n ${({isCollapsed}) => !isCollapsed\n ? `\n grid: 'search list' / minmax(350px, 16%) auto;\n `\n : `\n grid: 'search list' / 25px auto;\n `\n }\n\n @media (max-width: 600px) {\n column-gap: 8px;\n }\n`\n\nexport const SearchGrid = styled.div`\n grid-area: search;\n overflow-y: auto;\n\n /* Limit height when positioned top */\n ${/* sc-selector */TopPositioning} & {\n max-height: 200px;\n padding-right: ${scale.space(-0.5)};\n ${StyledScrollbar}\n }\n`\n\nexport const ListGrid = styled.div`\n grid-area: list;\n display: flex;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport SearchViewContainer from '../../containers/SearchViewContainer'\nimport ListViewContainer from '../../containers/ListViewContainer'\nimport {TopPositioning, LeftPositioning, ListGrid, SearchGrid} from './StyledComponents'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\n\nconst EntityList = ({\n searchFormType,\n searchFormCollapsed,\n searchFormPosition,\n setSearchFormCollapsed\n}) => {\n const toggleCollapse = () => {\n setSearchFormCollapsed(!searchFormCollapsed)\n }\n\n if (searchFormType === searchFormTypes.NONE) {\n return <ListViewContainer/>\n }\n\n const PositioningContainer = searchFormPosition === 'left' ? LeftPositioning : TopPositioning\n\n return (\n <PositioningContainer searchFormType={searchFormType} isCollapsed={searchFormCollapsed}>\n <SearchGrid>\n <SearchViewContainer isCollapsed={searchFormCollapsed} toggleCollapse={toggleCollapse}/>\n </SearchGrid>\n <ListGrid searchFormType={searchFormType}>\n <ListViewContainer/>\n </ListGrid>\n </PositioningContainer>\n )\n}\n\nEntityList.propTypes = {\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFormCollapsed: PropTypes.bool,\n setSearchFormCollapsed: PropTypes.func\n}\n\nexport default EntityList\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport EntityList from './EntityList'\nimport {initialize, setSearchFormCollapsed} from '../../modules/entityList/actions'\nimport {initialize as initializeSearchForm} from '../../modules/searchForm/actions'\nimport {loadPreferences} from '../../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n initializeSearchForm,\n loadPreferences,\n setSearchFormCollapsed\n}\n\nconst mapStateToProps = state => ({\n searchFormType: state.input.searchFormType,\n searchFormPosition: state.input.searchFormPosition,\n searchFormCollapsed: state.entityList.searchFormCollapsed\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(EntityList))\n","import EntityList from './EntityListContainer'\n\nexport default EntityList\n","import {\n setSearchFormType,\n setFormName,\n setEntityName,\n setParent,\n setSearchFormPosition,\n setSearchFormCollapsedInitialValue\n} from './modules/entityList/actions'\nimport {\n setDisableSimpleSearch,\n setSimpleSearchFields\n} from './modules/searchForm/actions'\nimport {\n setLimit,\n setScope,\n setSearchFilters,\n setFormDefinition as setListFormDefinition,\n setShowLink,\n setSortable,\n setInputTql,\n setInputKeys,\n setInputSearchFilters\n} from './modules/list/actions'\nimport {setSelection} from './modules/selection/actions'\n\nconst isDefined = value => value !== undefined\n\nexport const getDispatchActions = input =>\n actionSettings.reduce((acc, actionSetting) => {\n if (isDefined(input[actionSetting.name])) {\n acc.push(actionSetting.action(...actionSetting.argsFactory(input)))\n }\n return acc\n }, [])\n\nexport const reloadOptions = {\n ALL: 3,\n DATA: 2,\n NOTHING: 1\n}\n\nexport const getReloadOption = input => {\n return Object.keys(input).reduce((res, key) => {\n const actionSetting = actionSettings.find(aS => aS.name === key)\n if (actionSetting && actionSetting.reload > res) {\n return actionSetting.reload\n }\n return res\n }, reloadOptions.NOTHING)\n}\n\nconst actionSettings = [\n {\n name: 'entityName',\n action: setEntityName,\n argsFactory: input => [input.entityName],\n reload: reloadOptions.ALL\n },\n {\n name: 'formName',\n action: setFormName,\n argsFactory: input => [input.formName],\n reload: reloadOptions.ALL\n },\n {\n name: 'limit',\n action: setLimit,\n argsFactory: input => [input.limit],\n reload: reloadOptions.DATA\n },\n {\n name: 'scope',\n action: setScope,\n argsFactory: input => [input.scope],\n reload: reloadOptions.ALL\n },\n {\n name: 'searchFilters',\n action: setSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormType',\n action: setSearchFormType,\n argsFactory: input => [input.searchFormType],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormPosition',\n action: setSearchFormPosition,\n argsFactory: input => [input.searchFormPosition],\n reload: reloadOptions.DATA\n },\n {\n name: 'disableSimpleSearch',\n action: setDisableSimpleSearch,\n argsFactory: input => [input.disableSimpleSearch],\n reload: reloadOptions.DATA\n },\n {\n name: 'simpleSearchFields',\n action: setSimpleSearchFields,\n argsFactory: input => [input.simpleSearchFields],\n reload: reloadOptions.DATA\n },\n {\n name: 'selection',\n type: 'boolean',\n action: setSelection,\n argsFactory: input => [input.selection],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'parent',\n action: setParent,\n argsFactory: input => [input.parent],\n reload: reloadOptions.DATA\n },\n {\n name: 'listFormDefinition',\n action: setListFormDefinition,\n argsFactory: input => [input.listFormDefinition],\n reload: reloadOptions.ALL\n },\n {\n name: 'showLink',\n action: setShowLink,\n argsFactory: input => [input.showLink],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'sortable',\n action: setSortable,\n argsFactory: input => [input.sortable],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'tql',\n action: setInputTql,\n argsFactory: input => [input.tql],\n reload: reloadOptions.DATA\n },\n {\n name: 'keys',\n action: setInputKeys,\n argsFactory: input => [input.keys],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFilters',\n action: setInputSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormCollapsed',\n action: setSearchFormCollapsedInitialValue,\n argsFactory: input => [input.searchFormCollapsed],\n reload: reloadOptions.NOTHING\n }\n]\n","import {put} from 'redux-saga/effects'\n\nimport {navigateToCreate, navigateToAction, toggleMarkings} from './modules/list/actions'\n\nexport default input => ({\n new: function* () {\n yield put(navigateToCreate(input.parent && input.parent.relationName))\n },\n fullscreen: function* (definition, selection) {\n yield put(navigateToAction(definition, selection))\n },\n mark: function* (definition, selection) {\n yield put(toggleMarkings(selection))\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reducer as reducerUtil, navigationStrategy} from 'tocco-util'\nimport {\n appFactory,\n notification,\n errorLogging,\n actionEmitter,\n externalEvents,\n actions,\n formData\n} from 'tocco-app-extensions'\nimport _pickBy from 'lodash/pickBy'\nimport _isEqual from 'lodash/isEqual'\nimport _isEmpty from 'lodash/isEmpty'\nimport SimpleFormApp from 'tocco-simple-form/src/main'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {reloadData, reloadAll} from './modules/entityList/actions'\nimport {refresh} from './modules/list/actions'\nimport EntityList from './components/EntityList'\nimport {getDispatchActions, getReloadOption, reloadOptions} from './input'\nimport {selectionStylePropType} from './util/selectionStyles'\nimport customActions from './customActions'\nimport {searchFormTypePropTypes} from './util/searchFormTypes'\n\nconst packageName = 'entity-list'\n\nconst EXTERNAL_EVENTS = [\n 'onRowClick',\n 'emitAction',\n 'onSelectChange',\n 'onStoreCreate',\n 'onSearchChange',\n 'onSearchFormCollapsedChange'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <EntityList/>\n\n let store = input.store\n\n const allCustomActions = {\n ...customActions(input),\n ...(input.customActions || {})\n }\n\n const context = {\n viewName: 'list',\n formName: input.formName,\n ...(input.contextParams || {})\n }\n\n if (!store) {\n store = appFactory.createStore(reducers, sagas, input, packageName)\n\n externalEvents.addToStore(store, events)\n actionEmitter.addToStore(store, events.emitAction)\n errorLogging.addToStore(store, false)\n notification.addToStore(store, false)\n actions.addToStore(store, {\n formApp: SimpleFormApp,\n listApp: EntityListApp,\n customActions: allCustomActions,\n appComponent: input.actionAppComponent,\n navigationStrategy: input.navigationStrategy,\n context\n })\n formData.addToStore(store, {listApp: EntityListApp, navigationStrategy: input.navigationStrategy})\n\n store.dispatch(externalEvents.fireExternalEvent('onStoreCreate', store))\n } else {\n store.dispatch(refresh())\n }\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: getDispatchActions(input),\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n return app\n}\n\n(() => {\n if (__DEV__ && __PACKAGE_NAME__ === 'entity-list') {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp('id', input)\n appFactory.renderApp(app.component)\n } else {\n appFactory.registerAppInRegistry(packageName, initApp)\n }\n})()\n\nconst getEvents = props =>\n EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\nclass EntityListApp extends React.Component {\n constructor(props) {\n super(props)\n this.app = initApp(props.id, props, getEvents(props))\n }\n\n componentDidUpdate(prevProps) {\n const changedProps = _pickBy(this.props, (value, key) => !_isEqual(value, prevProps[key]))\n if (changedProps.store && typeof prevProps.store !== 'undefined') {\n /**\n * Whenever the store gets explicitly changed from outside\n * the entity-list needs to be re-initialized in order to show correct information.\n * - e.g. docs-browser: start a search, navigate to folder and then go back to search\n * However this should not happen, whenever the entity-list has not been initialized before.\n * - e.g. admin: loading preferences (e.g. searchFormCollapsed) and set prop to entity-list\n * while being in initialization phase\n * Therefore only re-init when store has been set already.\n */\n this.app = initApp(this.props.id, this.props, getEvents(this.props))\n } else if (!_isEmpty(changedProps)) {\n getDispatchActions(changedProps).forEach(action => {\n this.app.store.dispatch(action)\n })\n\n const reloadOption = getReloadOption(changedProps)\n if (reloadOption === reloadOptions.ALL) {\n this.app.store.dispatch(reloadAll())\n } else if (reloadOption === reloadOptions.DATA) {\n this.app.store.dispatch(reloadData())\n }\n }\n }\n\n render() {\n return this.app.component\n }\n}\n\nEntityListApp.propTypes = {\n id: PropTypes.string.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n store: PropTypes.object,\n limit: PropTypes.number,\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFilters: PropTypes.arrayOf(PropTypes.string),\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n PropTypes.arrayOf(PropTypes.string)\n ]),\n hidden: PropTypes.bool\n })\n ),\n tql: PropTypes.string,\n keys: PropTypes.arrayOf(PropTypes.string),\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.string,\n onSelectChange: PropTypes.func,\n selectionStyle: selectionStylePropType,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n selectOnRowClick: PropTypes.bool,\n parent: PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.string\n }),\n actionAppComponent: PropTypes.func,\n navigationStrategy: navigationStrategy.propTypes,\n contextParams: PropTypes.object,\n searchFormCollapsed: PropTypes.bool\n}\n\nexport default EntityListApp\n","export const SET_SHOW_OLD_PASSWORD = 'PasswordUpdateDialog/SET_SHOW_OLD_PASSWORD'\nexport const SET_STANDALONE = 'PasswordUpdateDialog/SET_STANDALONE'\nexport const SET_FORCED_UPDATE = 'PasswordUpdateDialog/SET_FORCED_UPDATE'\nexport const SET_USERNAME_OR_PK = 'PasswordUpdateDialog/SET_USERNAME_OR_PK'\n\nexport const setShowOldPasswordField = showOldPasswordField => ({\n type: SET_SHOW_OLD_PASSWORD,\n payload: {\n showOldPasswordField\n }\n})\n\nexport const setForcedUpdate = forcedUpdate => ({\n type: SET_FORCED_UPDATE,\n payload: {\n forcedUpdate\n }\n})\n\nexport const setStandalone = standalone => ({\n type: SET_STANDALONE,\n payload: {\n standalone\n }\n})\n\nexport const setUsernameOrPk = usernameOrPk => ({\n type: SET_USERNAME_OR_PK,\n payload: {\n usernameOrPk\n }\n})\n","export const REQUEST_PASSWORD = 'Login/REQUEST_PASSWORD'\nexport const PASSWORD_REQUEST = 'Login/PASSWORD_REQUEST'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\n\nexport const requestPassword = username => ({\n type: REQUEST_PASSWORD,\n payload: {\n username\n }\n})\n\nexport const setPasswordRequest = passwordRequest => ({\n type: PASSWORD_REQUEST,\n payload: {\n passwordRequest\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n","export const CHANGE_PAGE = 'Login/CHANGE_PAGE'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\nexport const SET_PASSWORD = 'Login/SET_PASSWORD'\nexport const SET_CAPTCHA_KEY = 'login/SET_CAPTCHA_KEY'\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n\nexport const setPassword = password => ({\n type: SET_PASSWORD,\n payload: {\n password\n }\n})\n\nexport const setCaptchaKey = captchaKey => ({\n type: SET_CAPTCHA_KEY,\n payload: {\n captchaKey\n }\n})\n","export const Pages = {\n LOGIN_FORM: 'LOGIN_FORM',\n PASSWORD_REQUEST: 'PASSWORD_REQUEST',\n TWOSTEPLOGIN: 'TWOSTEPLOGIN',\n PASSWORD_UPDATE: 'PASSWORD_UPDATE',\n TWOSTEPLOGIN_ACTIVATION: 'TWOSTEPLOGIN_ACTIVATION'\n}\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss,\n Button,\n theme,\n scale\n} from 'tocco-ui'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {StyledButtonGroup} from 'tocco-ui/src/ButtonGroup'\n\nexport const StyledLoginFormInput = styled.input`\n /* stylelint-disable-next-line block-no-empty */\n @keyframes onAutoFillStart {\n from {}\n }\n\n && {\n transition: background-color 50000s, color 50000s, filter 50000s;\n\n &:-webkit-autofill {\n animation-duration: 50000s;\n animation-name: onAutoFillStart;\n }\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n ${StyledInputCss}\n`\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n\nexport const StyledLoginButton = styled(Button)`\n &&& {\n font-size: ${scale.font(1.3)};\n border-radius: ${theme.radii('large')};\n display: flex;\n justify-content: center;\n padding: 1.25rem 0;\n width: 100%;\n margin-top: 20px;\n margin-bottom: 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n }\n`\n\nexport const StyledTransparentButton = styled(Button)`\n &&& {\n margin-right: 0;\n background-color: transparent;\n color: ${theme.color('primary')};\n padding: 1.25rem 0;\n width: 100%;\n justify-content: center;\n\n &:hover {\n background-color: transparent;\n }\n }\n`\n\nexport const StyledLoginFormWrapper = styled.div`\n ${StyledButtonGroup} {\n margin-top: 1.8rem;\n width: auto;\n flex-direction: column;\n\n ${StyledButton} {\n flex-grow: 1;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useEffect, useState, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n SignalList,\n StatedValue,\n Typography\n} from 'tocco-ui'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nconst LoginForm = ({\n captchaKey,\n changePage,\n intl,\n login,\n loginPending,\n message,\n password,\n recaptchaActivated,\n setPassword,\n setUsername,\n showTitle,\n username\n}) => {\n const [autoFill, setAutoFill] = useState(false)\n const recaptchaRef = useRef()\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n if (recaptchaActivated) {\n handleSubmit()\n }\n }, [recaptchaActivated])\n\n const handleSubmit = async e => {\n if (e) {\n e.preventDefault()\n }\n\n let recaptchaToken = null\n if (recaptchaActivated) {\n recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n }\n\n login(username, password, recaptchaToken)\n }\n\n const handleUsernameChange = e => {\n setUsername(e.target.value)\n setAutoFill(false)\n }\n\n const handlePasswordChange = e => {\n setPassword(e.target.value)\n setAutoFill(false)\n }\n\n const handleAutoFill = e => {\n if (e.animationName === 'onAutoFillStart') {\n setAutoFill(true)\n }\n }\n\n const passwordFocus = !!username\n const usernameFocus = !passwordFocus\n\n return <StyledLoginFormWrapper>\n {showTitle\n && <React.Fragment>\n <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>\n <Typography.P><FormattedMessage id=\"client.login.form.introduction\"/></Typography.P>\n </React.Fragment>}\n <form onSubmit={handleSubmit}>\n <StatedValue\n hasValue={!!username || autoFill}\n id=\"login-username\"\n label={msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={usernameFocus}\n name=\"user\"\n data-cy=\"login-form_user-input\"\n onChange={handleUsernameChange}\n required\n type=\"text\"\n value={username}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StatedValue\n hasValue={!!password || autoFill}\n id=\"login-password\"\n label={msg('client.login.form.passwordPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={passwordFocus}\n name=\"password\"\n data-cy=\"login-form_password-input\"\n onChange={handlePasswordChange}\n required\n type=\"password\"\n value={password}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n {\n message && message.text\n && <SignalList.List>\n <SignalList.Item\n condition={message.negative ? 'danger' : 'base'}\n label={message.text}\n />\n </SignalList.List>\n }\n {captchaKey && recaptchaActivated && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n <StyledLoginButton\n disabled={!autoFill && (loginPending || username === '' || password === '')}\n ink=\"primary\"\n look=\"raised\"\n label={msg('client.login.form.button')}\n pending={loginPending}\n type=\"submit\"\n data-cy=\"login-form_login-button\"\n />\n <StyledTransparentButton\n label={msg('client.login.form.forgotLink')}\n onClick={() => changePage(Pages.PASSWORD_REQUEST)}\n data-cy=\"login-form_request-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n}\n\nLoginForm.propTypes = {\n captchaKey: PropTypes.string,\n changePage: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n login: PropTypes.func.isRequired,\n loginPending: PropTypes.bool.isRequired,\n message: PropTypes.shape({\n negative: PropTypes.bool,\n text: PropTypes.string\n }),\n password: PropTypes.string,\n recaptchaActivated: PropTypes.bool,\n setPassword: PropTypes.func.isRequired,\n setUsername: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n username: PropTypes.string\n}\n\nexport default LoginForm\n","import LoginForm from './LoginForm'\n\nexport default LoginForm\n","export const INITIALIZE = 'login/INITIALIZE'\nexport const INITIALIZED = 'Login/INITIALIZED'\nexport const LOGIN = 'Login/LOGIN'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n\nexport const login = (username, password, captchaToken) => ({\n type: LOGIN,\n payload: {\n username,\n password,\n captchaToken\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport LoginForm from '../components/LoginForm'\nimport {changePage, setUsername, setPassword} from '../modules/login/actions'\nimport {login} from '../modules/actions'\n\nconst mapActionCreators = {\n changePage,\n setUsername,\n setPassword,\n login\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n message: state.loginForm.message,\n loginPending: state.loginForm.loginPending,\n captchaKey: state.login.captchaKey,\n recaptchaActivated: state.loginForm.recaptchaActivated\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginForm))\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss\n} from 'tocco-ui'\n\nexport const StyledPasswordInput = styled.input.attrs(props => ({\n type: 'password'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport const StyledPasswordInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, StatedValue} from 'tocco-ui'\n\nimport {StyledPasswordInput, StyledPasswordInputWrapper} from './StyledPasswordInput'\n\nconst PasswordInput = props => {\n const getSignal = props.value\n ? props.valid === undefined\n ? null\n : props.valid\n ? design.condition.SUCCESS\n : design.condition.DANGER\n : null\n\n return (\n <StatedValue\n hasValue={!!props.value}\n id={`${props.name}-input`}\n immutable={props.readOnly === true}\n label={props.label}\n signal={getSignal}\n >\n <StyledPasswordInputWrapper immutable={props.readOnly === true}>\n <StyledPasswordInput\n id={`${props.name}-input`}\n value={props.value}\n onChange={e => props.onChange(e.target.value)}\n disabled={props.readOnly === true}\n immutable={props.readOnly === true}\n onKeyDown={props.onKeyDown}\n autoFocus={props.autoFocus}\n />\n </StyledPasswordInputWrapper>\n </StatedValue>\n )\n}\n\nPasswordInput.propTypes = {\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n value: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n readOnly: PropTypes.bool,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n valid: PropTypes.bool\n}\n\nexport default PasswordInput\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui/src/Button'\n\nexport default styled.div`\n ${StyledButton} {\n width: 100%;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, SignalList} from 'tocco-ui'\n\nconst ValidationRules = props => (\n <SignalList.List>\n {props.rules.map((rule, index) => {\n let condition = null\n\n let message = rule.message\n\n if (props.errors) {\n const error = props.errors[rule.name]\n if (error === true) {\n condition = design.condition.DANGER\n } else if (typeof error === 'string') {\n condition = design.condition.DANGER\n message = error\n } else {\n condition = design.condition.SUCCESS\n }\n }\n\n return (\n <SignalList.Item\n condition={condition}\n key={index}\n label={message}\n />\n )\n })}\n </SignalList.List>\n)\n\nValidationRules.propTypes = {\n errors: PropTypes.object,\n rules: PropTypes.array.isRequired,\n rulesNeutral: PropTypes.bool\n}\n\nexport default ValidationRules\n","import ValidationRules from './ValidationRules'\n\nexport default ValidationRules\n","export const DEFAULT = 'client.login.passwordUpdate.failure'\n\nexport const messages = {\n INVALID_CREDENTIALS: 'client.login.passwordUpdate.invalidCredentials',\n UNEXPECTED_ERROR: 'client.login.passwordUpdate.unexpectedError'\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {design, SignalList} from 'tocco-ui'\n\nimport {messages, DEFAULT as DEFAULT_MESSAGE} from './messages'\n\nfunction getMessage(errorCode) {\n return messages[errorCode] || DEFAULT_MESSAGE\n}\n\nconst FailureMessage = props => (\n <SignalList.List>\n <SignalList.Item condition={design.condition.DANGER}>\n <FormattedMessage id={getMessage(props.errorCode)}/>\n </SignalList.Item>\n </SignalList.List>\n)\n\nFailureMessage.propTypes = {\n errorCode: PropTypes.string\n}\n\nexport default FailureMessage\n","import FailureMessage from './FailureMessage'\n\nexport default FailureMessage\n","import PropTypes from 'prop-types'\nimport React, {useRef, useEffect} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {LoadMask, SignalList, Typography} from 'tocco-ui'\nimport styled from 'styled-components'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport PasswordInput from './PasswordInput'\nimport StyledPasswordUpdateDialog from './StyledPasswordUpdateDialog'\nimport ValidationRules from '../ValidationRules'\nimport FailureMessage from '../FailureMessage'\nimport {StyledLoginButton} from '../../StyledLoginForm'\n\nconst StyledValidationRulesWrapper = styled.div`\n margin: 1rem;\n`\n\nconst PasswordUpdateDialog = ({\n captchaKey,\n fetchValidationRules,\n forcedUpdate,\n initialized,\n intl,\n password,\n savePassword,\n showOldPasswordField,\n showTitle,\n updateNewPassword,\n updateNewPasswordRepeat,\n updateOldPassword,\n validationRules\n}) => {\n const recaptchaRef = useRef()\n\n useEffect(() => {\n fetchValidationRules()\n }, [])\n\n useEffect(() => {\n if (validationRules) {\n initialized()\n }\n }, [validationRules])\n\n const handleSubmit = async e => {\n e.preventDefault()\n\n if (isSubmittable() === true) {\n const recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n savePassword(recaptchaToken)\n }\n }\n\n const isSubmittable = () => {\n if (!password.newPasswordRepeat) {\n return false\n }\n if (password.newPassword !== password.newPasswordRepeat) {\n return false\n }\n if (password.passwordUpdatePending) {\n return false\n }\n return true\n }\n\n const msg = id => intl.formatMessage({id})\n\n if (!validationRules) {\n return <LoadMask/>\n }\n\n const oldPasswordReadOnly = password.passwordUpdatePending\n const newPasswordReadOnly = (!password.oldPassword && showOldPasswordField)\n || password.passwordUpdatePending\n const newPasswordRepeatReadOnly = !password.newPassword\n || password.passwordUpdatePending\n || (password.newPasswordValidationErrors && Object.keys(password.newPasswordValidationErrors).length > 0)\n\n return <StyledPasswordUpdateDialog>\n {showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordUpdate.title\"/></Typography.H5>}\n {forcedUpdate\n && <Typography.P><FormattedMessage id=\"client.login.passwordUpdate.introduction\"/></Typography.P>}\n <form onSubmit={handleSubmit}>\n {showOldPasswordField === true\n && <PasswordInput\n tabIndex={1}\n label={msg('client.login.passwordUpdate.oldPassword')}\n name=\"oldPassword\"\n value={password.oldPassword}\n onChange={updateOldPassword}\n readOnly={oldPasswordReadOnly}\n autoFocus\n {...(password.passwordUpdateFailed && password.passwordUpdateErrorCode === 'INVALID_CREDENTIALS'\n && {valid: false})\n }\n />}\n <PasswordInput\n tabIndex={2}\n label={msg('client.login.passwordUpdate.newPassword')}\n name=\"newPassword\"\n value={password.newPassword}\n onChange={updateNewPassword}\n readOnly={newPasswordReadOnly}\n autoFocus={showOldPasswordField !== true}\n valid={!newPasswordRepeatReadOnly}\n />\n <StyledValidationRulesWrapper>\n <ValidationRules\n rules={validationRules}\n errors={password.newPasswordValidationErrors}\n rulesNeutral={!password.newPassword}\n />\n </StyledValidationRulesWrapper>\n <PasswordInput\n tabIndex={3}\n label={msg('client.login.passwordUpdate.newPasswordRepeat')}\n name=\"newPasswordRepeat\"\n value={password.newPasswordRepeat}\n onChange={updateNewPasswordRepeat}\n readOnly={newPasswordRepeatReadOnly}\n valid={isSubmittable()}\n />\n\n {\n password.newPasswordRepeat\n && password.newPassword !== password.newPasswordRepeat\n && <SignalList.List>\n <SignalList.Item condition=\"danger\" label={<FormattedMessage id=\"client.login.passwordUpdate.noMatch\"/>}/>\n </SignalList.List>\n }\n\n {password.passwordUpdateFailed === true && <FailureMessage errorCode={password.passwordUpdateErrorCode}/>}\n <StyledLoginButton\n pending={password.passwordUpdatePending}\n disabled={isSubmittable() === false}\n ink=\"primary\"\n label={msg('client.login.passwordUpdate.saveButton')}\n look=\"raised\"\n type=\"submit\"\n />\n {captchaKey && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n </form>\n </StyledPasswordUpdateDialog>\n}\n\nPasswordUpdateDialog.propTypes = {\n captchaKey: PropTypes.string,\n fetchValidationRules: PropTypes.func.isRequired,\n forcedUpdate: PropTypes.bool,\n initialized: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n password: PropTypes.shape({\n newPassword: PropTypes.string.isRequired,\n newPasswordRepeat: PropTypes.string.isRequired,\n newPasswordValidationErrors: PropTypes.object,\n oldPassword: PropTypes.string.isRequired,\n passwordUpdateErrorCode: PropTypes.string,\n passwordUpdateFailed: PropTypes.bool,\n passwordUpdatePending: PropTypes.bool.isRequired\n }).isRequired,\n savePassword: PropTypes.func.isRequired,\n showOldPasswordField: PropTypes.bool,\n showTitle: PropTypes.bool,\n updateNewPassword: PropTypes.func.isRequired,\n updateNewPasswordRepeat: PropTypes.func.isRequired,\n updateOldPassword: PropTypes.func.isRequired,\n validationRules: PropTypes.array\n}\n\nexport default PasswordUpdateDialog\n","import PasswordUpdateDialog from './PasswordUpdateDialog'\n\nexport default PasswordUpdateDialog\n","export const INITIALIZED = 'INITIALIZED'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n","export const UPDATE_OLD_PASSWORD = 'PasswordUpdateDialog/UPDATE_OLD_PASSWORD'\nexport const UPDATE_NEW_PASSWORD = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD = 'PasswordUpdateDialog/SET_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD_VALIDATION_ERRORS = 'PasswordUpdateDialog/SET_NEW_PASSWORD_VALIDATION_ERRORS'\nexport const UPDATE_NEW_PASSWORD_REPEAT = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD_REPEAT'\nexport const SAVE_PASSWORD = 'PasswordUpdateDialog/SAVE_PASSWORD'\nexport const SAVE_PASSWORD_SUCCESS = 'PasswordUpdateDialog/SAVE_PASSWORD_SUCCESS'\nexport const SAVE_PASSWORD_FAILURE = 'PasswordUpdateDialog/SAVE_PASSWORD_FAILURE'\nexport const VALIDATE = 'PasswordUpdateDialog/VALIDATE'\nexport const RESET_PASSWORD_UPDATED_FAILED = 'PasswordUpdateDialog/RESET_PASSWORD_UPDATED_FAILED'\n\nexport const updateOldPassword = oldPassword => ({\n type: UPDATE_OLD_PASSWORD,\n payload: {\n oldPassword\n }\n})\n\nexport const updateNewPassword = newPassword => ({\n type: UPDATE_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPassword = newPassword => ({\n type: SET_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPasswordValidationErrors = errors => ({\n type: SET_NEW_PASSWORD_VALIDATION_ERRORS,\n payload: {\n errors\n }\n})\n\nexport const updateNewPasswordRepeat = newPasswordRepeat => ({\n type: UPDATE_NEW_PASSWORD_REPEAT,\n payload: {\n newPasswordRepeat\n }\n})\n\nexport const savePassword = captchaToken => ({\n type: SAVE_PASSWORD,\n payload: {\n captchaToken\n }\n})\n\nexport const savePasswordSuccess = () => ({\n type: SAVE_PASSWORD_SUCCESS\n})\n\nexport const savePasswordFailure = (errorCode, validationMessages) => ({\n type: SAVE_PASSWORD_FAILURE,\n payload: {\n errorCode,\n validationMessages\n }\n})\n\nexport const validate = () => ({\n type: VALIDATE\n})\n\nexport const resetPasswordUpdateFailed = () => ({\n type: RESET_PASSWORD_UPDATED_FAILED\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordUpdateDialog from '../components/passwordUpdate/PasswordUpdateDialog'\nimport {initialized} from '../modules/passwordUpdate/actions'\nimport {\n updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword\n} from '../modules/passwordUpdate/password'\nimport {fetchValidationRules} from '../modules/passwordUpdate/validationRules'\n\nconst mapActionCreators = {\n updateOldPassword,\n updateNewPassword,\n updateNewPasswordRepeat,\n fetchValidationRules,\n savePassword,\n initialized\n}\n\nconst mapStateToProps = state => ({\n password: state.passwordUpdate.password,\n validationRules: state.passwordUpdate.validationRules,\n showOldPasswordField: state.passwordUpdate.dialog.showOldPasswordField,\n forcedUpdate: state.passwordUpdate.dialog.forcedUpdate,\n captchaKey: state.login.captchaKey\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordUpdateDialog))\n","export const FETCH_VALIDATION_RULES = 'PasswordUpdateDialog/FETCH_VALIDATION_RULES'\nexport const SET_VALIDATION_RULES = 'PasswordUpdateDialog/SET_VALIDATION_RULES'\n\nexport const fetchValidationRules = () => ({\n type: FETCH_VALIDATION_RULES\n})\n\nexport const setValidationRules = rules => ({\n type: SET_VALIDATION_RULES,\n payload: {\n rules\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography\n} from 'tocco-ui'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nexport class PasswordRequest extends React.Component {\n constructor(props) {\n super(props)\n this.state = {\n username: this.props.username || ''\n }\n }\n\n handleSubmit(e) {\n e.preventDefault()\n this.props.requestPassword(this.state.username)\n }\n\n handleUsernameChange(e) {\n this.setState({\n username: e.target.value\n })\n }\n\n render() {\n return (\n <StyledLoginFormWrapper>\n {this.props.showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordRequest.title\"/></Typography.H5>}\n <Typography.P><FormattedMessage id=\"client.login.passwordRequest.introduction\"/></Typography.P>\n <form onSubmit={this.handleSubmit.bind(this)}>\n <StatedValue\n hasValue={!!this.state.username}\n id=\"login-username\"\n label={this.msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n name=\"user\"\n onChange={this.handleUsernameChange.bind(this)}\n required\n type=\"text\"\n value={this.state.username}\n data-cy=\"password-request_input\"\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StyledLoginButton\n look=\"raised\"\n disabled={!this.state.username || this.props.pending}\n ink=\"primary\"\n label={this.msg('client.login.passwordRequest.button')}\n pending={this.props.pending}\n type=\"submit\"\n data-cy=\"password-request_submit-button\"\n />\n <StyledTransparentButton\n disabled={this.props.pending}\n label={this.msg('client.login.passwordRequest.abortButton')}\n name=\"abort\"\n onClick={() => this.props.changePage(Pages.LOGIN_FORM)}\n data-cy=\"password-request_abort-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n )\n }\n\n msg(id) {\n return this.props.intl.formatMessage({\n id\n })\n }\n}\n\nPasswordRequest.propTypes = {\n intl: PropTypes.object.isRequired,\n changePage: PropTypes.func.isRequired,\n requestPassword: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n pending: PropTypes.bool,\n username: PropTypes.string\n}\n","import {PasswordRequest} from './PasswordRequest'\n\nexport default PasswordRequest\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordRequest from '../components/PasswordRequest'\nimport {changePage} from '../modules/login/actions'\nimport {requestPassword} from '../modules/passwordRequest/actions'\n\nconst mapActionCreators = {\n changePage,\n requestPassword\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n pending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordRequest))\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {StyledEditableValue, StyledInputCss} from 'tocco-ui/src/EditableValue/StyledEditableValue'\n\nexport const StyledTwoStepLogin = styled.div`\n ${StyledButton} {\n width: 100%;\n }\n\n ${StyledEditableValue} {\n ${StyledInputCss}\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useLayoutEffect, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography,\n EditableValue\n} from 'tocco-ui'\n\nimport {\n StyledTwoStepLogin\n} from './StyledTwoStepLoginForm'\nimport {StyledLoginButton, StyledLoginFormInputWrapper} from '../StyledLoginForm'\n\nconst TwoStepLoginForm = ({username, password, showTitle, loginPending, twoStepLogin, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const formEl = useRef()\n\n useLayoutEffect(() => {\n const firstInput = formEl.current.querySelector('input')\n firstInput.focus()\n }, [])\n\n const handleSubmit = e => {\n e.preventDefault()\n twoStepLogin(username, password, userCode)\n }\n\n const msg = id => intl.formatMessage({id})\n return <StyledTwoStepLogin>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <form onSubmit={handleSubmit} ref={formEl}>\n <Typography.P><FormattedMessage id=\"client.login.twoStepLogin.introduction\"/></Typography.P>\n <StatedValue\n hasValue={!!userCode}\n id=\"twoFactorCode-label\"\n label={msg('client.login.twoStepLogin.codePlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledLoginButton\n disabled={!userCode || userCode.toString().length < 6 || loginPending}\n ink=\"primary\"\n label={msg('client.login.form.button')}\n look=\"raised\"\n name=\"submit\"\n pending={loginPending}\n type=\"submit\"\n />\n </form>\n </StyledTwoStepLogin>\n}\n\nTwoStepLoginForm.propTypes = {\n intl: PropTypes.object.isRequired,\n twoStepLogin: PropTypes.func.isRequired,\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n showTitle: PropTypes.bool,\n loginPending: PropTypes.bool\n}\n\nexport default TwoStepLoginForm\n","import TwoStepLoginForm from './TwoStepLoginForm'\n\nexport default TwoStepLoginForm\n","export const TWOSTEPLOGIN = 'Login/TWOSTEPLOGIN'\nexport const SET_SECRET = 'Login/SET_SECRET'\n\nexport const twoStepLogin = (username, password, userCode) => ({\n type: TWOSTEPLOGIN,\n payload: {\n username,\n password,\n userCode\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport TwoStepLoginForm from '../components/TwoStepLoginForm'\nimport {twoStepLogin} from '../modules/twoStepLogin/actions'\n\nconst mapActionCreators = {\n twoStepLogin\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n loginPending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoStepLoginForm))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n Typography\n} from 'tocco-ui'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport {Pages} from '../../types/Pages'\n\nconst TwoFactorConnectorForm = ({username, password, secret, showTitle, changePage}) => {\n return <div>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <TwoFactorConnectorApp\n username={username}\n password={password}\n secret={secret}\n forced={true}\n onSuccess={() => {\n changePage(Pages.LOGIN_FORM)\n }}\n />\n </div>\n}\n\nTwoFactorConnectorForm.propTypes = {\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n secret: PropTypes.shape({\n text: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n showTitle: PropTypes.bool,\n changePage: PropTypes.func.isRequired\n}\n\nexport default TwoFactorConnectorForm\n","import TwoFactorConnectorForm from './TwoFactorConnectorForm'\n\nexport default TwoFactorConnectorForm\n","import {connect} from 'react-redux'\n\nimport TwoFactorConnectorForm from '../components/TwoFactorConnectorForm'\nimport {changePage} from '../modules/login/actions'\n\nconst mapActionCreators = {\n changePage\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n secret: state.twoStepLogin.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(TwoFactorConnectorForm)\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\nimport {Pages} from '../../types/Pages'\nimport LoginFormContainer from '../../containers/LoginFormContainer'\nimport PasswordUpdateContainer from '../../containers/PasswordUpdateDialogContainer'\nimport PasswordRequestContainer from '../../containers/PasswordRequestContainer'\nimport TwoStepLoginContainer from '../../containers/TwoStepLoginContainer'\nimport TwoFactorConnectorContainer from '../../containers/TwoFactorConnectorContainer'\n\nconst GlobalRecaptchaBadgeStyle = createGlobalStyle`\n .grecaptcha-badge {\n z-index: 9999999;\n opacity: .8;\n }\n`\n\nconst Login = props => {\n useEffect(() => {\n props.initialize()\n }, [])\n\n return <>\n <GlobalRecaptchaBadgeStyle/>\n {(() => {\n switch (props.currentPage) {\n case Pages.PASSWORD_UPDATE:\n return <PasswordUpdateContainer showTitle={props.showTitle}/>\n case Pages.PASSWORD_REQUEST:\n return <PasswordRequestContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN:\n return <TwoStepLoginContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN_ACTIVATION:\n return <TwoFactorConnectorContainer/>\n default:\n return <LoginFormContainer showTitle={props.showTitle}/>\n }\n })()}\n </>\n}\n\nLogin.propTypes = {\n initialize: PropTypes.func.isRequired,\n currentPage: PropTypes.string,\n showTitle: PropTypes.bool\n}\n\nexport default Login\n","import Login from './Login'\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from '../components/Login'\nimport {initialize} from '../modules/actions'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: props.currentPage || state.login.currentPage,\n showTitle: props.showTitle\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import {externalEvents} from 'tocco-app-extensions'\nimport {put, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport function* resizeWatcher() {\n yield put(externalEvents.fireExternalEvent('resize'))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZED, resizeWatcher)\n ])\n}\n","export function isEmptyObject(object) {\n // http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object\n return Object.keys(object).length === 0 && object.constructor === Object\n}\n\nexport function validationMessagesToErrorMap(messages) {\n const errors = {}\n messages.forEach(message => {\n errors[message.ruleName] = message.message\n })\n return errors\n}\n","import * as actions from './actions'\nimport {validationMessagesToErrorMap} from './utils'\n\nconst initialState = {\n oldPassword: '',\n newPassword: '',\n newPasswordRepeat: '',\n newPasswordValidationErrors: null,\n passwordUpdatePending: false,\n passwordUpdateFailed: false,\n passwordUpdateErrorCode: null\n}\n\nconst updateOldPassword = (state, {payload}) => ({\n ...state,\n oldPassword: payload.oldPassword\n})\n\nconst setNewPassword = (state, {payload}) => ({\n ...state,\n newPassword: payload.newPassword\n})\n\nconst setNewPasswordValidationErrors = (state, {payload}) => ({\n ...state,\n newPasswordValidationErrors: payload.errors\n})\n\nconst updateNewPasswordRepeat = (state, {payload}) => ({\n ...state,\n newPasswordRepeat: payload.newPasswordRepeat\n})\n\nconst savePassword = state => ({\n ...state,\n passwordUpdatePending: true,\n passwordUpdateFailed: false\n})\n\nconst savePasswordSuccess = state => (\n initialState\n)\n\nconst savePasswordFailure = (state, {payload}) => {\n if (payload.validationMessages) {\n const errors = validationMessagesToErrorMap(payload.validationMessages)\n return {\n ...state,\n passwordUpdatePending: false,\n newPasswordValidationErrors: errors\n }\n } else {\n return {\n ...state,\n passwordUpdatePending: false,\n passwordUpdateFailed: true,\n passwordUpdateErrorCode: payload.errorCode\n }\n }\n}\n\nconst resetPasswordUpdateFailed = (state, {payload}) => ({\n ...state,\n passwordUpdateFailed: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.UPDATE_OLD_PASSWORD]: updateOldPassword,\n [actions.SET_NEW_PASSWORD]: setNewPassword,\n [actions.SET_NEW_PASSWORD_VALIDATION_ERRORS]: setNewPasswordValidationErrors,\n [actions.UPDATE_NEW_PASSWORD_REPEAT]: updateNewPasswordRepeat,\n [actions.SAVE_PASSWORD]: savePassword,\n [actions.SAVE_PASSWORD_SUCCESS]: savePasswordSuccess,\n [actions.SAVE_PASSWORD_FAILURE]: savePasswordFailure,\n [actions.RESET_PASSWORD_UPDATED_FAILED]: resetPasswordUpdateFailed\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword}\n\nexport {sagas}\n\nexport default reducer\n","export const RULE_PASSWORD_NOT_CHANGED = 'PASSWORD_NOT_CHANGED'\nexport const RULE_LENGTH = 'LENGTH'\nexport const RULE_CHARACTER_INSUFFICIENT_LOWERCASE = 'CHARACTER_INSUFFICIENT_LOWERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_UPPERCASE = 'CHARACTER_INSUFFICIENT_UPPERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_DIGIT = 'CHARACTER_INSUFFICIENT_DIGIT'\n\nfunction validateCharacterRule(password, regex, min, max) {\n if (typeof password !== 'string') {\n return false\n }\n\n const initialLength = password.length\n const lengthWithoutSpecificChars = password.replace(regex, '').length\n const specificCharsCount = initialLength - lengthWithoutSpecificChars\n\n return (min === undefined || min === null || specificCharsCount >= min)\n && (max === undefined || max === null || specificCharsCount <= max)\n}\n\nconst VALIDATORS = {\n [RULE_PASSWORD_NOT_CHANGED]: (newPassword, oldPassword) =>\n typeof newPassword === 'string' && typeof oldPassword === 'string' && newPassword !== oldPassword,\n [RULE_LENGTH]: (newPassword, oldPassword, rule) =>\n typeof newPassword === 'string'\n && (rule.params.min === undefined || rule.params.min === null || newPassword.length >= rule.params.min)\n && (rule.params.max === undefined || rule.params.max === null || newPassword.length <= rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_LOWERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[a-z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_UPPERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[A-Z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_DIGIT]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[0-9]/g, rule.params.min, rule.params.max)\n}\n\nfunction validate(newPassword, oldPassword, validationRules) {\n const errors = {}\n\n if (validationRules) {\n validationRules.forEach(rule => {\n const validator = VALIDATORS[rule.name]\n if (validator) {\n const valid = validator(newPassword, oldPassword, rule)\n if (valid !== true) {\n errors[rule.name] = true\n }\n }\n })\n }\n\n return errors\n}\n\nexport default validate\n","export const SET_MESSAGE = 'Login/SET_MESSAGE'\nexport const SET_PENDING = 'Login/SET_PENDING'\nexport const ACTIVATE_RECAPTCHA = 'loginForm/ACTIVATE_RECAPTCHA'\r\n\nexport const setMessage = (text, negative = false) => ({\n type: SET_MESSAGE,\n payload: {\n text,\n negative\n }\n})\n\nexport const setPending = (pending = false) => ({\n type: SET_PENDING,\n payload: {\n pending\n }\n})\n\nexport const activateRecaptcha = () => ({\n type: ACTIVATE_RECAPTCHA\n})\n","import {consoleLogger} from 'tocco-util'\nimport {cache, externalEvents, intl, rest} from 'tocco-app-extensions'\nimport {takeLatest, put, select, call, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport * as loginActions from './login/actions'\nimport {setMessage, setPending, activateRecaptcha} from './loginForm/actions'\nimport {updateOldPassword} from './passwordUpdate/password/actions'\nimport {setUsernameOrPk, setForcedUpdate} from './passwordUpdate/dialog/actions'\nimport {changePage, setPassword} from './login/actions'\nimport {setSecret} from './twoStepLogin/actions'\nimport {Pages} from '../types/Pages'\n\nexport const DEFAULT_TIMEOUT = 30\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\nexport const loginSelector = state => state.login\n\nexport function doRequest(url, options) {\n return new Promise(resolve => {\n fetch(url, options)\n .then(resp => resp.json().then(json => resolve(json)))\n .catch(e => {\n consoleLogger.logError('Failed to execute request', e)\n resolve({success: false})\n })\n })\n}\n\nexport function* doLoginRequest(data) {\n return yield call(doRequest, `${__BACKEND_URL__}/nice2/login`, getOptions(data))\n}\n\nexport function* doSessionRequest() {\n return yield call(doRequest, `${__BACKEND_URL__}/nice2/session`, getOptions())\n}\n\nfunction getOptions(data = {}) {\n return {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n }),\n credentials: 'include',\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n }\n}\n\nexport function* handleTwoStepLoginResponse() {\n yield put(changePage(Pages.TWOSTEPLOGIN))\n}\n\nexport function* handleTwoStepActivationResponse(response) {\n const twoFactorResponse = response[Pages.TWOSTEPLOGIN_ACTIVATION]\n yield put(setSecret(twoFactorResponse))\n yield put(changePage(Pages.TWOSTEPLOGIN_ACTIVATION))\n}\n\nexport function* handlePasswordUpdateResponse() {\n const login = yield select(loginSelector)\n yield put(updateOldPassword(login.password))\n yield put(setUsernameOrPk(login.username))\n yield put(setForcedUpdate(true))\n yield put(changePage(Pages.PASSWORD_UPDATE))\n}\n\nexport function* handleBlockResponse() {\n const text = yield select(textResourceSelector, 'client.login.form.blocked')\n yield put(setMessage(text, true))\n}\n\nexport function* handleFailedResponse() {\n const text = yield select(textResourceSelector, 'client.login.form.failed')\n yield put(setMessage(text, true))\n}\n\nexport function* handleSuccessfulLogin(response) {\n const localChanged = yield call(intl.hasUserLocaleChanged)\n if (localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(setPassword(''))\n const timeout = response.timeout || DEFAULT_TIMEOUT\n yield put(externalEvents.fireExternalEvent('loginSuccess', {timeout}))\n}\n\nexport function* loginSaga({payload}) {\n const {username, password, captchaToken, userCode} = payload\n const loginData = {\n username,\n password,\n ...(captchaToken && {captchaToken}),\n ...(userCode && {userCode})\n }\n yield put(setPending(true))\n\n const response = yield call(doLoginRequest, loginData)\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n } else {\n yield put(changePage(Pages.LOGIN_FORM)) // in order to display possible error message\n if (response.CAPTCHA) {\n yield put(activateRecaptcha())\n } else if (response.TWOSTEPLOGIN) {\n yield call(handleTwoStepLoginResponse, response)\n } else if (response.RESET_PASSWORD_REQUIRED) {\n yield call(handlePasswordUpdateResponse)\n } else if (response.LOGIN_BLOCKED) {\n yield call(handleBlockResponse)\n } else if (response.TWOSTEPLOGIN_ACTIVATION) {\n yield call(handleTwoStepActivationResponse, response)\n } else {\n yield call(handleFailedResponse)\n }\n yield put(setPending(false))\n }\n}\n\nexport function* checkSessionSaga() {\n const response = yield call(doSessionRequest)\n\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n }\n}\n\nexport function* loadSettings() {\n const settings = yield call(rest.fetchServerSettings)\n yield put(loginActions.setCaptchaKey(settings.captchaKey))\n}\n\nexport function* initialize() {\n yield call(checkSessionSaga)\n yield call(loadSettings)\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOGIN, loginSaga),\n takeLatest(actions.INITIALIZE, initialize)\n ])\n}\n","import {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, call, select, put, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport localValidate from './validate'\nimport {isEmptyObject, validationMessagesToErrorMap} from './utils'\nimport {loginSaga} from '../../sagas'\nimport {setPassword} from '../../login/actions'\n\nexport const validationRulesSelector = state => state.passwordUpdate.validationRules\nexport const inputSelector = state => state.input\nexport const usernameOrPkSelector = state => state.passwordUpdate.dialog.usernameOrPk\nexport const passwordSelector = state => state.passwordUpdate.password\nexport const standaloneSelector = state => state.passwordUpdate.dialog.standalone\nexport const intlSelector = state => state.intl\n\nexport function* storePassword(usernameOrPk, data, captchaToken) {\n const options = {\n method: 'POST',\n acceptedStatusCodes: [400],\n body: {\n ...data,\n captchaToken\n }\n }\n\n try {\n const resp = yield call(rest.requestSaga, `principals/${usernameOrPk}/password-update`, options)\n return resp.ok ? {error: null} : {error: resp.body}\n } catch (exception) {\n return {error: {errorCode: 'UNEXPECTED_ERROR', exception}}\n }\n}\n\nexport function* remoteValidate(usernameOrPk, data) {\n const {locale} = yield select(intlSelector)\n\n const options = {\n method: 'POST',\n body: data,\n queryParams: {locale}\n }\n\n try {\n const resp = yield call(rest.requestSaga, `principals/${usernameOrPk}/password-validation`, options)\n return resp.body\n } catch (exception) {\n // validation request failed for some reason. we ignore that.\n // (validation takes place on actual update request again)\n return {valid: true, exception}\n }\n}\n\nexport function* updateNewPassword(action) {\n yield put(actions.setNewPassword(action.payload.newPassword))\n yield put(actions.validate())\n}\n\nexport function* validate() {\n const validationRules = yield select(validationRulesSelector)\n const password = yield select(passwordSelector)\n\n const errors = localValidate(password.newPassword, password.oldPassword, validationRules)\n\n if (!isEmptyObject(errors)) {\n yield put(actions.setNewPasswordValidationErrors(errors))\n } else {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const data = yield call(getData)\n const result = yield call(remoteValidate, usernameOrPk, data)\n if (result.valid === true) {\n yield put(actions.setNewPasswordValidationErrors({}))\n } else {\n const errors = validationMessagesToErrorMap(result.validationMessages)\n yield put(actions.setNewPasswordValidationErrors(errors))\n }\n }\n}\n\nexport function* savePassword({payload: {captchaToken}}) {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const data = yield call(getData)\n const result = yield call(storePassword, usernameOrPk, data, captchaToken)\n\n if (result.error) {\n if (result.error.valid === false) {\n yield put(actions.savePasswordFailure(null, result.error.validationMessages))\n } else {\n yield put(actions.savePasswordFailure(result.error.errorCode))\n }\n } else {\n const standalone = yield select(standaloneSelector)\n if (standalone) {\n yield put(externalEvents.fireExternalEvent('success', {\n newPassword: data.newPassword\n }))\n } else {\n const loginData = yield call(getLoginData)\n yield put(setPassword(loginData.payload.password))\n yield call(loginSaga, loginData)\n }\n\n yield put(actions.savePasswordSuccess())\n }\n}\n\nexport function* getData() {\n const input = yield select(inputSelector)\n const password = yield select(passwordSelector)\n\n return {\n oldPassword: input.oldPassword ? input.oldPassword : password.oldPassword,\n newPassword: password.newPassword\n }\n}\n\nexport function* getLoginData() {\n const password = yield select(passwordSelector)\n const usernameOrPk = yield select(usernameOrPkSelector)\n\n return {\n payload: {\n username: usernameOrPk,\n password: password.newPasswordRepeat\n }\n }\n}\n\nexport function* formChanged() {\n yield put(actions.resetPasswordUpdateFailed())\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.UPDATE_NEW_PASSWORD, updateNewPassword),\n takeLatest(actions.VALIDATE, validate),\n takeLatest(actions.SAVE_PASSWORD, savePassword),\n takeLatest(actions.UPDATE_NEW_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_OLD_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_NEW_PASSWORD_REPEAT, formChanged)\n ])\n}\n","import * as actions from './actions'\n\nconst initialState = {\n showOldPasswordField: true,\n forcedUpdate: false,\n standalone: true,\n usernameOrPk: ''\n}\n\nconst singleTransferReducer = attributeName => {\n return (state, {payload}) => {\n const val = payload[attributeName]\n return {\n ...state,\n [attributeName]: val\n }\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_SHOW_OLD_PASSWORD]: singleTransferReducer('showOldPasswordField'),\n [actions.SET_FORCED_UPDATE]: singleTransferReducer('forcedUpdate'),\n [actions.SET_STANDALONE]: singleTransferReducer('standalone'),\n [actions.SET_USERNAME_OR_PK]: singleTransferReducer('usernameOrPk')\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_VALIDATION_RULES]: (state, action) => action.payload.rules\n}\n\nconst initialState = null\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fetchValidationRules} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {fetchValidationRules}\n\nexport {sagas}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {takeLatest, call, put, select, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport const usernameOrPkSelector = state => state.passwordUpdate.dialog.usernameOrPk\nexport const intlSelector = state => state.intl\n\nexport function* loadValidationRules(usernameOrPk, locale = '') {\n const resource = `principals/${usernameOrPk}/password-rules`\n\n const validationResponse = yield call(rest.requestSaga, resource, {queryParams: {locale}})\n return validationResponse.body\n}\n\nexport function* fetchValidationRules() {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const {locale} = yield select(intlSelector)\n\n const response = yield call(loadValidationRules, usernameOrPk, locale)\n yield put(actions.setValidationRules(response.rules))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.FETCH_VALIDATION_RULES, fetchValidationRules)\n ])\n}\n","import mainSagas from './sagas'\nimport password, {sagas as passwordSagas} from './password'\nimport dialog from './dialog'\nimport validationRules, {sagas as validationRulesSagas} from './validationRules'\n\nexport default {\n dialog,\n password,\n validationRules\n}\n\nexport const sagas = [\n mainSagas,\n passwordSagas,\n validationRulesSagas\n]\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport {Pages} from './../../types/Pages'\n\nconst changePage = (state, {payload}) => {\n const {page} = payload\n return {\n ...state,\n currentPage: page\n }\n}\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst setPassword = (state, {payload}) => {\n const {password} = payload\n return {\n ...state,\n password\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.CHANGE_PAGE]: changePage,\n [actions.SET_USERNAME]: setUsername,\n [actions.SET_PASSWORD]: setPassword,\n [actions.SET_CAPTCHA_KEY]: reducerUtil.singleTransferReducer('captchaKey')\n}\n\nconst initialState = {\n currentPage: Pages.LOGIN_FORM,\n username: '',\n password: '',\n captchaKey: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {SET_MESSAGE, SET_PENDING, ACTIVATE_RECAPTCHA} from './actions'\n\nconst setMessage = (state, {payload}) => {\n const {text, negative} = payload\n return {\n ...state,\n message: {\n text,\n negative\n }\n }\n}\n\nconst setPending = (state, {payload}) => ({\n ...state,\n loginPending: payload.pending\n})\n\nconst activateRecaptcha = state => ({\n ...state,\n recaptchaActivated: true\n})\n\nconst ACTION_HANDLERS = {\n [SET_MESSAGE]: setMessage,\n [SET_PENDING]: setPending,\n [ACTIVATE_RECAPTCHA]: activateRecaptcha\n}\n\nconst initialState = {\n message: {},\n loginPending: false,\n recaptchaActivated: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {takeLatest, call, put, all} from 'redux-saga/effects'\n\nimport {loginSaga} from '../sagas'\nimport {setPending} from '../loginForm/actions'\nimport * as actions from './actions'\n\nexport function* twoStepSaga(args) {\n yield put(setPending(true))\n yield call(loginSaga, args)\n}\n\nexport default function* rootSaga() {\n yield all([\n takeLatest(actions.TWOSTEPLOGIN, twoStepSaga)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret')\n}\n\nconst initialState = {\n secret: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {put, call, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {changePage, setUsername} from '../login/actions'\nimport {setMessage, setPending} from '../loginForm/actions'\nimport {Pages} from '../../types/Pages'\n\nexport const textResourceSelector = state => state.intl.messages\n\nexport function* requestPasswordSaga({payload}) {\n yield put(setPending(true))\n yield call(rest.requestSaga, `principals/${payload.username}/password-reset`, {method: 'POST'})\n yield put(setUsername(payload.username))\n const textResourcesState = yield select(textResourceSelector)\n yield put(setMessage(textResourcesState['client.login.from.passwordRequested']))\n yield put(changePage(Pages.LOGIN_FORM))\n yield put(setPending(false))\n}\n\nexport function* passwordRequestSaga({payload}) {\n if (payload.passwordRequest === true) {\n yield put(changePage(Pages.PASSWORD_REQUEST))\n }\n}\n\nexport default function* saga() {\n yield all([\n takeLatest(actions.REQUEST_PASSWORD, requestPasswordSaga),\n takeLatest(actions.PASSWORD_REQUEST, passwordRequestSaga)\n ])\n}\n","import * as actions from './actions'\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_USERNAME]: setUsername\n}\n\nconst initialState = {\n username: ''\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport passwordUpdateReducers, {sagas as passwordUpdateSagas} from './passwordUpdate/reducers'\nimport login from './login'\nimport loginForm from './loginForm'\nimport twoStepLogin, {sagas as twoStepLoginSagas} from './twoStepLogin'\nimport mainSagas from './sagas'\nimport passwordRequest, {sagas as passwordRequestSagas} from './passwordRequest'\n\nexport default {\n login,\n loginForm,\n passwordRequest,\n passwordUpdate: combineReducers(passwordUpdateReducers),\n twoStepLogin\n}\n\nexport const sagas = [\n mainSagas,\n passwordRequestSagas,\n twoStepLoginSagas,\n ...passwordUpdateSagas\n]\n","import React, {useState, useEffect} from 'react'\nimport {consoleLogger, reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, errorLogging, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport * as passwordUpdate from './modules/passwordUpdate/dialog/actions'\nimport * as passwordRequest from './modules/passwordRequest/actions'\nimport * as login from './modules/login/actions'\nimport LoginContainer from './containers/LoginContainer'\nimport loginReducers, {sagas} from './modules/reducers'\n\nconst packageName = 'login'\n\nconst EXTERNAL_EVENTS = [\n 'loginSuccess',\n 'resize'\n]\n\nconst initLoginApp = (id, input, events, publicPath, customTheme) => {\n const actions = [\n passwordUpdate.setShowOldPasswordField(false),\n passwordUpdate.setStandalone(false),\n passwordRequest.setPasswordRequest(!!input.passwordRequest),\n login.setUsername(input.username)\n ]\n\n const showTitle = !!input.showTitle\n const content = <LoginContainer showTitle={showTitle}/>\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\nconst initPasswordUpdateApp = (id, input, events, publicPath, customTheme) => {\n const showTitle = !!input.showTitle\n const forcedUpdate = !!input.forcedUpdate\n\n const content = <LoginContainer currentPage=\"PASSWORD_UPDATE\" showTitle={showTitle}/>\n\n if (typeof input.username !== 'string' || input.username.length === 0) {\n consoleLogger.logError('Mandatory input \"username\" is not set on password-update')\n return\n }\n\n const actions = [\n passwordUpdate.setUsernameOrPk(input.username),\n passwordUpdate.setForcedUpdate(forcedUpdate)\n ]\n\n if (typeof input.showOldPasswordField === 'boolean') {\n actions.push(passwordUpdate.setShowOldPasswordField(input.showOldPasswordField))\n }\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n\n return appFactory.createApp(\n `${packageName}.passwordUpdate`,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initLoginApp)\n appFactory.registerAppInRegistry('password-update', initPasswordUpdateApp)\n\n if (__DEV__) {\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n }\n\n const app = initLoginApp('id', require('./dev/login_input.json'))\n // uncomment to develop passwordUpdate App\n // const app = initPasswordUpdateApp('id', require('./dev/password_update_input.json'))\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass LoginApp extends React.Component {\n constructor(props) {\n super(props)\n this.input = {\n showTitle: props.showTitle,\n locale: props.locale,\n passwordRequest: props.passwordRequest,\n username: props.username || ''\n }\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initLoginApp('id', this.input, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nLoginApp.propTypes = {\n showTitle: PropTypes.bool,\n locale: PropTypes.string,\n passwordRequest: PropTypes.bool,\n username: PropTypes.string,\n setLocale: PropTypes.func,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default LoginApp\n\nconst EXTERNAL_EVENTS_PASSWORD_UPDATE = [\n 'success',\n 'resize'\n]\n\nexport const PasswordUpdateApp = props => {\n const [app, setApp] = useState(null)\n useEffect(() => {\n const events = EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce((events, event) => (\n {...events, ...(props[event] && {[event]: props[event]})}\n ), {})\n\n setApp(initPasswordUpdateApp('password-update', props, events))\n }, [])\n\n return app ? app.component : null\n}\n\nPasswordUpdateApp.propTypes = {\n username: PropTypes.string,\n showTitle: PropTypes.bool,\n showOldPasswordField: PropTypes.bool,\n oldPassword: PropTypes.string,\n ...EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {})\n}\n","export const INITIALIZE_QUESTION_FORM = 'simpleForm/INITIALIZE_QUESTION_FORM'\nexport const ADVANCED_SEARCH_UPDATE = 'simpleForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FIELD_DEFINITIONS = 'simpleForm/SET_FIELD_DEFINITIONS'\r\n\nexport const SUBMIT = 'simpleForm/SUBMIT'\nexport const CANCEL = 'simpleForm/CANCEL'\n\nexport const initializeForm = () => ({\n type: INITIALIZE_QUESTION_FORM,\n payload: {\n }\n})\n\nexport const submit = () => ({\n type: SUBMIT\n})\n\nexport const cancel = () => ({\n type: CANCEL\n})\n\nexport const setFieldDefinitions = fieldDefinitions => ({\n type: SET_FIELD_DEFINITIONS,\n payload: {\n fieldDefinitions\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_FIELD_DEFINITIONS]: reducerUtil.singleTransferReducer('fieldDefinitions')\n}\n\nconst initialState = {\n fieldDefinitions: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {actions as formActions, getFormValues, isValid} from 'redux-form'\nimport {CHANGE, INITIALIZE, UPDATE_SYNC_ERRORS} from 'redux-form/es/actionTypes'\nimport {externalEvents, form as formUtil} from 'tocco-app-extensions'\nimport {all, call, put, select, takeEvery, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nconst FORM_ID = 'simpleForm'\nexport const inputSelector = state => state.input\nexport const selector = state => state.simpleForm\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.INITIALIZE_QUESTION_FORM, initialize),\n takeEvery(actions.SUBMIT, submit),\n takeEvery(actions.CANCEL, cancel),\n takeLatest(CHANGE, change),\n takeLatest(UPDATE_SYNC_ERRORS, change),\n takeLatest(INITIALIZE, change)\n ])\n}\n\nexport function* initialize() {\n const {form, defaultValues: inputDefaultValues} = yield select(inputSelector)\n const fieldDefinitions = yield call(formUtil.getFieldDefinitions, form)\n const fromDefaultValues = yield call(formUtil.getDefaultValues, fieldDefinitions)\n yield put(formActions.initialize(FORM_ID, {...fromDefaultValues, ...inputDefaultValues}))\n}\n\nexport function* submit() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onSubmit', {values}))\n}\n\nexport function* cancel() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onCancel', {values}))\n}\n\nexport function* change() {\n const values = yield getValues()\n const valid = yield select(isValid(FORM_ID))\n yield put(externalEvents.fireExternalEvent('onChange', {\n values,\n valid\n }))\n}\n\nfunction* getValues() {\n return Object.entries(yield select(getFormValues(FORM_ID)))\n .reduce((acc, [key, value]) => (\n {\n ...acc,\n [key.replace('--', '.')]: value\n }\n ), {})\n}\n","import {reducer as form} from 'redux-form'\n\nimport formReducer, {sagas as formSagas} from './simpleForm'\n\nexport default {\n simpleForm: formReducer,\n form\n}\n\nexport const sagas = [\n formSagas\n]\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledButtonsWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {form} from 'tocco-app-extensions'\nimport {Button} from 'tocco-ui'\nimport {reduxForm} from 'redux-form'\n\nimport {StyledButtonsWrapper} from './StyledComponents'\n\nconst REDUX_FORM_NAME = 'simpleForm'\n\nconst Form = ({\n initializeForm,\n intl, onCancel,\n onSubmit,\n handleSubmit: handleSubmitProp,\n form: formName,\n formDefinition,\n formValues,\n mappingType,\n mode,\n noButtons,\n submitting,\n submitText,\n cancelText\n}) => {\n const msg = id => intl.formatMessage({id})\n const handleCancel = () => onCancel()\n const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))\n // delay closing of the window so it won't close immediately with the click\n const handleSubmit = () => sleep(400).then(() => onSubmit())\n\n useEffect(() => {\n initializeForm()\n }, [])\n\n return (\n <form onSubmit={handleSubmitProp(handleSubmit)}>\n <form.FormBuilder\n entity={undefined}\n formName={formName}\n formDefinition={formDefinition}\n formValues={formValues}\n fieldMappingType={mappingType || 'editable'}\n mode={mode}\n />\n {!noButtons\n && <StyledButtonsWrapper>\n <Button\n disabled={submitting}\n ink=\"primary\"\n label={submitText || msg('client.simple-form.defaultOk')}\n pending={submitting}\n type=\"submit\"\n />\n <Button\n disabled={submitting}\n label={cancelText || msg('client.simple-form.defaultCancel')}\n onClick={handleCancel}\n />\n </StyledButtonsWrapper>\n }\n </form>\n )\n}\n\nForm.propTypes = {\n intl: PropTypes.object.isRequired,\n initializeForm: PropTypes.func.isRequired,\n handleSubmit: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n formDefinition: PropTypes.object.isRequired,\n submitting: PropTypes.bool.isRequired,\n cancelText: PropTypes.string,\n submitText: PropTypes.string,\n noButtons: PropTypes.bool,\n formValues: PropTypes.object,\n form: PropTypes.string,\n mappingType: PropTypes.oneOf(['editable', 'search', 'readonly']),\n mode: PropTypes.oneOf(['list', 'detail', 'create', 'update', 'search'])\n}\n\nexport default reduxForm({form: REDUX_FORM_NAME, destroyOnUnmount: false})(Form)\n","import Form from './Form'\n\nexport default Form\n","import {connect} from 'react-redux'\nimport {form} from 'tocco-app-extensions'\nimport {injectIntl} from 'react-intl'\n\nimport Form from '../../src/components/Form'\nimport {initializeForm, submit, cancel} from '../modules/simpleForm/actions'\n\nconst mapActionCreators = {\n initializeForm,\n onSubmit: submit,\n onCancel: cancel\n}\n\nconst mapStateToProps = (state, props) => ({\n noButtons: state.input.noButtons,\n title: state.input.title,\n description: state.input.description,\n submitText: state.input.submitText,\n cancelText: state.input.cancelText,\n formDefinition: state.input.form,\n validate: state.input.validate !== false ? form.syncValidation(state.simpleForm.fieldDefinitions) : () => {},\n listApp: state.input.listApp,\n mappingType: state.input.mappingType,\n mode: state.input.mode\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Form))\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, externalEvents, formData, notification, actionEmitter, form} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {setFieldDefinitions} from './modules/simpleForm/actions'\nimport FormContainer from './containers/FormContainer'\nconst packageName = 'simple-form'\n\nconst EXTERNAL_EVENTS = [\n 'onSubmit',\n 'onCancel',\n 'onChange',\n 'emitAction'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <FormContainer listApp={input.listApp}/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n actionEmitter.addToStore(store, events.emitAction)\n externalEvents.addToStore(store, events)\n formData.addToStore(store, {data: input.formData, listApp: input.listApp})\n notification.addToStore(store, false)\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [\n setFieldDefinitions(form.getFieldDefinitions(input.form))\n ],\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n return app\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n \n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass SimpleFormApp extends React.Component {\n constructor(props) {\n super(props)\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initApp('id', props, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nSimpleFormApp.propTypes = {\n hideButton: PropTypes.bool,\n submitText: PropTypes.string,\n cancelText: PropTypes.string,\n form: PropTypes.object.isRequired,\n validate: PropTypes.bool,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n defaultValues: PropTypes.object\n}\n\nexport default SimpleFormApp\n","import {css} from 'styled-components'\n\nimport {declareFont, theme} from '../utilStyles'\n\nexport const linkStyle = css`\n ${declareFont()}\n color: ${theme.color('text')};\n\n * {\n color: ${theme.color('text')};\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:hover,\n &:hover *,\n &:focus,\n &:focus * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:active,\n &:active * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n`\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport {linkStyle} from './linkStyle'\n\nexport default styled(Link)`\n ${linkStyle}\n`\n","/* stylelint-disable no-descending-specificity */\nimport styled from 'styled-components'\n\nimport {AdminLink as StyledLink} from '../AdminLink'\nimport {theme} from '../utilStyles'\n\nexport const StyledBreadcrumbs = styled.div`\n background-color: ${props => props.backgroundColor || theme.color('backgroundBreadcrumbs')(props)};\n width: 100%;\n padding: .8rem 1.7rem;\n position: relative;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n\n span:nth-child(even) {\n margin-left: .9rem;\n margin-right: .9rem;\n }\n`\n\nexport const StyledBreadcrumbsLink = styled(StyledLink)`\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n\n & * {\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n margin-right: .5rem;\n }\n\n &:hover,\n &:hover * {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus,\n &:active,\n &:focus *,\n &:active * {\n color: ${theme.color('primary')};\n }\n`\n\n// noinspection Stylelint\nexport const StyledBreadcrumbsTitle = styled.span`\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n\n & * {\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n margin-right: .5rem;\n }\n\n &:active * {\n color: ${theme.color('primary')};\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Helmet} from 'react-helmet'\n\nimport Icon from '../Icon'\nimport Typography from '../Typography'\nimport {\n StyledBreadcrumbs,\n StyledBreadcrumbsLink,\n StyledBreadcrumbsTitle\n} from './StyledBreadcrumbs'\n\nconst getTitle = breadcrumbsInfo =>\n breadcrumbsInfo\n .slice(breadcrumbsInfo.length - 2)\n .map(breadcrumb => breadcrumb.title || breadcrumb.display)\n .reverse()\n .join(' - ')\n\nconst Breadcrumbs = ({pathPrefix, breadcrumbsInfo, currentView, backgroundColor, onClick}) => {\n const breadcrumbs = [\n ...(breadcrumbsInfo || []),\n ...(currentView ? [currentView] : [])\n ]\n\n if (breadcrumbs.length === 0) {\n return null\n }\n\n const handleClick = breadcrumbsItem => () => {\n if (onClick) {\n onClick(breadcrumbsItem)\n }\n }\n\n return <StyledBreadcrumbs backgroundColor={backgroundColor}>\n <Helmet defer={false}>\n <title>{getTitle(breadcrumbs)}</title>\n </Helmet>\n <div> {\n breadcrumbs.map((b, idx) => {\n const display = b.display || ''\n const Comp = idx === breadcrumbs.length - 1 ? StyledBreadcrumbsTitle : StyledBreadcrumbsLink\n return <Typography.Span key={`breadcrumbItem-${idx}`}>\n <Comp\n neutral=\"true\"\n {...(idx === breadcrumbs.length - 1 && {active: 'true'})}\n {...(typeof b.path !== 'undefined' ? {to: `${pathPrefix}/${b.path}`} : {})}\n onClick={handleClick(b)}\n >\n {b.type === 'list' && <Icon icon=\"list\"/>}\n {b.type === 'error' && <Icon icon=\"exclamation-circle\"/>}\n {display}\n </Comp>\n </Typography.Span>\n })\n .reduce((prev, curr, idx) =>\n [prev,\n <Typography.Span key={'icon' + idx}> <Icon icon=\"chevron-right\"/> </Typography.Span>,\n curr]\n )}\n </div>\n </StyledBreadcrumbs>\n}\n\nBreadcrumbs.defaultProps = {\n pathPrefix: ''\n}\n\nBreadcrumbs.propTypes = {\n pathPrefix: PropTypes.string,\n match: PropTypes.object,\n breadcrumbsInfo: PropTypes.arrayOf(\n PropTypes.shape({\n display: PropTypes.string,\n title: PropTypes.string,\n path: PropTypes.string,\n type: PropTypes.string\n })\n ),\n currentView: PropTypes.shape({\n display: PropTypes.string,\n title: PropTypes.string\n }),\n backgroundColor: PropTypes.string,\n onClick: PropTypes.func\n}\n\nexport default Breadcrumbs\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledButtonGroup from './StyledButtonGroup'\n\n/**\n * Wrap a Button into a ButtonGroup to control flow and style.\n */\nconst ButtonGroup = React.forwardRef((props, ref) => (\n <StyledButtonGroup ref={ref}>\n {props.children}\n </StyledButtonGroup>\n))\n\nButtonGroup.propTypes = {\n /**\n * List of true buttons morphs into a split button. Default value is 'false'.\n */\n children: PropTypes.node\n}\n\nexport default ButtonGroup\n","import styled from 'styled-components'\n\nimport {StyledButton} from '../Button'\n\nconst StyledButtonGroup = styled.div`\n display: flex;\n\n &&& > ${StyledButton} {\n :not(:first-child) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n :not(:last-child) {\n margin-right: 0;\n border-right: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n`\n\nexport default StyledButtonGroup\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\n\nimport Ball from '../Ball'\n\nconst ClearIndicator = props => {\n const msg = id => props.intl.formatMessage({id})\n\n return (\n <span {...props.innerProps}>\n <Ball\n icon=\"times\"\n tabIndex={-1}\n aria-label={msg('client.component.select.clearFieldLabel')}\n />\n </span>\n )\n}\n\nClearIndicator.propTypes = {\n innerProps: PropTypes.object,\n intl: PropTypes.object.isRequired\n}\n\nexport default injectIntl(ClearIndicator)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\n\nimport Ball from '../Ball'\n\nconst DropdownIndicator = props => {\n return !props.selectProps.isDisabled && <components.DropdownIndicator {...props}>\n <Ball\n icon={props.selectProps.menuIsOpen ? 'chevron-up' : 'chevron-down'}\n tabIndex={-1}\n />\n </components.DropdownIndicator>\n}\n\nDropdownIndicator.propTypes = {\n immutable: PropTypes.bool,\n selectProps: PropTypes.shape({\n menuIsOpen: PropTypes.bool,\n isDisabled: PropTypes.bool\n })\n}\n\nexport default DropdownIndicator\n","import React from 'react'\nimport {components} from 'react-select'\nimport PropTypes from 'prop-types'\n\nimport Ball from '../Ball'\nimport {StyledIndicatorsContainerWrapper} from './StyledComponents'\n\nconst handleAdvancedSearch = (openAdvancedSearch, value) => event => {\n openAdvancedSearch(value)\n event.stopPropagation()\n}\n\nconst handleCreate = openCreate => event => {\n openCreate()\n event.stopPropagation()\n}\n\nconst IndicatorsContainer = props => {\n const {openAdvancedSearch, openRemoteCreate, isDisabled, createPermission} = props.selectProps\n\n return (\n <StyledIndicatorsContainerWrapper>\n <components.IndicatorsContainer {...props}>\n {props.children}\n {openAdvancedSearch\n && !isDisabled\n && <span\n onTouchEnd={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n onMouseUp={handleAdvancedSearch(openAdvancedSearch, props.value)}>\n <Ball\n icon=\"search\"\n tabIndex={-1}\n />\n </span>}\n {createPermission\n && !isDisabled\n && <span\n onTouchEnd={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n onMouseUp={handleCreate(openRemoteCreate)}>\n <Ball\n icon=\"plus\"\n tabIndex={-1}\n />\n </span>}\n </components.IndicatorsContainer>\n </StyledIndicatorsContainerWrapper>\n )\n}\n\nconst ItemPropType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired,\n display: PropTypes.string\n})\n\nIndicatorsContainer.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n openAdvancedSearch: PropTypes.func,\n openRemoteCreate: PropTypes.func,\n isDisabled: PropTypes.bool,\n createPermission: PropTypes.bool\n }),\n value: PropTypes.oneOfType([\n ItemPropType,\n PropTypes.arrayOf(ItemPropType)\n ])\n}\n\nexport default IndicatorsContainer\n","import React from 'react'\n\nimport LoadingSpinner from '../LoadingSpinner'\n\nconst LoadingIndicator = () => <span><LoadingSpinner size=\"1.8rem\"/></span>\n\nexport default LoadingIndicator\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport _omit from 'lodash/omit'\n\nimport {StyledTether, StyledMenu} from './StyledComponents'\n\nconst TetherPosition = () => <div/>\n\nconst Menu = props => (\n <StyledTether\n attachment=\"top left\"\n targetAttachment=\"bottom left\"\n constraints={[{\n to: 'window',\n attachment: 'together'\n }]}\n >\n <TetherPosition/>\n <div>\n <StyledMenu\n {...(_omit(props, ['innerRef']))}\n wrapperWidth={props.selectProps.wrapperWidth}\n wrapperHeight={props.selectProps.wrapperHeight}>\n {props.children}\n </StyledMenu>\n </div>\n </StyledTether>\n)\n\nMenu.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n wrapperHeight: PropTypes.number,\n wrapperWidth: PropTypes.number\n })\n}\n\nexport default Menu\n","import React from 'react'\nimport {components} from 'react-select'\nimport PropTypes from 'prop-types'\n\nimport {StyledMoreOptionsAvailable} from './StyledComponents'\n\nconst MenuList = props => {\n const {selectProps, children, theme} = props\n const {moreOptionsAvailable, moreOptionsAvailableText} = selectProps\n return (\n <components.MenuList {...props}>\n {children}\n {moreOptionsAvailable\n && <StyledMoreOptionsAvailable reactSelectTheme={theme}>\n {moreOptionsAvailableText}\n </StyledMoreOptionsAvailable>\n }\n </components.MenuList>\n )\n}\n\nMenuList.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string\n }),\n theme: PropTypes.object\n}\n\nexport default MenuList\n","import styled from 'styled-components'\n\nexport default styled.span`\n pointer-events: auto;\n cursor: pointer;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\nimport _get from 'lodash/get'\nimport {html} from 'tocco-util'\n\nimport Popover from '../Popover'\nimport ClickableWrapper from './ClickableWrapper'\n\nexport const MultiValueLabel = props => {\n const {data} = props\n const {tooltips, loadTooltip, DetailLink} = props.selectProps\n const tooltip = _get(tooltips, data.key, null)\n\n const content = DetailLink\n ? <ClickableWrapper onMouseDown={e => {\n e.stopPropagation()\n e.preventDefault()\n }}>\n <DetailLink entityKey={data.key}><components.MultiValueLabel {...props}/></DetailLink>\n </ClickableWrapper>\n : <components.MultiValueLabel {...props}/>\n\n return (\n <Popover content={tooltip ? <div dangerouslySetInnerHTML={{__html: html.sanitizeHtml(tooltip)}}/> : null}>\n <span onMouseOver={() => loadTooltip && !tooltip && loadTooltip(data.key)}>\n {content}\n </span>\n </Popover>\n )\n}\n\nMultiValueLabel.propTypes = {\n data: PropTypes.object,\n selectProps: PropTypes.shape({\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.elementType\n })\n}\n\nexport default MultiValueLabel\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\nimport _get from 'lodash/get'\nimport {html} from 'tocco-util'\n\nimport Popover from '../Popover'\nimport ClickableWrapper from './ClickableWrapper'\nimport {StyledSingleValueWrapper} from './StyledComponents'\n\nexport const SingleValue = props => {\n const {\n data,\n selectProps,\n isDisabled,\n children\n } = props\n const {\n tooltips,\n loadTooltip,\n DetailLink\n } = selectProps\n const tooltip = _get(tooltips, data.key, null)\n const content = DetailLink\n ? <ClickableWrapper onMouseDown={e => {\n e.stopPropagation()\n e.preventDefault()\n }}>\n <DetailLink entityKey={data.key}>{children}</DetailLink>\n </ClickableWrapper>\n : children\n\n return (\n <components.SingleValue {...props}>\n <StyledSingleValueWrapper\n onMouseOver={() => loadTooltip && !tooltip && loadTooltip(data.key)}\n isDisabled={isDisabled}\n >\n <Popover content={tooltip\n ? <div dangerouslySetInnerHTML={{__html: html.sanitizeHtml(tooltip)}}/>\n : null}>\n {content}\n </Popover>\n </StyledSingleValueWrapper>\n </components.SingleValue>\n )\n}\n\nSingleValue.propTypes = {\n children: PropTypes.node,\n data: PropTypes.object,\n isDisabled: PropTypes.bool,\n selectProps: PropTypes.shape({\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.func\n })\n}\n\nexport default SingleValue\n","import PropTypes from 'prop-types'\nimport React, {useRef} from 'react'\nimport ReactSelect from 'react-select'\nimport _debounce from 'lodash/debounce'\nimport {withTheme} from 'styled-components'\n\nimport ClearIndicator from './ClearIndicator'\nimport DropdownIndicator from './DropdownIndicator'\nimport IndicatorsContainer from './IndicatorsContainer'\nimport LoadingIndicator from './LoadingIndicator'\nimport Menu from './Menu'\nimport MenuList from './MenuList'\nimport MultiValueLabel from './MultiValueLabel'\nimport SingleValue from './SingleValue'\nimport {reactSelectStyles, reactSelectTheme} from './StyledComponents'\n\nconst SEARCH_DEBOUNCE = 300\n\n/**\n * To select between multiple options. Loading of options and so on are remotely controlled.\n */\nconst Select = ({\n fetchOptions,\n id,\n immutable,\n isLoading,\n isMulti,\n loadTooltip,\n moreOptionsAvailable,\n moreOptionsAvailableText,\n noResultsText,\n onChange,\n openAdvancedSearch,\n options,\n searchOptions,\n theme,\n tooltips,\n value,\n DetailLink,\n createPermission,\n openRemoteCreate\n}) => {\n const selectComponent = useRef(null)\n const selectWrapper = useRef(null)\n\n const getOptions = () => [...(options || [])]\n\n const handleInputChange = (searchTerm, event) => {\n if (searchOptions && searchTerm) {\n debouncedSearchOptions(searchTerm)\n }\n if (searchTerm === '' && event.action === 'input-change') {\n fetchOptions()\n }\n }\n\n const handleMenuOpen = () => {\n if (fetchOptions) {\n fetchOptions()\n }\n }\n\n const debouncedSearchOptions\n = searchOptions ? _debounce(searchOptions, SEARCH_DEBOUNCE) : () => {}\n\n const wrapperWidth = selectWrapper.current ? selectWrapper.current.clientWidth : 300\n const wrapperHeight = selectWrapper.current ? selectWrapper.current.clientHeight : 35\n\n return (\n <div\n tabIndex=\"-1\"\n id={id}\n onFocus={() => {\n selectComponent.current.focus()\n }}\n style={{\n outlineStyle: 'none',\n cursor: immutable ? 'not-allowed' : 'default'\n }}>\n <div ref={selectWrapper} style={{outlineStyle: 'none'}}>\n <ReactSelect\n getOptionLabel={option => option.display}\n getOptionValue={option => option.key}\n wrapperWidth={wrapperWidth}\n wrapperHeight={wrapperHeight}\n components={{\n ClearIndicator,\n LoadingIndicator,\n DropdownIndicator: DropdownIndicator,\n IndicatorsContainer: IndicatorsContainer,\n IndicatorSeparator: null,\n Menu: Menu,\n MenuList: MenuList,\n MultiValueLabel,\n SingleValue\n }}\n noOptionsMessage={() => (noResultsText || ' - ')}\n isMulti={isMulti}\n closeMenuOnSelect={!isMulti}\n isSearchable\n {...(searchOptions ? {filterOption: () => (true)} : {})}\n isClearable\n loadingMessage={() => null}\n placeholder=\"\"\n menuShouldScrollIntoView={false}\n autoFocus={false}\n value={value || null}\n onChange={onChange}\n onInputChange={handleInputChange}\n options={getOptions()}\n isLoading={isLoading}\n isDisabled={immutable}\n ref={selectComponent}\n onMenuOpen={handleMenuOpen}\n styles={reactSelectStyles(theme)}\n theme={themeSelect => reactSelectTheme(themeSelect, theme)}\n loadTooltip={loadTooltip}\n tooltips={tooltips}\n DetailLink={DetailLink}\n openAdvancedSearch={openAdvancedSearch}\n moreOptionsAvailable={moreOptionsAvailable}\n moreOptionsAvailableText={moreOptionsAvailableText}\n blurInputOnSelect={false}\n createPermission={createPermission}\n openRemoteCreate={openRemoteCreate}\n />\n </div>\n </div>\n )\n}\n\nconst ItemPropType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired,\n display: PropTypes.string\n})\n\nSelect.propTypes = {\n /**\n * If one more multiple values can be selected\n */\n isMulti: PropTypes.bool,\n /**\n * Callback function on change event. Passes the new value as first parameter.\n */\n onChange: PropTypes.func,\n /**\n * Expects an array or single object containing a display and key attribute.\n */\n value: PropTypes.oneOfType([\n ItemPropType,\n PropTypes.arrayOf(ItemPropType)\n ]),\n /**\n * Possible options that the user can select\n */\n options: PropTypes.arrayOf(ItemPropType),\n /**\n * Callback to load options (is invoked on focus)\n */\n fetchOptions: PropTypes.func,\n /**\n * Callback to load options if the user types into to select. The search value is passed as first parameter.\n */\n searchOptions: PropTypes.func,\n /**\n * Can be set to true while loading the options. Shows a loading indicator.\n */\n isLoading: PropTypes.bool,\n /**\n * Wil be displayed if no options are left to choose from.\n */\n noResultsText: PropTypes.string,\n /**\n * If true, a disabled option is appended that says that not all options are shown.\n */\n moreOptionsAvailable: PropTypes.bool,\n /**\n * Text that is shown if moreOptionsAvailable is true.\n */\n moreOptionsAvailableText: PropTypes.string,\n /**\n * If defined a button is shown next to the select box that invokes this callback.\n */\n openAdvancedSearch: PropTypes.func,\n /**\n * Component that allows to render a <Link> around the value label for navigation purposes.\n * First parameter is the key of the value, the second parameter is the value node itself / child.\n *\n * e.g.\n * ({entityKey, children}) => <a href={`/${key}`} target=\"_blank\" rel=\"noopener noreferrer\">{children}</a>\n */\n DetailLink: PropTypes.func,\n /**\n * Theme provided by styled-components ThemeProvider.\n */\n theme: PropTypes.object,\n /**\n * Object containing tooltips with the key as attribute name.\n */\n tooltips: PropTypes.objectOf(PropTypes.string),\n /**\n * Callback to enhance tooltip object with new tooltips.\n */\n loadTooltip: PropTypes.func,\n /**\n * Whether the user can edit the value or not.\n */\n immutable: PropTypes.bool,\n /**\n * Id of outter element\n */\n id: PropTypes.string,\n /**\n * Open menu with click on input field\n */\n openMenuOnClick: PropTypes.bool,\n /**\n * Whether a new option may be created\n */\n createPermission: PropTypes.bool,\n /**\n * Opens a modal with a create form\n */\n openRemoteCreate: PropTypes.func\n}\n\nexport default withTheme(Select)\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst SingleSelect = props => (\n <Select\n id={props.id}\n immutable={props.immutable}\n isMulti={false}\n onChange={props.onChange}\n value={props.value}\n openMenuOnClick\n {...props.options}\n />\n)\n\nSingleSelect.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n }),\n options: PropTypes.shape({\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n })),\n fetchOptions: PropTypes.func,\n noResultsText: PropTypes.string,\n isLoading: PropTypes.bool,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default SingleSelect\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst MultiSelect = props => (\n <Select\n id={props.id}\n isMulti={true}\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n openMenuOnClick\n {...props.options}\n />\n)\n\nMultiSelect.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.array,\n options: PropTypes.shape({\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n })),\n fetchOptions: PropTypes.func,\n isLoading: PropTypes.bool,\n noResultsText: PropTypes.string,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default MultiSelect\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledStringEdit = styled.input.attrs(props => ({\n type: 'text'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledStringEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledStringEdit from './StyledStringEdit'\n\nconst StringEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledStringEdit\n disabled={props.immutable}\n id={props.id}\n name={props.name}\n onChange={e => props.onChange(e.target.value)}\n immutable={props.immutable}\n value={props.value || ''}\n />\n </StyledEditableWrapper>\n\nStringEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(StringEdit)\n","import {isSafari} from './userAgent'\n\nexport default {isSafari}\n","export const isSafari = () => {\n const userAgent = navigator?.userAgent || ''\n return /^((?!chrome|android).)*safari/i.test(userAgent)\n}\n","import styled, {css} from 'styled-components'\n\nimport {StyledInputCss} from '../EditableValue/StyledEditableValue'\n\nconst StyledText = css`\n ${StyledInputCss}\n width: 100%;\n grid-area: 1 / 1 / 2 / 2;\n max-height: 25rem;\n box-sizing: border-box;\n`\n\nexport const StyledSizeWrapper = styled.div`\n display: grid;\n width: 100%;\n\n &:after {\n content: attr(data-replicated-value) ' ';\n white-space: pre-wrap;\n word-break: break-all;\n visibility: hidden;\n ${StyledText}\n\n /* prevent scrollbar on Firefox */\n padding-right: 15px;\n }\n`\n\nexport const StyledTextarea = styled.textarea`\n ${StyledText}\n resize: none;\n margin: 0;\n min-height: 4em;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {userAgent} from 'tocco-util'\n\nimport {StyledSizeWrapper, StyledTextarea} from './StyledComponents'\n\nconst TextareaAutosize = ({value, onChange, name, id, disabled, immutable}) => (\n <StyledSizeWrapper\n // remove autosize feature for safari to be able to type fluently\n data-replicated-value={userAgent.isSafari() ? '' : value}\n >\n <StyledTextarea\n value={value}\n name={name}\n id={id}\n onChange={onChange}\n disabled={disabled}\n immutable={immutable}\n rows=\"1\"\n />\n </StyledSizeWrapper>\n)\n\nTextareaAutosize.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n immutable: PropTypes.bool\n}\n\nexport default TextareaAutosize\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport TextareaAutosize from '../../TextareaAutosize'\nimport {StyledEditableWrapper} from '../StyledEditableValue'\n\nconst TextEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <TextareaAutosize\n id={props.id}\n immutable={props.immutable}\n maxRows={20}\n name={props.name}\n onChange={e => props.onChange(e.target.value)}\n disabled={props.immutable}\n rows={2}\n value={props.value}\n />\n </StyledEditableWrapper>\n\nTextEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(TextEdit)\n","import styled from 'styled-components'\n\nimport {\n StyledEditableWrapperCss,\n StyledInputCss\n} from '../StyledEditableValue'\n\nexport const StyledDateAbstractInput = styled.input`\n &&& {\n ${StyledInputCss}\n }\n`\n\nexport const StyledDateAbstractOuterWrapper = styled.div`\n outline: ${({immutable}) => immutable ? 0 : 'initial'};\n`\n\nexport const StyledDateAbstractWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n\n input {\n display: ${({immutable}) => immutable ? 'none' : 'block'};\n\n &:last-of-type {\n display: ${({immutable}) => immutable ? 'block' : 'none'};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport _isEqual from 'lodash/isEqual'\nimport {withTheme} from 'styled-components'\nimport {js} from 'tocco-util'\n\nimport {theme} from '../../utilStyles'\nimport {\n StyledDateAbstractInput,\n StyledDateAbstractWrapper,\n StyledDateAbstractOuterWrapper\n} from './StyledDateAbstract'\nimport Ball from '../../Ball'\n\nclass DateAbstract extends React.Component {\n Flatpickr = null\n componentIsUnmounted = false\n\n constructor(props) {\n super(props)\n this.wrapper = React.createRef()\n\n this.state = {altInput: ''}\n\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-flatpickr\" */ '!style-loader!css-loader!flatpickr/dist/themes/light.css')\n\n Promise.all([\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/de.js'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/fr.js'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/it.js')\n ]).then(response => {\n if (!this.componentIsUnmounted) {\n this.Flatpickr = response[0].default\n this.localeMap = {\n 'de-CH': response[1].German,\n 'de': response[1].German,\n 'fr': response[2].French,\n 'it': response[3].Italian\n }\n\n this.initializeFlatPickr()\n }\n })\n }\n\n msg = id => this.props.intl.formatMessage({id})\n\n initializeFlatPickr = flatpickr => {\n const locale = this.localeMap[this.props.intl.locale]\n\n this.options = {\n wrap: true,\n onChange: this.handleOnChange,\n altInput: true,\n altInputClass: '',\n clickOpens: !this.props.immutable,\n defaultDate: this.props.value,\n ...(locale ? {locale} : {}),\n ...(this.props.options ? this.props.options.flatpickrOptions : {})\n }\n\n this.flatpickr = new this.Flatpickr(this.wrapper.current, this.options)\n this.flatpickr.calendarContainer.classList.add('tocco-ui-theme')\n this.flatpickr.calendarContainer.style.fontFamily = theme.fontFamily('regular')(this.props)\n this.flatpickr.calendarContainer.addEventListener('keydown', this.handleConfirmKey)\n\n if (this.props.initialized) {\n this.props.initialized()\n }\n this.setState({altInput: this.flatpickr.altInput.value})\n }\n\n getLocale = localeCode => {\n if (this.localeMap) {\n let locale = this.localeMap[localeCode]\n\n // Fallback english\n if (!locale && this.Flatpickr) {\n locale = this.Flatpickr.l10ns.en\n }\n return locale\n }\n return null\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.Flatpickr && this.flatpickr) {\n const optionsDiff = js.difference(this.props.options.flatpickrOptions, prevProps.options.flatpickrOptions)\n if (Object.keys(optionsDiff).length > 0) {\n Object.entries(optionsDiff).forEach(([key, value]) => {\n this.flatpickr.set(key, value)\n })\n this.flatpickr.redraw()\n }\n\n if (!_isEqual(prevProps.intl.locale, this.props.intl.locale)) {\n const locale = this.getLocale(this.props.intl.locale)\n this.Flatpickr.localize(locale)\n this.flatpickr.set('locale', locale)\n this.flatpickr.redraw()\n }\n if (!_isEqual(prevProps.value, this.props.value)) {\n this.flatpickr.setDate(this.props.value, false)\n this.flatpickr.redraw()\n }\n }\n }\n\n componentWillUnmount() {\n this.componentIsUnmounted = true\n if (this.flatpickr) {\n this.flatpickr.destroy()\n }\n }\n\n handleOnChange = selectedDates => {\n const isoStrings = selectedDates.map(date => date.toISOString())\n this.setState({altInput: this.flatpickr.altInput.value})\n if (this.hasValue() || isoStrings.length !== 0) {\n this.props.onChange(isoStrings)\n }\n }\n\n hasValue = () => {\n return this.props.value && this.props.value.length > 0 && this.props.value.every(v => v)\n }\n\n handleOnBlur = () => {\n if (this.props.onBlur) {\n const altValue = this.flatpickr.altInput.value\n this.props.onBlur(altValue, this.flatpickr.selectedDates, r => this.flatpickr.setDate(r, true))\n }\n }\n\n focusInput() {\n // flatpickr add two input in the DOM. One for the actual value (hidden) and one for the altInput\n const inputElement = this.wrapper.current.querySelector('input.flatpickr-input:not([type=\"hidden\"])')\n if (inputElement) {\n inputElement.focus()\n }\n }\n\n handleConfirmKey = e => {\n if ((!e.target.classList.contains('flatpickr-hour') && e.key === 'Tab' && !e.shiftKey) || e.key === 'Enter') {\n this.focusInput()\n this.handleOnBlur()\n setTimeout(() => {\n this.flatpickr.close()\n })\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n }\n }\n\n render() {\n return (\n <>\n <StyledDateAbstractOuterWrapper\n immutable={this.props.immutable}\n id={this.props.id}\n tabIndex=\"-1\"\n onFocus={() => {\n this.focusInput()\n setTimeout(() => {\n if (this.flatpickr) {\n this.flatpickr.open()\n }\n })\n }}\n onKeyDown={this.handleConfirmKey}\n >\n <StyledDateAbstractWrapper\n data-wrap\n onBlur={this.handleOnBlur}\n immutable={this.props.immutable}\n ref={this.wrapper}\n >\n <StyledDateAbstractInput\n {...this.props.immutable ? {disabled: 'disabled'} : {}}\n type=\"text\"\n data-input\n immutable={this.props.immutable}\n {...(this.props.options ? {placeholder: this.props.options.placeholderText} : {})}\n />\n <StyledDateAbstractInput\n disabled\n immutable={this.props.immutable}\n value={this.state.altInput}\n />\n {!this.props.immutable && this.props.value.filter(i => i).length > 0 && <Ball\n icon=\"times\"\n tabIndex={-1}\n aria-label={this.msg('client.component.dateAbstract.clearDateLabel')}\n onMouseDown={e => {\n e.preventDefault()\n this.props.onChange(null)\n }}/>}\n </StyledDateAbstractWrapper>\n </StyledDateAbstractOuterWrapper>\n </>\n )\n }\n}\n\nDateAbstract.propTypes = {\n id: PropTypes.string,\n intl: PropTypes.object.isRequired,\n onBlur: PropTypes.func,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.arrayOf(PropTypes.string),\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n immutable: PropTypes.bool,\n initialized: PropTypes.func,\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default withTheme(injectIntl(DateAbstract))\n","import _forOwn from 'lodash/forOwn'\n\nexport const atMostOne = array => {\n if (!array || array.length === 0) {\n return null\n } else if (array.length === 1) {\n return array[0]\n } else {\n throw new Error(`Expected at most one item in array: ${array.join(', ')}`)\n }\n}\n\n/**\n * Get a date value as `YYYY-MM-DD` string representation.\n *\n * @param date Anything that the `Date` constructor accepts as single argument\n * @returns {string} The given date in format `YYYY-MM-DD`\n */\nexport const toLocalDateString = date => {\n if (date == null) {\n return null\n }\n\n const dateObj = new Date(date)\n\n const year = dateObj.getFullYear()\n const month = dateObj.getMonth() + 1 // getMonth() is zero-based\n const day = dateObj.getDate()\n\n return [\n year,\n (month > 9 ? '' : '0') + month,\n (day > 9 ? '' : '0') + day\n ].join('-')\n}\n\n/**\n * Converts the formatting string of momentJS to one compatible with flatpickr.\n * see: https://flatpickr.js.org/formatting/\n * @param format momentJS formatting string\n * @returns {string} flatpickr formatting string\n */\nexport const momentJStoToFlatpickrFormat = format => {\n const formattingMap = {\n d: 'DD',\n m: 'MM',\n Y: 'YYYY',\n K: 'A',\n H: 'HH',\n h: 'h',\n i: 'mm'\n }\n _forOwn(formattingMap, (v, k) => {\n format = format.replace(v, k)\n })\n return format\n}\n\n/*\n * Returns format separators provided by intl API.\n */\nexport const parseLocalePlaceholder = countryCode => {\n const thousandSeparator = (1111).toLocaleString(countryCode).replace(/1/g, '')\n const decimalSeparator = (1.1).toLocaleString(countryCode).replace(/1/g, '')\n\n return {thousandSeparator, decimalSeparator}\n}\n\n/*\n * String to number converter\n */\nexport const convertStringToNumber = stringValue => (\n !stringValue || isNaN(stringValue) ? null : parseFloat(stringValue)\n)\n\n/*\n * Convert two numbers as hours and minutes to milliseconds\n */\nexport const calculateMilliseconds = (hours, minutes) => {\n if (!hours && !minutes) {\n return null\n }\n const hoursMilliseconds = (hours || 0) * 60 * 60000\n const minutesMilliseconds = (minutes || 0) * 60000\n return hoursMilliseconds + minutesMilliseconds\n}\n\n/*\n * Return true if the value is null or undefined\n */\nexport const isNullOrUndefined = value => value === null || value === undefined\n\n/*\n * Return true if the value is null or undefined\n */\nexport const millisecondsToDuration = milliseconds => {\n if (!milliseconds && milliseconds !== 0) {\n return {hoursOfDay: 0, minutesOfHour: 0}\n }\n\n const hoursOfDay = Math.floor(milliseconds / (60 * 60 * 1000))\n const minutesOfHour = Math.floor((milliseconds - (hoursOfDay * (60 * 60 * 1000))) / (60 * 1000))\n return {hoursOfDay, minutesOfHour}\n}\n\n/*\n * Pad a string with leading zeros\n */\nexport const padLeadingZeros = (string, numberOfZeros) => {\n return string.length < numberOfZeros ? string.padStart(numberOfZeros, '0') : string\n}\n\n/*\n * Convert hour and minute numbers to time string of type HH:MM\n */\nexport const numbersToTimeFormat = (hours, minutes) => {\n if (!hours && !minutes) {\n if (hours !== 0 && minutes !== 0) {\n return '--:--'\n }\n }\n const hourString = hours ? hours.toString() : '00'\n const minuteString = minutes ? minutes.toString() : '00'\n\n const paddedHour = padLeadingZeros(hourString, 2)\n const paddedMinute = padLeadingZeros(minuteString, 2)\n\n return paddedHour + ':' + paddedMinute\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport moment from 'moment'\nimport {useIntl} from 'react-intl'\n\nimport DateAbstract from './DateAbstract'\nimport {atMostOne, toLocalDateString, momentJStoToFlatpickrFormat} from '../utils'\n\nexport const DateEdit = ({onChange, options, id, value, immutable, events}) => {\n const DATE_FORMAT = 'YYYY-MM-DD'\n const intl = useIntl()\n\n const getLocalizedAltFormat = () => moment().locale(intl.locale)._locale.longDateFormat('L')\n\n const parseDate = s => {\n const momentDate = moment(s, [getLocalizedAltFormat(), DATE_FORMAT])\n return momentDate.isValid() ? momentDate.toDate() : null\n }\n\n const handleChange = dates => {\n const dateTime = atMostOne(dates)\n const date = dateTime ? toLocalDateString(dateTime) : null\n onChange(date)\n }\n\n const onBlur = (dateString, values, setValue) => {\n const parsed = parseDate(dateString)\n if (values[0] - parsed !== 0) {\n setValue(parsed)\n }\n }\n\n const flatpickrOptions = {\n altFormat: momentJStoToFlatpickrFormat(getLocalizedAltFormat()),\n dateFormat: momentJStoToFlatpickrFormat(DATE_FORMAT),\n allowInput: true,\n parseDate: parseDate,\n ...(options ? options.flatpickrOptions : {})\n }\n\n return (\n <DateAbstract\n id={id}\n value={[value]}\n onBlur={onBlur}\n onChange={handleChange}\n options={{...options, flatpickrOptions}}\n immutable={immutable}\n events={events}\n />\n )\n}\n\nDateEdit.propTypes = {\n id: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default DateEdit\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport {injectIntl} from 'react-intl'\nimport moment from 'moment'\n\nimport DateAbstract from './DateAbstract'\nimport {atMostOne, momentJStoToFlatpickrFormat} from '../utils'\n\nexport const DateTimeEdit = props => {\n const momentDateFormat = moment().locale(props.intl.locale)._locale.longDateFormat('L')\n const momentTimeFormat = moment().locale(props.intl.locale)._locale.longDateFormat('LT')\n const altDateFormat = momentJStoToFlatpickrFormat(momentDateFormat)\n const altTimeFormat = momentJStoToFlatpickrFormat(momentTimeFormat)\n\n const parseDate = useMemo(() => s => {\n const momentDate = moment(s, ['D.M.YYYY H:m', momentDateFormat, momentTimeFormat])\n return momentDate.isValid() ? momentDate.toDate() : null\n }, [])\n\n const onBlur = (dateString, values, setValue) => {\n const parsed = parseDate(dateString)\n if (values[0] - parsed !== 0) {\n setValue(parsed)\n }\n }\n\n const flatpickrOptions = {\n enableTime: true,\n time_24hr: true,\n allowInput: true,\n parseDate: parseDate,\n altFormat: `${altDateFormat} ${altTimeFormat}`,\n dateFormat: 'Y-m-d\\\\TH:i:S.000\\\\Z',\n ...(props.options ? props.options.flatpickrOptions : {})\n }\n\n const handleChange = dates => props.onChange(atMostOne(dates))\n\n return (\n <DateAbstract\n value={[props.value]}\n onChange={handleChange}\n onBlur={onBlur}\n immutable={props.immutable}\n options={{...props.options, flatpickrOptions}}\n events={props.events}\n />\n )\n}\n\nDateTimeEdit.propTypes = {\n intl: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default injectIntl(DateTimeEdit)\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledTimeEdit = styled.input.attrs(props => ({\n type: 'time'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledTimeEdit\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Ball from '../../Ball'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledTimeEdit from './StyledTimeEdit'\n\nconst TimeEdit = props => {\n const handleChange = e => {\n props.onChange(e.target.value)\n }\n\n const clearInput = () => {\n props.onChange(null)\n }\n\n const isFirefox = !!window.sidebar\n\n const showClearButton = props.value && !props.immutable && !isFirefox\n\n const value = props.value || ''\n\n return (\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledTimeEdit\n disabled={props.immutable}\n id={props.id}\n immutable={props.immutable}\n name={props.name}\n onChange={handleChange}\n value={value}\n />\n {showClearButton && <StyledEditableControl>\n <Ball\n icon=\"times\"\n onClick={clearInput}\n tabIndex={-1}\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n )\n}\n\nTimeEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default TimeEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport styled from 'styled-components'\n\nconst StyledBoolEdit = styled.div`\n margin: 5px 0;\n`\n\nconst BoolEdit = props => {\n const handleChange = e => {\n if (props.onChange) {\n props.onChange(e.target.checked)\n }\n }\n\n return (\n <StyledBoolEdit>\n <input\n type=\"checkbox\"\n checked={props.value || false}\n name={props.name}\n onChange={handleChange}\n id={props.id}\n disabled={props.immutable}\n />\n </StyledBoolEdit>\n )\n}\n\nBoolEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.bool,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default BoolEdit\n","import styled from 'styled-components'\n\nimport {StyledButton} from '../Button'\nimport {scale} from '../utilStyles'\n\nexport const StyledView = styled.div`\n display: flex;\n justify-content: space-between;\n padding-top: ${scale.space(-2)};\n`\n\nexport const StyledButtonsWrapper = styled.div`\n display: flex;\n align-items: center;\n\n ${StyledButton} {\n margin: 0;\n border-radius: 50%;\n padding: ${scale.space(-2)};\n\n a:hover {\n color: unset;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {download} from 'tocco-util'\n\nimport Button from '../Button'\nimport Link from '../Link'\nimport Preview from '../Preview'\nimport {StyledView, StyledButtonsWrapper} from './StyledView'\n\nconst View = ({value, downloadTitle, immutable, onUpload, deleteTitle}) => {\n const isNotUploadedFile = value.binaryLink && value.binaryLink.startsWith('blob:')\n\n return (\n <StyledView className=\"StyledView\">\n <Preview\n alt={value.fileName}\n {...isNotUploadedFile && {caption: value.fileName}}\n fileName={value.fileName}\n maxDimensionX=\"96px\"\n maxDimensionY=\"96px\"\n srcUrl={value.binaryLink}\n thumbnailUrl={value.thumbnailLink}\n />\n <StyledButtonsWrapper>\n {!immutable\n && <Button\n icon=\"trash\"\n onClick={() => onUpload(null)}\n tabIndex={-1}\n title={deleteTitle || 'delete'}\n />\n }\n <Button>\n <Link\n neutral\n icon=\"arrow-to-bottom\"\n download={value.fileName}\n href={download.getDownloadUrl(value.binaryLink)}\n tabIndex={-1}\n title={downloadTitle || 'download'}\n />\n </Button>\n </StyledButtonsWrapper>\n </StyledView>\n )\n}\n\nView.propTypes = {\n immutable: PropTypes.bool,\n onUpload: PropTypes.func,\n value: PropTypes.shape({\n fileName: PropTypes.string.isRequired,\n binaryLink: PropTypes.string.isRequired,\n thumbnailLink: PropTypes.string,\n mimeType: PropTypes.string\n }).isRequired,\n deleteTitle: PropTypes.string,\n downloadTitle: PropTypes.string\n}\n\nexport default View\n","export const bytesToSize = bytes => {\n const units = ['Bytes', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(2) * 1} ${units[i]}`\n}\n","import styled from 'styled-components'\n\nimport {declareFont, scale} from '../utilStyles'\nimport {StyledSpan} from '../Typography'\n\nexport const StyledUploadProgress = styled.div`\n && {\n padding-top: ${scale.space(-2)};\n text-align: center;\n display: inline-block;\n }\n`\n\nexport const StyledUploadProgressText = styled(StyledSpan)`\n && {\n ${declareFont({fontSize: scale.font(-1)})}\n }\n`\n\nexport const StyledUploadProgressIconAndText = styled.div`\n && {\n display: flex;\n justify-content: center;\n align-items: center;\n\n span {\n margin-left: ${scale.space(-2)};\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Preview from '../Preview'\nimport {bytesToSize} from './helpers'\nimport LoadingSpinner from '../LoadingSpinner'\nimport {design} from '../utilStyles'\nimport {\n StyledUploadProgress,\n StyledUploadProgressIconAndText,\n StyledUploadProgressText\n} from './StyledUploadProgress'\n\nconst UploadProgress = props => (\n <StyledUploadProgress>\n <Preview\n caption={props.file.name}\n maxDimensionX=\"96px\"\n maxDimensionY=\"96px\"\n srcUrl={props.file.preview}\n thumbnailUrl={props.file.type.startsWith('image') ? props.file.preview : null}\n />\n <StyledUploadProgressIconAndText>\n <LoadingSpinner position={design.position.PREPEND}/>\n <StyledUploadProgressText>{props.text || 'uploading'} ({bytesToSize(props.file.size)})</StyledUploadProgressText>\n </StyledUploadProgressIconAndText>\n </StyledUploadProgress>\n)\n\nUploadProgress.propTypes = {\n text: PropTypes.string,\n file: PropTypes.shape({\n preview: PropTypes.string,\n size: PropTypes.number,\n type: PropTypes.string,\n name: PropTypes.string\n })\n}\n\nexport default UploadProgress\n","import styled from 'styled-components'\n\nimport {\n colorizeText,\n declareFont,\n scale,\n theme\n} from '../utilStyles'\n\nconst StyledUploadInput = styled.div`\n ${declareFont()}\n cursor: ${props => props.immutable ? 'not-allowed' : 'pointer'};\n background-color: ${theme.color('paper')};\n color: ${props => props.immutable ? colorizeText.shade2(props) : colorizeText.shade0(props)};\n padding: ${scale.space(-2)} 0 0 0;\n`\n\nexport default StyledUploadInput\n","import styled from 'styled-components'\nimport Dropzone from 'react-dropzone'\n\nimport {StyledButton} from '../Button'\nimport {scale} from '../utilStyles'\n\nexport const StyledIconWrapper = styled.div`\n ${StyledButton} {\n position: relative;\n top: -${scale.space(-3.1)};\n margin: 0;\n border-radius: 50%;\n padding: ${scale.space(-1.5)} ${scale.space(-2)};\n }\n`\n\nexport const StyledDropzone = styled(Dropzone)`\n position: relative;\n display: flex;\n justify-content: flex-end;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Button from '../Button'\nimport Icon from '../Icon'\nimport StyledUploadInput from './StyledUploadInput'\nimport {design} from '../utilStyles'\nimport {StyledDropzone, StyledIconWrapper} from './SyledUploadInput'\n\nconst UploadInput = ({onDrop: onDropProp, immutable, text}) => {\n const onDrop = files => onDropProp(files[0])\n\n return (\n <StyledUploadInput immutable={immutable}>\n <StyledDropzone\n disabled={immutable}\n multiple={false}\n onDrop={onDrop}\n title={text || 'drag and drop or click'}\n >\n <StyledIconWrapper>\n <Button>\n <Icon\n icon=\"arrow-to-top\"\n position={design.position.PREPEND}\n />\n </Button>\n </StyledIconWrapper>\n </StyledDropzone>\n </StyledUploadInput>\n )\n}\n\nUploadInput.propTypes = {\n immutable: PropTypes.bool,\n onDrop: PropTypes.func.isRequired,\n text: PropTypes.string\n}\n\nexport default UploadInput\n","import PropTypes from 'prop-types'\nimport React, {useState, useEffect} from 'react'\nimport _isEqual from 'lodash/isEqual'\n\nimport View from './View'\nimport UploadProgress from './UploadProgress'\nimport UploadInput from './UploadInput'\n\n/**\n * Component to upload files. If uploaded, the file will be displayed by the Preview component.\n */\nexport const Upload = props => {\n const {\n value,\n textResources,\n onUpload\n } = props\n const [states, setStates] = useState({\n isUploading: false,\n previewFile: null\n })\n\n const setUploadingState = file => {\n setStates({isUploading: true, previewFile: file})\n }\n\n const abortUploadingState = () => {\n setStates({isUploading: false, previewFile: null})\n }\n\n const onDrop = file => {\n setUploadingState(file)\n onUpload(file)\n }\n\n useEffect(() => {\n if (!_isEqual(value)) {\n abortUploadingState()\n }\n }, [value])\n\n if (value && value.binaryLink) {\n return <View {...props} deleteTitle={textResources.delete} downloadTitle={textResources.download}/>\n } else if (states.isUploading) {\n return <UploadProgress file={states.previewFile} text={textResources.uploading} {...props}/>\n }\n return <UploadInput {...props} onDrop={onDrop}/>\n}\n\nUpload.defaultProps = {\n textResources: {}\n}\n\nUpload.propTypes = {\n /**\n * Callback function if user uploads a file. Return the file {File}\n */\n onUpload: PropTypes.func.isRequired,\n /**\n * Object that contains the following\n */\n value: PropTypes.shape({\n fileName: PropTypes.string.isRequired,\n binaryLink: PropTypes.string.isRequired,\n thumbnailLink: PropTypes.string\n }),\n /**\n * Can user upload new files or just view existing\n */\n immutable: PropTypes.bool,\n /**\n * Allows to overwrite texts of the component\n */\n textResources: PropTypes.shape({\n uploading: PropTypes.string,\n delete: PropTypes.string,\n download: PropTypes.string\n })\n}\n\nexport default Upload\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Upload from '../../Upload'\n\nconst Document = props => {\n const onUpload = file => {\n if (file === null) {\n if (props.onChange) {\n props.onChange(null)\n }\n } else {\n if (props.options.upload) {\n props.options.upload(file)\n }\n }\n }\n\n return (\n <Upload\n onUpload={onUpload}\n immutable={props.immutable}\n textResources={{\n upload: props.options.uploadText,\n uploading: props.options.uploadingText,\n delete: props.options.deleteText,\n download: props.options.downloadText\n }}\n value={props.value ? props.value : null}\n />\n )\n}\n\nDocument.defaultProps = {\n options: {}\n}\n\nDocument.propTypes = {\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n upload: PropTypes.func.isRequired,\n uploadText: PropTypes.string,\n uploadingText: PropTypes.string,\n deleteText: PropTypes.string,\n downloadText: PropTypes.string\n }),\n onChange: PropTypes.func,\n value: PropTypes.object\n}\n\nexport default Document\n","import PropTypes from 'prop-types'\nimport React, {lazy, Suspense} from 'react'\nimport styled from 'styled-components'\nimport {html} from 'tocco-util'\n\nimport Typography, {declareTypograhpy} from '../../Typography'\n\nconst StyledHtmlEdit = styled.div`\n && {\n button {\n margin-bottom: 0;\n }\n\n .ql-editor {\n ${props => declareTypograhpy(props, 'quill')}\n\n &[contenteditable='false'] * {\n cursor: not-allowed;\n }\n }\n }\n`\n\nclass HtmlEdit extends React.Component {\n lazyQuill = null\n\n constructor(props) {\n super(props)\n\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-quill\" */ '!style-loader!css-loader!react-quill/dist/quill.snow.css')\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-quill\" */ '!style-loader!css-loader!react-quill/dist/quill.core.css')\n\n this.lazyQuill = lazy(() => import(/* webpackChunkName: \"vendor-quill\" */ 'react-quill'))\n }\n\n handleChange = (value, delta, source) => {\n if (this.props.onChange && source === 'user') {\n const v = value === '<p><br></p>' ? '' : value\n this.props.onChange(v)\n }\n }\n\n render() {\n if (this.props.immutable) {\n return <Typography.Span>\n <div dangerouslySetInnerHTML={{__html: html.sanitizeHtml(this.props.value)}}></div>\n </Typography.Span>\n }\n\n return (\n <StyledHtmlEdit>\n <Suspense fallback={<i/>}>\n <this.lazyQuill\n name={this.props.name}\n onChange={this.handleChange}\n id={this.props.id}\n theme=\"snow\"\n defaultValue={this.props.value}\n modules={{\n clipboard: {\n matchVisual: false\n }\n }}\n />\n </Suspense>\n </StyledHtmlEdit>\n )\n }\n}\n\nHtmlEdit.defaultProps = {\n value: ''\n}\n\nHtmlEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default HtmlEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst RemoteSelect = props => (\n <Select\n id={props.id}\n isMulti={false}\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nRemoteSelect.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n }),\n options: PropTypes.shape({\n options: PropTypes.array,\n fetchOptions: PropTypes.func,\n searchOptions: PropTypes.func,\n isLoading: PropTypes.bool,\n valueClick: PropTypes.func,\n clearValueText: PropTypes.string,\n searchPromptText: PropTypes.string,\n noResultsText: PropTypes.string,\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string,\n openAdvancedSearch: PropTypes.func,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.func,\n createPermission: PropTypes.bool\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default RemoteSelect\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst MultiRemoteSelect = props => (\n <Select\n id={props.id}\n isMulti\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nMultiRemoteSelect.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.arrayOf(\n PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n })\n ),\n options: PropTypes.shape({\n options: PropTypes.array,\n fetchOptions: PropTypes.func,\n searchOptions: PropTypes.func,\n openAdvancedSearch: PropTypes.func,\n isLoading: PropTypes.bool,\n valueClick: PropTypes.func,\n clearAllText: PropTypes.string,\n searchPromptText: PropTypes.string,\n noResultsText: PropTypes.string,\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.elementType\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default MultiRemoteSelect\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Select from '../../Select'\n\nconst SearchFilterEdit = props => (\n <Select\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nconst valueObjectType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired\n})\n\nSearchFilterEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.oneOfType([\n valueObjectType,\n PropTypes.arrayOf(valueObjectType)\n ]),\n options: PropTypes.shape({\n isMulti: PropTypes.bool,\n fetchOptions: PropTypes.func,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n }))\n }).isRequired,\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default SearchFilterEdit\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledUrlEdit = styled.input.attrs(props => ({\n type: 'url'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledUrlEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport Link from '../../Link'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledUrlEdit from './StyledUrlEdit'\n\nconst normalizeUrl = url => {\n url = url.toLowerCase()\n if (url.indexOf('.') > 0 && !/^[a-z0-9]+:\\/\\//.test(url)) {\n url = `https://${url}`\n }\n\n return url\n}\n\nconst UrlEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledUrlEdit\n disabled={props.immutable}\n id={props.id}\n immutable={props.immutable}\n name={props.name}\n onChange={e => props.onChange(normalizeUrl(e.target.value))}\n value={props.value}\n />\n {props.value && <StyledEditableControl>\n <Link\n href={props.value}\n icon=\"external-link\"\n look=\"ball\"\n tabIndex={-1}\n target=\"_blank\"\n neutral\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n\nUrlEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(UrlEdit)\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledPhoneEdit = styled.input.attrs(props => ({\n type: 'tel'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledPhoneEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport _isEmpty from 'lodash/isEmpty'\nimport _get from 'lodash/get'\n\nimport Link from '../../Link'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledPhoneEdit from './StyledPhoneEdit'\n\nclass PhoneEdit extends React.Component {\n componentIsUnmounted = false\n FALLBACK_DEFAULT_COUNTRY = 'CH'\n\n constructor(props) {\n super(props)\n const defaultCountry = _get(props, 'options.defaultCountry') || this.FALLBACK_DEFAULT_COUNTRY\n this.state = {libPhoneImport: null, defaultCountry}\n this.importLibPhoneNumber()\n this.inputElement = React.createRef()\n }\n\n async importLibPhoneNumber() {\n const libPhoneImport = await import(/* webpackChunkName: \"vendor-libphonenumber-js\" */ 'libphonenumber-js')\n if (!this.componentIsUnmounted) {\n this.setState({...this.state, libPhoneImport})\n }\n }\n\n componentWillUnmount() {\n this.componentIsUnmounted = true\n }\n\n amountOfSpacesBeforeCaret = (str, caretPosition) => {\n const spaces = str.substring(0, caretPosition - 1).match(/\\s/g)\n return spaces ? spaces.length : 0\n }\n\n repositionCaret = (value, previousValue, caretPosition) => {\n if (caretPosition && value.length !== caretPosition) {\n const previousFormatted = new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(previousValue)\n const currentFormatted = new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(value)\n\n const spacesPrevious = this.amountOfSpacesBeforeCaret(previousFormatted, caretPosition)\n const spacesCurrent = this.amountOfSpacesBeforeCaret(currentFormatted, caretPosition)\n\n const offset = spacesCurrent - spacesPrevious\n\n window.requestAnimationFrame(function() {\n const start = caretPosition + offset\n this.setSelectionRange(start, start)\n }.bind(this.inputElement.current))\n }\n }\n\n removeSpaces = str => str.replace(/\\s/g, '')\n\n handleChange = e => {\n const newValue = e.target.value\n const {libPhoneImport} = this.state\n const parsedNumber = libPhoneImport ? libPhoneImport.parseNumber(newValue, this.state.defaultCountry) : newValue\n\n const valueNormalized = _isEmpty(parsedNumber)\n ? this.removeSpaces(new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(newValue))\n : libPhoneImport.formatNumber(parsedNumber, 'E.164')\n\n this.props.onChange(valueNormalized)\n\n const currentCaretPosition = e.target.selectionStart\n this.repositionCaret(newValue, this.props.value, currentCaretPosition)\n }\n\n determineDisplayValue = () => {\n if (this.props.value && this.state.libPhoneImport && this.state.libPhoneImport.AsYouType) {\n return new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(this.props.value)\n }\n\n return this.props.value || ''\n }\n\n render() {\n const displayValue = this.determineDisplayValue()\n\n return (\n <StyledEditableWrapper immutable={this.props.immutable}>\n <StyledPhoneEdit\n disabled={this.props.immutable || !this.state.libPhoneImport}\n id={this.props.id}\n name={name}\n onChange={this.handleChange}\n immutable={this.props.immutable || !this.state.libPhoneImport}\n ref={this.inputElement}\n value={displayValue}\n />\n {displayValue && <StyledEditableControl>\n <Link\n href={`tel:${this.props.value}`}\n icon=\"phone\"\n tabIndex={-1}\n neutral\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n )\n }\n}\n\nPhoneEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n defaultCountry: PropTypes.string,\n customPhoneRegex: PropTypes.string\n })\n}\n\nexport default PhoneEdit\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n generateDisabledShade,\n scale,\n theme\n} from '../../utilStyles'\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledDurationEdit = styled.input`\n && {\n ${StyledInputCss}\n flex-grow: 0;\n min-width: 1ch;\n }\n`\n\nconst StyledDurationEditFocusable = styled.label`\n &&& {\n align-items: center;\n display: flex;\n flex-wrap: nowrap;\n margin-bottom: 0; /* reset bootstrap */\n\n &:first-child {\n margin-right: ${scale.space(-1)};\n }\n\n > span {\n color: ${props => props.immutable\n ? generateDisabledShade(_get(props.theme, 'colors.text'))\n : theme.color('text')};\n cursor: ${props => props.immutable ? 'not-allowed' : 'default'};\n }\n }\n`\n\nconst StyledDurationEditShadow = styled.span`\n && {\n border: 1px solid transparent;\n left: 0;\n max-width: 100%;\n overflow: hidden;\n position: absolute;\n z-index: -1;\n visibility: hidden;\n }\n`\n\nexport {\n StyledDurationEditShadow,\n StyledDurationEditFocusable,\n StyledDurationEdit\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {calculateMilliseconds} from '../utils'\nimport Typography from '../../Typography'\nimport {\n StyledDurationEditShadow,\n StyledDurationEditFocusable,\n StyledDurationEdit\n} from './StyledDurationEdit'\nimport {StyledEditableWrapper} from '../StyledEditableValue'\n\nclass DurationEdit extends React.Component {\n constructor(props) {\n super(props)\n this.hoursShadow = React.createRef()\n this.minutesShadow = React.createRef()\n this.state = {\n ...this.millisecondsToDuration(props.value),\n showUnits: props.value >= 0\n }\n }\n\n millisecondsToDuration = milliSeconds => {\n if (!milliSeconds && milliSeconds !== 0) {\n return {hours: '', minutes: ''}\n }\n\n const minutes = parseInt((milliSeconds / (1000 * 60)) % 60)\n const hours = parseInt((milliSeconds / (1000 * 60 * 60)) % 24)\n return {hours, minutes}\n }\n\n componentDidMount = () => {\n this.setState({\n hoursWidth: this.hoursShadow.current.offsetWidth,\n minutesWidth: this.minutesShadow.current.offsetWidth\n })\n }\n\n componentDidUpdate = (prevProps, prevState) => {\n if (this.state.hours !== prevState.hours) {\n this.setState({hoursWidth: this.hoursShadow.current.offsetWidth})\n }\n if (this.state.minutes !== prevState.minutes) {\n this.setState({minutesWidth: this.minutesShadow.current.offsetWidth})\n }\n }\n\n handleHourChange = e => {\n const hours = e.target.value.replace(/[^-\\d]/g, '')\n this.setState({...this.state, hours})\n this.handleChange(hours, null)\n }\n\n getDesiredInputInMinutes = target => {\n let minutes = target.value.replace(/[^-\\d]/g, '')\n\n if (!target.validity.valid) {\n minutes = 0\n }\n\n if (`${minutes}`.length > 2) {\n minutes = `${minutes}`.slice(0, 2)\n }\n\n if (minutes > 59) {\n minutes = 0\n }\n\n if (minutes < 0) {\n minutes = 59\n }\n\n return minutes\n }\n\n handleMinutesChange = e => {\n const minutes = this.getDesiredInputInMinutes(e.target)\n this.setState({...this.state, minutes})\n\n this.handleChange(null, minutes)\n\n if (minutes.toString().length === 2 || minutes === 0) {\n e.target.select()\n }\n }\n\n handleChange = (hours, minutes) => {\n const minutesValue = minutes !== null ? minutes : this.state.minutes\n const hoursValue = (hours !== null ? hours : this.state.hours)\n if (minutesValue === '' && hoursValue === '') {\n this.props.onChange(null)\n return\n }\n this.props.onChange(calculateMilliseconds(hoursValue, minutesValue))\n }\n\n handleOnBlur = () => this.setState({\n showUnits:\n (this.state.hours.toString().length >= 1 || this.state.minutes.toString().length >= 1)\n })\n\n handleOnFocus = () => this.setState({showUnits: true})\n\n preventNonNumeric = event => {\n if (!(event.charCode >= 48 && event.charCode <= 57)) {\n event.preventDefault()\n }\n }\n\n render() {\n return (\n <StyledEditableWrapper\n onBlur={this.handleOnBlur}\n immutable={this.props.immutable}\n style={{overflowX: 'auto'}}>\n <StyledDurationEditFocusable immutable={this.props.immutable}>\n <StyledDurationEdit\n disabled={this.props.immutable}\n immutable={this.props.immutable}\n min={0}\n onChange={() => {}} // Empty onChange function to prevent React internal error\n onFocus={this.handleOnFocus}\n onInput={this.handleHourChange}\n onKeyPress={this.preventNonNumeric}\n pattern=\"\\d+\"\n step={1}\n style={{width: this.state.hoursWidth}}\n type=\"number\"\n value={this.state.hours}\n />\n {this.state.showUnits && <Typography.Span>{this.props.options.hoursLabel}</Typography.Span>}\n </StyledDurationEditFocusable>\n <StyledDurationEditFocusable immutable={this.props.immutable}>\n <StyledDurationEdit\n disabled={this.props.immutable}\n immutable={this.props.immutable}\n onChange={() => {}} // Empty onChange function to prevent React internal error\n onFocus={this.handleOnFocus}\n onInput={this.handleMinutesChange}\n onKeyPress={this.preventNonNumeric}\n pattern=\"\\d+\"\n step={1}\n style={{width: this.state.minutesWidth}}\n type=\"number\"\n value={this.state.minutes}\n />\n {this.state.showUnits && <Typography.Span>{this.props.options.minutesLabel}</Typography.Span>}\n </StyledDurationEditFocusable>\n <StyledDurationEditShadow ref={this.hoursShadow}>{this.state.hours}</StyledDurationEditShadow>\n <StyledDurationEditShadow ref={this.minutesShadow}>{this.state.minutes}</StyledDurationEditShadow>\n </StyledEditableWrapper>\n )\n }\n}\n\nDurationEdit.defaultProps = {\n options: {\n hoursLabel: 'hrs',\n minutesLabel: 'min'\n }\n}\n\nDurationEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.number,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n hoursLabel: PropTypes.string,\n minutesLabel: PropTypes.string\n })\n}\n\nexport default DurationEdit\n","import React from 'react'\nimport styled from 'styled-components'\nimport NumberFormat from 'react-number-format'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledNumberEdit = styled(({immutable, ...rest}) => <NumberFormat {...rest}/>)`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledNumberEdit\n","import PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {parseLocalePlaceholder, convertStringToNumber} from '../utils'\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledNumberEdit from './StyledNumberEdit'\n\nexport const calculateMaxValue = (prePointDigits, postPointDigits, maxValue) => {\n if (prePointDigits) {\n const calculatedMaxValue = (10 ** prePointDigits) - (postPointDigits ? (1 / (10 ** postPointDigits)) : 1)\n return maxValue && maxValue > calculatedMaxValue ? maxValue : calculatedMaxValue\n }\n\n return maxValue\n}\n\nconst getPreDecimalPositions = number => number !== 0 ? Math.ceil(Math.log10(Math.abs(number) + 1)) : 1\n\nconst isNumber = number => number !== null && number !== undefined && !isNaN(parseFloat(number))\n\nconst checkValueRange = (minValue, maxValue, value) => {\n if (!isNumber(value)) {\n return true\n }\n\n if (isNumber(maxValue) && value > maxValue) {\n return false\n }\n\n if (isNumber(minValue) && value < minValue) {\n return false\n }\n\n return true\n}\n\nexport const isAllowedValue = (minValue, maxValue) => ({floatValue}) => {\n if (getPreDecimalPositions(floatValue) < getPreDecimalPositions(minValue)) {\n return true\n }\n\n return checkValueRange(minValue, maxValue, floatValue)\n}\n\nconst NumberEdit = props => {\n const {thousandSeparator, decimalSeparator} = parseLocalePlaceholder(props.intl.locale)\n const {\n prePointDigits,\n postPointDigits,\n minValue,\n maxValue,\n allowNegative,\n fixedDecimalScale,\n suffix,\n prefix,\n format\n } = props.options || {}\n\n const calculatedMaxValue = calculateMaxValue(prePointDigits, postPointDigits, maxValue)\n const numberFormatOptions = {\n isAllowed: isAllowedValue(minValue, calculatedMaxValue),\n allowNegative: !!allowNegative,\n ...(!isNaN(postPointDigits) ? {decimalScale: postPointDigits} : {}),\n fixedDecimalScale: !!fixedDecimalScale\n }\n\n const handleChange = values => {\n if (props.onChange && checkValueRange(minValue, calculatedMaxValue, values.floatValue)) {\n props.onChange(values.floatValue !== undefined ? values.floatValue : null)\n }\n }\n\n const handleBlur = event => {\n const valueBeforeBlur = convertStringToNumber(event.target.value)\n if (props.onChange && !checkValueRange(minValue, calculatedMaxValue, valueBeforeBlur)) {\n // if we reach this, then onChange was never called for the last entered value, so just remove it\n event.target.value = null\n }\n }\n\n return (\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledNumberEdit\n decimalSeparator={decimalSeparator}\n disabled={props.immutable}\n id={props.id}\n isNumericString={true}\n name={props.name}\n onValueChange={handleChange}\n immutable={props.immutable}\n thousandSeparator={thousandSeparator}\n value={props.value}\n suffix={suffix}\n prefix={prefix}\n {...numberFormatOptions}\n format={format}\n onBlur={handleBlur}\n />\n </StyledEditableWrapper>\n )\n}\n\nNumberEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.number,\n name: PropTypes.string,\n id: PropTypes.string,\n intl: PropTypes.object,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n allowNegative: PropTypes.bool,\n fixedDecimalScale: PropTypes.bool,\n postPointDigits: PropTypes.number,\n prePointDigits: PropTypes.number,\n minValue: PropTypes.number,\n maxValue: PropTypes.number,\n suffix: PropTypes.string,\n prefix: PropTypes.string,\n format: PropTypes.string\n })\n}\n\nexport default injectIntl(react.Debouncer(NumberEdit, 800))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledNumberEdit from './StyledNumberEdit'\n\nconst IntegerEdit = ({value, onChange, options, immutable, name, id}) => {\n const {\n minValue,\n maxValue,\n format,\n allowLeadingZeros\n } = options || {}\n\n const handleChange = ({value, floatValue}) => {\n let newValue = allowLeadingZeros ? value : floatValue\n if (newValue === undefined) {\n newValue = null\n }\n onChange(newValue)\n }\n\n const isAllowed = ({floatValue}) =>\n !((maxValue && floatValue > maxValue) || (minValue && floatValue < minValue))\n\n return (\n <StyledEditableWrapper immutable={immutable}>\n <StyledNumberEdit\n isAllowed={isAllowed}\n allowNegative={true}\n decimalScale={0}\n disabled={immutable}\n id={id}\n name={name}\n onValueChange={handleChange}\n value={value}\n allowLeadingZeros={allowLeadingZeros}\n format={format}\n />\n </StyledEditableWrapper>\n )\n}\n\nIntegerEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n name: PropTypes.string,\n id: PropTypes.string,\n intl: PropTypes.object,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n minValue: PropTypes.number,\n maxValue: PropTypes.number,\n format: PropTypes.string,\n allowLeadingZeros: PropTypes.bool\n })\n}\n\nexport default react.Debouncer(IntegerEdit, 800)\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n generateDisabledShade,\n scale,\n shadeColor,\n theme\n} from '../../utilStyles'\nimport {\n StyledEditableWrapperCss,\n StyledInputCss\n} from '../StyledEditableValue'\n\nexport const StyledLocationEdit = styled.div`\n && {\n ${StyledEditableWrapperCss}\n position: relative;\n\n div {\n :nth-of-type(1) {\n flex: 0 0 6ch;\n margin-right: ${scale.space(-2)};\n }\n\n :nth-of-type(2) {\n flex: 1 1 auto;\n }\n }\n\n > span {\n flex: 0 0 auto;\n margin-right: ${scale.space(-2)};\n color: ${({immutable, theme}) => immutable\n ? generateDisabledShade(_get(theme, 'colors.text'))\n : _get(theme, 'colors.text')};\n }\n\n .react-autosuggest__input {\n ${StyledInputCss}\n width: 100%;\n }\n\n .react-autosuggest__suggestions-container--open {\n width: calc(100% + 17.5px);\n background-color: ${theme.color('paper')};\n box-shadow: 0 0 6px ${theme.color('signal.info.text')};\n border: 1px solid ${theme.color('secondaryLight')};\n bottom: -9px;\n left: -10px;\n max-height: 300px;\n overflow-y: auto;\n position: absolute;\n transform: translateY(100%);\n z-index: 2; // higher than StyledIndicatorsContainerWrapper\n }\n\n .react-autosuggest__suggestions-list {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n\n .react-autosuggest__suggestion {\n cursor: pointer;\n padding: 8px 12px;\n }\n\n .react-autosuggest__suggestion--highlighted {\n background-color: ${({theme}) => shadeColor(_get(theme, 'colors.paper'), 1)};\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Autosuggest from 'react-autosuggest'\nimport FocusWithin from 'react-simple-focus-within'\n\nimport Link from '../../Link'\nimport LoadingSpinner from '../../LoadingSpinner'\nimport Typography from '../../Typography'\nimport {StyledEditableControl} from '../StyledEditableValue'\nimport {StyledLocationEdit} from './StyledLocationEdit'\n\nexport const getGoogleMapsAddress = locationInput => {\n const mapsBaseAddress = 'https://www.google.com/maps/search/?api=1&query='\n\n const queryParams = locationInput\n ? Object.values(locationInput)\n .filter(value => value)\n .map(value => (typeof value === 'object' && value.display) ? value.display : value)\n .join('+')\n : ''\n\n return `${mapsBaseAddress}${queryParams}`\n}\n\nclass LocationEdit extends React.Component {\n returnGetSuggestion = attr => suggestion => suggestion[attr]\n\n renderSuggestion = suggestion => {\n const cantonString = suggestion.state ? `- ${suggestion.state}` : ''\n const countryString = suggestion.country ? `/ ${suggestion.country.display}` : ''\n\n return <Typography.Span>{suggestion.postcode} {suggestion.city} {cantonString} {countryString}</Typography.Span>\n }\n\n onChange = field => (event, {newValue}) => {\n this.props.onChange({[field]: newValue})\n }\n\n onSuggestionSelected = (event, {suggestion}) => {\n this.props.onChange(suggestion)\n }\n\n returnOnSuggestionFetchRequested = field => ({value}) => {\n this.props.options.fetchSuggestions({[field]: value}, this.props.value.country)\n }\n\n onSuggestionsClearRequested = () => {}\n\n showGoogleMaps = value => !!(value.city || value.postcode)\n\n render() {\n const inputPropsZip = {\n id: this.props.id,\n value: this.props.value.postcode || '',\n onChange: this.onChange('postcode'),\n disabled: this.props.immutable\n }\n\n const inputPropsCity = {\n value: this.props.value.city || '',\n onChange: this.onChange('city'),\n disabled: this.props.immutable\n }\n\n return (\n <FocusWithin>\n {({focused, getRef}) => {\n return <StyledLocationEdit\n immutable={this.props.immutable}\n name={this.props.name}\n ref={getRef}\n >\n <Autosuggest\n suggestions={this.props.options.suggestions || []}\n onSuggestionsFetchRequested={this.returnOnSuggestionFetchRequested('postcode')}\n getSuggestionValue={this.returnGetSuggestion('postcode')}\n renderSuggestion={this.renderSuggestion}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n inputProps={inputPropsZip}\n onSuggestionSelected={this.onSuggestionSelected}\n focusInputOnSuggestionClick={false}\n shouldRenderSuggestions={v => v && !this.props.immutable}\n />\n {(focused || this.props.value.city || this.props.value.postcode) && <Typography.Span>/</Typography.Span>}\n <Autosuggest\n suggestions={this.props.options.suggestions || []}\n onSuggestionsFetchRequested={this.returnOnSuggestionFetchRequested('city')}\n getSuggestionValue={this.returnGetSuggestion('city')}\n renderSuggestion={this.renderSuggestion}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n inputProps={inputPropsCity}\n onSuggestionSelected={this.onSuggestionSelected}\n focusInputOnSuggestionClick={false}\n shouldRenderSuggestions={v => v && !this.props.immutable}\n />\n <StyledEditableControl>\n {this.props.options.isLoading && <LoadingSpinner size=\"1.8rem\"/>}\n {this.showGoogleMaps(this.props.value)\n && <Link\n href={getGoogleMapsAddress(this.props.value)}\n icon=\"map-marked\"\n tabIndex={-1}\n target=\"_blank\"\n dense={false}\n title={this.props.options.mapButtonTitle || 'Show on map'}\n neutral\n />\n }\n </StyledEditableControl>\n </StyledLocationEdit>\n }}\n </FocusWithin>\n )\n }\n}\n\nconst locationObjectPropType = PropTypes.shape({\n city: PropTypes.string,\n postcode: PropTypes.string,\n address: PropTypes.string,\n country: PropTypes.shape({\n display: PropTypes.string,\n key: PropTypes.string\n }),\n canton: PropTypes.string,\n district: PropTypes.string\n})\n\nLocationEdit.propTypes = {\n onChange: PropTypes.func,\n value: locationObjectPropType,\n options: PropTypes.shape({\n suggestions: PropTypes.arrayOf(locationObjectPropType),\n fetchSuggestions: PropTypes.func,\n isLoading: PropTypes.bool,\n mapButtonTitle: PropTypes.string\n }),\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default LocationEdit\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport _isEmpty from 'lodash/isEmpty'\nimport _omit from 'lodash/omit'\n\nimport SingleSelect from './typeEditors/SingleSelect'\nimport MultiSelect from './typeEditors/MultiSelect'\nimport StringEdit from './typeEditors/StringEdit'\nimport TextEdit from './typeEditors/TextEdit'\nimport DateEdit from './typeEditors/DateEdit'\nimport DateTimeEdit from './typeEditors/DateTimeEdit'\nimport TimeEdit from './typeEditors/TimeEdit'\nimport BoolEdit from './typeEditors/BoolEdit'\nimport Document from './typeEditors/Document'\nimport HtmlEdit from './typeEditors/HtmlEdit'\nimport RemoteSelect from './typeEditors/RemoteSelect'\nimport MultiRemoteSelect from './typeEditors/MultiRemoteSelect'\nimport SearchFilterEdit from './typeEditors/SearchFilterEdit'\nimport UrlEdit from './typeEditors/UrlEdit'\nimport PhoneEdit from './typeEditors/PhoneEdit'\nimport DurationEdit from './typeEditors/DurationEdit'\nimport NumberEdit from './typeEditors/NumberEdit'\nimport IntegerEdit from './typeEditors/IntegerEdit'\nimport LocationEdit from './typeEditors/LocationEdit'\n\nexport const map = {\n 'boolean': BoolEdit,\n 'date': DateEdit,\n 'datetime': DateTimeEdit,\n 'document': Document,\n 'duration': DurationEdit,\n 'html': HtmlEdit,\n 'integer': IntegerEdit,\n 'location': LocationEdit,\n 'multi-remote': MultiRemoteSelect,\n 'multi-select': MultiSelect,\n 'number': NumberEdit,\n 'phone': PhoneEdit,\n 'remote': RemoteSelect,\n 'search-filter': SearchFilterEdit,\n 'single-select': SingleSelect,\n 'string': StringEdit,\n 'text': TextEdit,\n 'url': UrlEdit,\n 'time': TimeEdit\n}\n\nconst TypeEditorFactory = ({type, value, options, id, events, readOnly = false}) => {\n if (map[type]) {\n const Component = map[type]\n\n // blur workaround for known react-select issue: https://github.com/erikras/redux-form/issues/82\n // Date component only works properly on blur if the event is called with the value saved from the change event\n let blurValue\n if (events && events.onBlur) {\n const onBlur = events.onBlur\n events.onBlur = () => {\n return onBlur(blurValue !== undefined ? blurValue : value)\n }\n }\n\n return (\n <div {..._omit(events, 'onChange')} data-cy=\"form-field\">\n <Component\n value={value}\n onChange={v => {\n blurValue = v\n events.onChange(v)\n }}\n {...(_isEmpty(options) ? {} : {options})}\n id={id}\n immutable={readOnly}\n events={events}\n />\n </div>\n )\n }\n\n // eslint-disable-next-line no-console\n console.log('No type-editor defined for type', type)\n return null\n}\n\nTypeEditorFactory.propTypes = {\n type: PropTypes.oneOf(\n Object.keys(map)\n ).isRequired,\n events: PropTypes.objectOf(PropTypes.func),\n id: PropTypes.string,\n readOnly: PropTypes.bool,\n options: PropTypes.object,\n value: PropTypes.any\n}\n\nexport default TypeEditorFactory\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport TypeEditorFactory, {map as typeEditorFactoryMap} from './typeEditorFactory'\nimport StyledEditableValue from './StyledEditableValue'\n\n/**\n * To edit values of given type.\n */\nconst EditableValue = props => (\n <StyledEditableValue>\n <TypeEditorFactory {...props}/>\n </StyledEditableValue>\n)\n\nEditableValue.propTypes = {\n /**\n * Type of value. e.g. 'string'\n */\n type: PropTypes.oneOf(\n Object.keys(typeEditorFactoryMap)\n ).isRequired,\n /**\n * Value to display\n */\n value: PropTypes.any,\n /**\n * Depending on the type an object of options can be passed\n */\n options: PropTypes.object,\n /**\n * Id of element (for htmlFor)\n */\n id: PropTypes.string,\n /**\n * Object of functions that gets assigned to the component. E.g. {onChange: v => {}, onBlur: () => {}}\n */\n events: PropTypes.objectOf(PropTypes.func),\n /**\n * Determines if value is editable\n */\n readOnly: PropTypes.bool\n}\n\nexport default EditableValue\n","import styled, {css} from 'styled-components'\n\nimport {\n declareFont,\n theme\n} from '../utilStyles'\n\nconst StyledEditableWrapperCss = css`\n align-items: center;\n cursor: ${({immutable}) => immutable ? 'not-allowed' : 'default'};\n display: flex;\n`\n\nconst StyledEditableWrapper = styled.label`\n &&& {\n margin: 0; /* reset Bootstrap and Ext JS */\n padding: 0; /* reset Ext JS */\n ${StyledEditableWrapperCss}\n }\n`\n\nconst StyledInputCss = css`\n background-color: transparent;\n border: 0;\n cursor: ${({immutable}) => immutable ? 'not-allowed' : 'default'};\n flex-grow: 1;\n min-height: 2.6rem;\n min-width: 0;\n outline: 0;\n padding: 0;\n ${() => declareFont({\n color: theme.color('text')\n })}\n &::-ms-clear {\n display: none;\n }\n\n &::-webkit-clear-button {\n display: none;\n }\n\n &::-webkit-inner-spin-button {\n display: none;\n }\n\n &[type='number'] {\n appearance: textfield;\n }\n\n &[type='search'] {\n appearance: none;\n }\n\n &:disabled {\n -webkit-text-fill-color: ${theme.color('text')}; // Safari fix\n opacity: 1; // iOS fix\n }\n\n /* remove indicators */\n &[type='date'],\n &[type='datetime-local'],\n &[type='month'],\n &[type='time'],\n &[type='week'] {\n appearance: none;\n display: flex;\n\n /* reset margin on smaller screens */\n ::-webkit-date-and-time-value {\n ${({immutable}) => immutable && 'margin: unset;'}\n }\n }\n\n // allow pointer event only on touch devices\n @media (pointer: coarse) {\n pointer-events: ${({immutable}) => immutable ? 'none' : 'auto'};\n }\n`\n\nconst StyledEditableControlCss = css`\n display: flex;\n align-items: center;\n`\n\nconst StyledEditableControl = styled.div`\n &&& {\n ${StyledEditableControlCss}\n }\n`\n\nexport const StyledEditableValue = styled.span`\n width: 100%;\n\n && {\n //url\n [type='url'] + .input-group-addon > a {\n color: inherit; // reset bootstrap default\n }\n\n //url\n [type='tel'] + .input-group-addon > a {\n color: inherit; // reset bootstrap default\n }\n\n //html edit\n .quill {\n .ql-toolbar {\n border-top-left-radius: .27rem;\n border-top-right-radius: .27rem;\n }\n\n .ql-container {\n border-bottom-left-radius: .27rem;\n border-bottom-right-radius: .27rem;\n background-color: #fff;\n }\n\n .ql-container.ql-disabled {\n border-top-left-radius: .27rem;\n border-top-right-radius: .27rem;\n\n .ql-editor {\n cursor: not-allowed;\n }\n }\n }\n\n //date\n .date-edit {\n .input-group-addon {\n cursor: pointer;\n }\n\n input {\n z-index: 0;\n }\n\n &.disabled {\n input {\n cursor: not-allowed;\n }\n }\n\n .right-addon {\n position: relative;\n }\n\n .right-addon input {\n padding-right: 30px;\n }\n\n .reset {\n position: absolute;\n padding-right: 10px;\n padding-top: 5px;\n right: 0;\n color: #999;\n font-size: 18px;\n font-style: normal;\n cursor: pointer;\n }\n\n .reset:hover {\n color: ${theme.color('signal.danger.text')};\n }\n }\n }\n`\n\nexport {\n StyledEditableControl,\n StyledEditableControlCss,\n StyledEditableValue as default,\n StyledEditableWrapper,\n StyledEditableWrapperCss,\n StyledInputCss\n}\n","import {createGlobalStyle} from 'styled-components'\n\nimport {theme, declareFont, scale} from '../utilStyles'\n\nconst calendarWidth = 270\nconst secondaryLight = theme.color('secondaryLight')\nconst secondary = theme.color('secondary')\nconst paper = theme.color('paper')\nconst regular = theme.fontWeight('regular')\nconst baseSpace = scale.space(-2)\n\nexport const GlobalDatePickerStyles = createGlobalStyle`\n .flatpickr-calendar {\n && {\n ${declareFont()}\n width: ${calendarWidth}px;\n border: 1px solid ${secondaryLight};\n border-radius: 0;\n }\n\n &.open {\n z-index: 999999 !important; // higher than StyledModalHolder\n }\n\n &.arrowTop:before,\n &.arrowTop:after {\n border-bottom-color: ${secondaryLight} !important;\n }\n\n &.arrowBottom:before,\n &.arrowBottom:after {\n border-top-color: ${secondaryLight} !important;\n }\n\n .flatpickr-rContainer {\n width: 100%;\n }\n\n .dayContainer {\n padding-top: ${baseSpace};\n padding-right: ${baseSpace};\n padding-bottom: ${baseSpace};\n width: ${calendarWidth}px;\n min-width: ${calendarWidth}px;\n max-width: ${calendarWidth}px;\n }\n\n .numInput.cur-year,\n .flatpickr-current-month span.cur-month{\n font-weight: ${regular};\n }\n\n .flatpickr-current-month .numInputWrapper {\n span.arrowUp:after {\n border-bottom-color: ${paper};\n }\n\n span.arrowDown:after {\n border-top-color: ${paper};\n }\n }\n\n .flatpickr-weekday {\n font-size: ${scale.font(-2)};\n font-weight: ${regular};\n }\n\n .flatpickr-days {\n width: ${calendarWidth}px;\n }\n\n .flatpickr-day.today {\n border-color: ${secondary};\n font-weight: ${theme.fontWeight('bold')};\n }\n\n .flatpickr-day {\n max-width: 34px;\n height: 34px;\n line-height: 34px;\n margin-bottom: ${baseSpace};\n font-weight: ${regular};\n }\n\n .flatpickr-months .flatpickr-month {\n border-radius: 0;\n }\n\n .flatpickr-months .flatpickr-month,\n .flatpickr-weekdays,\n .flatpickr-weekday {\n background-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-day.selected,\n .flatpickr-day.startRange,\n .flatpickr-day.endRange,\n .flatpickr-day.selected.inRange,\n .flatpickr-day.startRange.inRange,\n .flatpickr-day.endRange.inRange,\n .flatpickr-day.selected:focus,\n .flatpickr-day.startRange:focus,\n .flatpickr-day.endRange:focus,\n .flatpickr-day.selected:hover,\n .flatpickr-day.startRange:hover,\n .flatpickr-day.endRange:hover,\n .flatpickr-day.selected.prevMonthDay,\n .flatpickr-day.startRange.prevMonthDay,\n .flatpickr-day.endRange.prevMonthDay,\n .flatpickr-day.selected.nextMonthDay,\n .flatpickr-day.startRange.nextMonthDay,\n .flatpickr-day.endRange.nextMonthDay,\n .flatpickr-day.today:hover,\n .flatpickr-day.today:focus {\n background-color: ${secondary};\n border-color: ${secondary};\n }\n\n .flatpickr-day.inRange,\n .flatpickr-day.prevMonthDay.inRange,\n .flatpickr-day.nextMonthDay.inRange,\n .flatpickr-day.today.inRange,\n .flatpickr-day.prevMonthDay.today.inRange,\n .flatpickr-day.nextMonthDay.today.inRange,\n .flatpickr-day:hover,\n .flatpickr-day.prevMonthDay:hover,\n .flatpickr-day.nextMonthDay:hover,\n .flatpickr-day:focus,\n .flatpickr-day.prevMonthDay:focus,\n .flatpickr-day.nextMonthDay:focus {\n background-color: ${secondaryLight};\n border-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-months .flatpickr-prev-month,\n .flatpickr-months .flatpickr-next-month {\n color: ${paper};\n fill: ${paper};\n\n &:hover svg {\n color: ${secondary};\n fill: ${secondary};\n }\n }\n }\n`\n","import React from 'react'\n\nimport {GlobalDatePickerStyles} from '../DatePicker'\n\nconst GlobalStyles = () => {\n return <>\n <GlobalDatePickerStyles/>\n </>\n}\n\nexport default GlobalStyles\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutBox = styled.div`\n display: grid;\n height: fit-content;\n grid-template-rows: auto;\n grid-template-columns: 100%;\n margin-bottom: ${scale.space(0.25)};\n`\n\nexport default StyledLayoutBox\n","import React, {useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Ball} from '../'\nimport {Menu} from './'\n\n/**\n * Ball Button with a menu that pops out on click.\n */\nconst BallMenu = ({buttonProps, onOpen, children}) => {\n const ballEl = useRef(null)\n const [menuOpen, setMenuOpen] = useState(false)\n const [onOpenCalled, setOnOpenCalled] = useState(false)\n\n const handleClick = e => {\n setMenuOpen(!menuOpen)\n e.stopPropagation()\n\n if (onOpen && !onOpenCalled) {\n onOpen()\n setOnOpenCalled(true)\n }\n }\n\n const handleClose = () => {\n setMenuOpen(false)\n }\n\n return <>\n <Ball {...buttonProps} onClick={handleClick} ref={ballEl}/>\n {menuOpen && <Menu\n referenceElement={ballEl.current}\n open={menuOpen}\n onClose={handleClose}\n >\n {children}\n </Menu>}\n </>\n}\n\nBallMenu.propTypes = {\n /**\n * Tree of <MenuItem>\n */\n children: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.arrayOf(PropTypes.element)\n ]).isRequired,\n /**\n * Object of properties as described in Ball component\n */\n buttonProps: PropTypes.object,\n /**\n * Callback when the menu is opened (only called once)\n */\n onOpen: PropTypes.func\n}\n\nexport default BallMenu\n","import React, {useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Button, ButtonGroup, Icon, Menu} from '../'\nimport {StyledIconButtonWrapper, StyledIconWrapper} from './StyledComponents'\nimport {StyledLabelWrapper} from '../Button/StyledButton'\n\n/**\n * Button with a menu that pops out on click.\n */\nconst ButtonMenu = props => {\n const {\n onOpen,\n children,\n onClick,\n buttonProps,\n label,\n icon\n } = props\n const referenceElement = useRef(null)\n const [menuOpen, setMenuOpen] = useState(false)\n const [onOpenCalled, setOnOpenCalled] = useState(false)\n\n const handleClick = () => {\n setMenuOpen(!menuOpen)\n if (onOpen && !onOpenCalled) {\n onOpen()\n setOnOpenCalled(true)\n }\n }\n\n const handleClose = () => {\n setMenuOpen(false)\n }\n\n const chevronIcon = menuOpen ? 'chevron-up' : 'chevron-down'\n\n const ThisMenu = () => <Menu\n referenceElement={referenceElement.current}\n open={menuOpen}\n onClose={handleClose}\n >\n {children}\n </Menu>\n\n if (onClick) {\n return <>\n <ButtonGroup ref={referenceElement}>\n <Button {...buttonProps || {}} onClick={onClick} label={label} data-cy={props['data-cy']} icon={icon}/>\n <StyledIconButtonWrapper icon={chevronIcon} onClick={handleClick} {...buttonProps || {}}/>\n </ButtonGroup>\n {menuOpen && <ThisMenu/>}\n </>\n }\n\n return <>\n <Button\n data-cy={props['data-cy']}\n {...buttonProps || {}} ref={referenceElement}\n onClick={handleClick}\n icon={icon}\n >\n <StyledLabelWrapper>{label}</StyledLabelWrapper>\n <StyledIconWrapper>\n <Icon icon={chevronIcon}/>\n </StyledIconWrapper>\n </Button>\n {menuOpen && <ThisMenu/>}\n </>\n}\n\nButtonMenu.propTypes = {\n /**\n * Optional handler. If defined, a split button will be rendered\n */\n 'onClick': PropTypes.func,\n /**\n * Will be shown on the button\n */\n 'label': PropTypes.string,\n /**\n * Will be passed to the underlying Button\n */\n 'buttonProps': PropTypes.object,\n /**\n * Tree of <MenuItem>\n */\n 'children': PropTypes.any,\n /**\n * Callback when the menu is opened (only called once)\n */\n 'onOpen': PropTypes.func,\n /**\n * cypress selector string\n */\n 'data-cy': PropTypes.string,\n /**\n * icon to display for the menu\n */\n 'icon': PropTypes.string\n}\n\nexport default ButtonMenu\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {usePopper} from 'react-popper'\nimport ReactDOM from 'react-dom'\n\nimport {StyledPopper, StyledPopperWrapper} from './StyledComponents'\n\n/**\n * Menu realised with popper.\n */\nconst Menu = ({\n referenceElement,\n onClose,\n open,\n children\n}) => {\n const thisEl = useRef(null)\n const [popperElement, setPopperElement] = useState(null)\n const [bottom, setBottom] = useState(0)\n\n const handleClickOutside = useCallback(e => {\n if (thisEl && thisEl.current && !thisEl.current.contains(e.target)\n && popperElement && !popperElement.contains(e.target)\n && referenceElement && !referenceElement.contains(e.target)) {\n onClose()\n }\n }, [referenceElement, popperElement, onClose])\n\n useEffect(() => {\n if (thisEl.current) {\n setBottom(thisEl.current.getBoundingClientRect().bottom)\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [handleClickOutside])\n\n const {\n styles,\n attributes\n } = usePopper(referenceElement, popperElement, {\n placement: 'bottom-start',\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 5]\n }\n }]\n })\n\n if (!open) {\n return null\n }\n\n return (\n <StyledPopperWrapper ref={thisEl}>\n {children && ReactDOM.createPortal(\n <StyledPopper\n ref={setPopperElement}\n style={styles.popper}\n {...attributes.popper}\n rectBottom={bottom}>\n {React.Children.map(children, child => child && React.cloneElement(child, {onClose: onClose}))}\n </StyledPopper>,\n document.body)}\n </StyledPopperWrapper>\n )\n}\n\nMenu.propTypes = {\n /**\n * Element to attach popper menu to\n */\n referenceElement: PropTypes.any,\n /**\n * Will be called if menu is closed\n */\n onClose: PropTypes.func.isRequired,\n /**\n * Tree of <MenuItems>\n */\n children: PropTypes.node,\n /**\n * Whether menu is open or not\n */\n open: PropTypes.bool\n}\n\nexport default Menu\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuItem, StyledItemLabel} from './StyledComponents'\n\n/**\n * Item of Menu\n */\nconst MenuItem = ({\n children,\n onClick,\n onClose,\n disabled,\n closeOnClick,\n title,\n level\n}) => {\n const childrenArr = React.Children.toArray(children).filter(Boolean)\n const isGroup = childrenArr.length > 1\n const hasOnClick = Boolean(onClick)\n\n const handleClick = e => {\n if (hasOnClick && !disabled) {\n onClick()\n\n if (closeOnClick && onClose) {\n onClose()\n }\n }\n e.stopPropagation()\n }\n\n const menuItem = childrenArr.map((child, idx) => {\n const lvl = level ? level++ : 1\n if (child.type && child.type.displayName === 'MenuItem') {\n return React.cloneElement(child, {\n ...child.props,\n onClose: onClose,\n closeOnClick: closeOnClick,\n level: lvl,\n key: `menu-item-${idx}-${lvl}`\n })\n }\n return <StyledItemLabel\n key={`menu-item-label-${idx}-${lvl}`}\n hasOnClick={hasOnClick}\n isGroup={isGroup}\n title={title}\n disabled={disabled}\n look=\"raised\"\n level={level}\n >\n {child}\n </StyledItemLabel>\n })\n\n return (\n <StyledMenuItem onClick={handleClick} level={level}>\n {menuItem}\n </StyledMenuItem>\n )\n}\n\nMenuItem.defaultProps = {\n closeOnClick: true\n}\n\nMenuItem.displayName = 'MenuItem'\n\nMenuItem.propTypes = {\n /**\n * Can either be another MenuItem for tree hierarchy or an element that gets rendered e.g. label\n */\n children: PropTypes.any,\n /**\n * Will be called on click\n */\n onClick: PropTypes.func,\n /**\n * If true, the Item will be read only\n */\n disabled: PropTypes.bool,\n /**\n * Html attribute. Will be shown on mouse over\n */\n title: PropTypes.string,\n /**\n * Will be passed down from Menu. Indicated whether the menu should close or not on click.\n */\n closeOnClick: PropTypes.bool,\n /**\n * Will be passed down from Menu.\n */\n onClose: PropTypes.func,\n /**\n * Will be set automatically and indicates the level\n */\n level: PropTypes.number\n}\n\nexport default MenuItem\n","import styled from 'styled-components'\n\nimport {Button, declareFont, scale, theme, StyledScrollbar} from '../index'\nimport {interactiveStyling} from '../utilStyles'\n\nexport const StyledIconWrapper = styled.div`\n margin-left: ${scale.space(-1.7)};\n margin-right: -${scale.space(-2.1)};\n`\n\nexport const StyledIconButtonWrapper = styled(Button)`\n padding-left: ${scale.space(-0.5)};\n padding-right: ${scale.space(-0.5)};\n`\n\nexport const StyledPopperWrapper = styled.div`\n position: relative;\n`\n\nexport const StyledPopper = styled.div`\n max-height: ${({rectBottom}) => `calc(100vh - ${rectBottom + 15}px)`}; // add 15px for small padding\n width: max-content;\n overflow-y: auto;\n overflow-x: hidden;\n background: ${theme.color('paper')};\n box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n border: 1px solid ${theme.color('secondaryLight')};\n z-index: 9999999; /* higher than StyledModalHolder */\n ${StyledScrollbar}\n`\n\nexport const StyledMenuItem = styled.div`\n min-width: 200px;\n max-width: 300px;\n`\n\nexport const StyledItemLabel = styled.div`\n cursor: ${({hasOnClick}) => hasOnClick ? 'pointer' : 'default'};\n ${declareFont()}\n ${interactiveStyling}\n padding:\n ${scale.space(-2)}\n ${scale.space(-0.5)}\n ${scale.space(-2)}\n calc(${scale.space(-0.5)} + ${({level}) => (level || 0) * 5 + 'px'});\n font-weight: ${({isGroup}) => isGroup ? theme.fontWeight('bold') : theme.fontWeight('regular')};\n box-shadow: none;\n`\n","import PropTypes from 'prop-types'\nimport React, {useLayoutEffect, useRef} from 'react'\n\nconst checkboxValues = {\n CHECKED: 'checked',\n INDETERMINATE: 'indeterminate',\n UNCHECKED: 'unchecked'\n}\n\n/**\n * Use <MultiCheckbox> to display if none, some or all items of a portion are selected.\n */\nconst MultiCheckbox = ({value, id, onChange, label}) => {\n const inputEl = useRef(null)\n const handleOnChange = e => {\n if (value === checkboxValues.INDETERMINATE) {\n onChange(checkboxValues.UNCHECKED)\n } else {\n onChange(e.target.checked ? checkboxValues.CHECKED : checkboxValues.UNCHECKED)\n }\n }\n\n useLayoutEffect(() => {\n inputEl.current.indeterminate = (value === checkboxValues.INDETERMINATE)\n inputEl.current.checked = (value === checkboxValues.CHECKED)\n }, [value])\n\n return <input\n ref={inputEl}\n onChange={handleOnChange}\n id={id}\n type=\"checkbox\"\n aria-checked={value === 'checked'}\n aria-label={label}\n />\n}\n\nMultiCheckbox.propTypes = {\n /**\n * State with 'checked' if checkbox is checked. State with 'indeterminate' if checkbox\n * is neither checked nor unchecked.\n */\n value: PropTypes.oneOf(Object.values(checkboxValues)),\n /**\n * Id of the checkbox. Can be used in combination with the 'for' attribute of the label element\n */\n id: PropTypes.string,\n /**\n * Callback is executed on change. Callback receives new checkbox state, which is 'checked' or 'unchecked'.\n */\n onChange: PropTypes.func.isRequired,\n /**\n * Label to be used for the aria-label attribute. Improves Accessibility.\n */\n label: PropTypes.string\n}\n\nexport default MultiCheckbox\n","import MultiCheckbox from './MultiCheckbox'\n\nexport default MultiCheckbox\n","import styled from 'styled-components'\nimport {lighten} from 'polished'\n\nimport {\n theme\n} from '../utilStyles'\n\nconst StyledPanel = styled.div`\n && {\n background-color: ${theme.color('paper')};\n border: 1px\n ${({isFramed}) => isFramed ? 'solid' : 'none'}\n ${({theme}) => lighten(0.93, theme.colors.text)};\n }\n`\nexport default StyledPanel\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport StyledPanel from './StyledPanel'\n\n/**\n * <Panel/> is used to conceal and display related content alternating by interaction and to\n * emphasize close relationship of content.\n */\nconst Panel = ({\n children,\n isFramed = true,\n controlledIsOpen,\n isOpenInitial = true,\n isToggleable = true,\n onToggle\n}) => {\n const [isOpen, setIsOpen] = useState(isOpenInitial)\n\n const controlled = typeof controlledIsOpen === 'boolean'\n\n const toggleOpenState = () => {\n if (isToggleable) {\n if (controlled) {\n if (typeof onToggle === 'function') {\n onToggle(!controlledIsOpen)\n }\n } else {\n setIsOpen(!isOpen)\n }\n }\n }\n\n return (\n <StyledPanel\n isFramed={isFramed}\n >\n {\n React.Children.map(children, child =>\n React.cloneElement(child, {\n isFramed,\n isOpen: controlled ? controlledIsOpen : isOpen,\n isToggleable,\n toggleOpenState: toggleOpenState\n })\n )\n }\n </StyledPanel>\n )\n}\n\nPanel.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is bordered.\n * Default value is 'true'.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is opened or not. If not set, the Panel manages it sate by itself.\n */\n controlledIsOpen: PropTypes.bool,\n /**\n * If component is not controlled a initial value can be set\n */\n isOpenInitial: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Default value is 'true'.\n */\n isToggleable: PropTypes.bool,\n /**\n * Function is triggered if panel is opened or closed.\n */\n onToggle: PropTypes.func\n}\n\nexport default Panel\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\nimport StyledPanel from './StyledPanel'\n\nconst StyledPanelGroup = styled.div`\n margin-bottom: ${scale.space(0)};\n\n && {\n ${/* sc-selector */StyledPanel}:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport default StyledPanelGroup\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelGroup from './StyledPanelGroup'\n\nclass PanelGroup extends React.Component {\n state = {\n openPanelIndex: this.props.openPanelIndex\n }\n\n onToggle = (index, open) => {\n this.setState({\n openPanelIndex: open === true ? index : undefined\n })\n }\n\n render() {\n return (\n <StyledPanelGroup>\n {\n React.Children.map(this.props.children, (child, i) =>\n React.cloneElement(child, {\n controlledIsOpen: this.state.openPanelIndex === i,\n onToggle: this.onToggle.bind(this, i)\n })\n )\n }\n </StyledPanelGroup>\n )\n }\n}\n\nPanelGroup.propTypes = {\n children: PropTypes.node,\n /**\n * Define a panel which is initially opened (zero-based index).\n */\n openPanelIndex: PropTypes.number\n}\n\nexport default PanelGroup\n","import styled from 'styled-components'\n\nconst StyledPanelBody = styled.div`\n && {\n padding: 0 ${({isFramed}) => isFramed ? '10px' : 0};\n display: ${({isOpen}) => isOpen ? 'block' : 'none'};\n\n > div {\n padding: ${({isFramed}) => isFramed ? '10px' : 0} 0 0 0;\n }\n\n table {\n position: static;\n }\n }\n`\nexport default StyledPanelBody\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelBody from './StyledPanelBody'\n\n/**\n * Only <Panel.Body/> is affected by the visibility state.\n */\n\nconst PanelBody = ({children, isFramed, isOpen}) =>\n <StyledPanelBody\n isFramed={isFramed}\n isOpen={isOpen}\n >\n <div>\n {children}\n </div>\n </StyledPanelBody>\n\nPanelBody.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool\n}\n\nexport default PanelBody\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor, scale, theme} from '../utilStyles'\n\nconst declareDivider = ({theme, isOpen, isFramed}) => {\n const cssShared = `\n &:first-child {\n border-bottom-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-bottom-style: ${isFramed ? 'solid' : 'none'};\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-top-style: ${isFramed ? 'solid' : 'none'};\n }\n `\n\n if (isOpen) {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 1px;\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n } else {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 0;\n }\n\n &:last-child {\n border-top-width: 0;\n }\n\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n }\n}\n\nexport const StyledIconWrapper = styled.span`\n display: none;\n font-size: ${scale.font(1)};\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n`\n\nconst StyledPanelHeaderFooter = styled.div`\n && {\n background-color: #f2f2f2;\n display: flex;\n padding: ${({isFramed}) => isFramed ? '4px 8px 4px 8px' : 0};\n align-items: center;\n\n &:hover {\n cursor: pointer;\n\n ${StyledIconWrapper} {\n display: block;\n }\n }\n\n > div {\n flex: 1 1 auto;\n }\n ${props => declareDivider(props)}\n }\n`\n\nexport default StyledPanelHeaderFooter\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelHeaderFooter, {StyledIconWrapper} from './StyledPanelHeaderFooter'\nimport Icon from '../Icon'\n\n/**\n * <Panel.Header/> and <Panel.Footer/> contain by default a button to toggle the visibility state of <Panel.Body>.\n * Header and footer can contain any content. If both are displayed is up to the implementer.\n */\nconst PanelHeaderFooter = ({\n children,\n isFramed,\n isOpen,\n isToggleable,\n showToggler,\n toggleOpenState,\n options\n}) => (\n <StyledPanelHeaderFooter\n isFramed={isFramed}\n isOpen={isOpen}\n onClick={toggleOpenState}\n >\n <div>\n {React.Children.map(children, child => React.cloneElement(child))}\n </div>\n {isToggleable\n && showToggler\n && <StyledIconWrapper>\n <Icon\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n onClick={toggleOpenState}\n title={isOpen ? options.collapseButtonText : options.unfoldButtonText}\n />\n </StyledIconWrapper>\n }\n </StyledPanelHeaderFooter>\n)\n\nPanelHeaderFooter.defaultProps = {\n showToggler: true,\n options: {\n collapseButtonText: 'Hide information',\n unfoldButtonText: 'Show more information'\n }\n}\n\nPanelHeaderFooter.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Value is always overridden by parent element.\n */\n isToggleable: PropTypes.bool,\n /**\n * Show or hide button if needed. Default value is 'true'.\n */\n showToggler: PropTypes.bool,\n /**\n * Function executed on button click to control accordion. Is always passed from parent.\n */\n toggleOpenState: PropTypes.func,\n /* Define display text for buttons as option object (keys: collapseButtonText, unfoldButtonText). */\n options: PropTypes.shape({\n collapseButtonText: PropTypes.string,\n unfoldButtonText: PropTypes.string\n })\n}\n\nexport default PanelHeaderFooter\n","import Wrapper from './Panel'\nimport Group from './PanelGroup'\nimport Body from './PanelBody'\nimport HeaderFooter from './PanelHeaderFooter'\nimport StyledPanel from './StyledPanel'\nimport StyledPanelBody from './StyledPanelBody'\nimport StyledPanelHeaderFooter from './StyledPanelHeaderFooter'\n\nexport {\n StyledPanel,\n StyledPanelBody,\n StyledPanelHeaderFooter\n}\n\nexport default {\n Body,\n Footer: HeaderFooter,\n Group,\n Header: HeaderFooter,\n Wrapper\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport QRCodeC from 'qrcode.react'\n\n/**\n * Use to display a string as QR-Code Image.\n */\nconst QRCode = ({value}) => <QRCodeC value={value} renderAs=\"svg\"/>\n\nQRCode.propTypes = {\n /**\n * Value that will be shown as qr-code. e.g. an Url.\n */\n value: PropTypes.string\n}\n\nexport default QRCode\n","import styled from 'styled-components'\n\nimport {theme, scale} from '../utilStyles'\nimport {StyledInputCss} from '../EditableValue/StyledEditableValue'\nimport {StyledStatedValueBox} from '../StatedValue'\n\nexport const StyledSearchBox = styled.div`\n && {\n margin-right: ${scale.space(0)};\n margin-top: ${scale.space(-2.8)};\n margin-left: ${scale.space(-2.8)};\n\n ${StyledStatedValueBox} {\n border: 0;\n width: 100%;\n border-bottom: 1px solid ${theme.color('text')};\n padding-right: .3rem;\n\n input[type='search']::-webkit-search-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n }\n`\n\nexport const StyledSearchBoxInput = styled.input.attrs(props => ({\n type: 'search'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledSearchBox, StyledSearchBoxInput} from './StyledSearchBox'\nimport {StyledEditableWrapper} from '../EditableValue/StyledEditableValue'\nimport StatedValue from '../StatedValue'\n\nconst SearchBox = React.forwardRef((props, ref) => {\n const {\n value,\n minInputLength,\n onSearch,\n placeholder\n } = props\n const [inputValue, setInputValue] = useState(value || '')\n\n const onChange = e => {\n const newValue = e.target.value\n setInputValue(newValue)\n\n if (newValue.length === 0 || newValue.length >= minInputLength) {\n onSearch(newValue)\n }\n }\n\n return (\n <StyledSearchBox>\n <StatedValue\n hasValue={Boolean(inputValue)}\n label={placeholder}\n >\n <StyledEditableWrapper>\n <StyledSearchBoxInput\n data-cy=\"ui-search-box\"\n ref={ref}\n onChange={onChange}\n value={inputValue}\n aria-label={placeholder}\n />\n </StyledEditableWrapper>\n </StatedValue>\n </StyledSearchBox>\n )\n})\n\nSearchBox.defaultProps = {\n debounce: 200,\n minInputLength: 3\n}\n\nSearchBox.propTypes = {\n /**\n * Optional default value\n */\n value: PropTypes.string,\n /**\n * Function that will be triggered. The input value will be passed as argument.\n */\n onSearch: PropTypes.func.isRequired,\n /**\n * Placeholder of the input field.\n */\n placeholder: PropTypes.string,\n /**\n * onSearch is only called when the input has at least the length of minInputLength or 0\n */\n minInputLength: PropTypes.number\n}\n\nexport default react.Debouncer(SearchBox, 100, 'onSearch')\n","import SearchBox from './SearchBox'\nimport {StyledSearchBox} from './StyledSearchBox'\n\nexport default SearchBox\nexport {StyledSearchBox}\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {StyledLi} from '../Typography'\nimport {\n design,\n shadeColor,\n theme\n} from '../utilStyles'\n\nconst COLORS = {\n [design.condition.BASE]: 'inherit',\n [design.condition.DANGER]: theme.color('signal.danger.text'),\n [design.condition.PRIMARY]: props => shadeColor(_get(props.theme, 'colors.primary'), 1),\n [design.condition.SUCCESS]: theme.color('signal.success.text'),\n [design.condition.WARNING]: theme.color('signal.warning.text'),\n [design.condition.INFO]: theme.color('signal.info.text')\n}\n\nconst getColor = props => {\n const color = COLORS[props.condition]\n return color || 'inherit'\n}\n\nconst StyledSignalListItem = styled(StyledLi)`\n && {\n color: ${props => getColor(props)};\n position: relative;\n\n > i,\n > svg {\n position: absolute;\n left: -1.6rem;\n text-align: left;\n }\n\n > svg {\n top: .2em;\n }\n }\n`\n\nStyledSignalListItem.propTypes = {\n condition: design.conditionPropTypes(COLORS)\n}\n\nexport default StyledSignalListItem\n","import styled from 'styled-components'\n\nimport {StyledUl} from '../Typography'\n\nconst StyledSignalList = styled(StyledUl)`\n && {\n list-style-type: none;\n }\n`\n\nexport default StyledSignalList\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledSignalList from './StyledSignalList'\n\n/**\n * Signalize conditions by icon and color in a list.\n */\nexport const SignalList = props =>\n <StyledSignalList as=\"ul\">\n {React.Children.map(props.children, child => React.cloneElement(child))}\n </StyledSignalList>\n\nSignalList.propTypes = {\n children: PropTypes.node\n}\n\nexport default SignalList\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Icon from '../Icon'\nimport StyledSignalListItem from './StyledSignalListItem'\nimport {design} from '../utilStyles'\n\nconst ICONS = {\n [design.condition.BASE]: false,\n [design.condition.PRIMARY]: false,\n [design.condition.DANGER]: 'times',\n [design.condition.SUCCESS]: 'check',\n [design.condition.WARNING]: 'exclamation-triangle',\n [design.condition.INFO]: 'info'\n}\n\nconst getIcon = props => {\n const icon = ICONS[props.condition]\n if (icon) {\n return <Icon icon={icon} position={design.position.SOLE}/>\n } else {\n return <i>{'\\u2022'}</i>\n }\n}\n\n/**\n * Signalize single condition by icon and color. It must be wrapped by <SignalList/>\n */\nconst SignalListItem = props =>\n <StyledSignalListItem condition={props.condition}>\n {getIcon(props)}\n {props.label}\n {React.Children.map(props.children, child => React.cloneElement(child))}\n </StyledSignalListItem>\n\nSignalListItem.defaultProps = {\n condition: design.condition.BASE\n}\n\nSignalListItem.propTypes = {\n /**\n * Visible text. Default is an empty string.\n */\n label: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.node\n ]),\n children: PropTypes.node,\n /**\n * Color and icon is set according condition. Default value is 'base'.\n * Possible values: base|danger|primary|success|warning\n */\n condition: design.conditionPropTypes(ICONS)\n}\n\nexport default SignalListItem\n","import List from './SignalList'\nimport StyledSignalList from './StyledSignalList'\nimport Item from './SignalListItem'\nimport StyledSignalListItem from './StyledSignalListItem'\n\nexport {\n StyledSignalList,\n StyledSignalListItem\n}\n\nexport default {\n List,\n Item\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport SignalList from '../SignalList'\n\nconst ErrorList = props => {\n if (!props.error) {\n return null\n }\n\n const errorValues = []\n Object.keys(props.error).forEach(key => {\n errorValues.push(...props.error[key])\n })\n\n return (\n <SignalList.List>\n {errorValues.map((value, idx) => (\n <SignalList.Item\n condition=\"danger\"\n key={idx}\n label={value}\n />\n ))}\n </SignalList.List>\n )\n}\n\nErrorList.propTypes = {\n error: PropTypes.objectOf(\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n )\n}\n\nexport default ErrorList\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport FocusWithin from 'react-simple-focus-within'\nimport {js, html} from 'tocco-util'\n\nimport ErrorList from './ErrorList'\nimport {\n StyledStatedValueBox,\n StyledStatedValueDescription,\n StyledStatedValueError,\n StyledStatedValueLabel,\n StyledStatedValueWrapper,\n StyledLabelWrapper\n} from './StyledStatedValue'\nimport {design} from '../utilStyles'\n\nconst detectSignal = (dirty, hasError, mandatory, hasValue) => {\n if (hasError) {\n return design.condition.DANGER\n } else if (dirty) {\n return design.condition.INFO\n } else if (mandatory && !hasValue) {\n return design.condition.WARNING\n }\n}\n\n/**\n * Wrap <EditableValue> and <FormattedValUe> in <StatedValue> to describe it\n * and signal conditions.\n */\nconst StatedValue = props => {\n const {\n children,\n description,\n dirty,\n fixLabel,\n isDisplay,\n error,\n hasValue,\n id,\n label,\n mandatory,\n mandatoryTitle,\n immutable,\n touched,\n signal: signalProp\n } = props\n\n const showError = !immutable && touched && error && Object.keys(error).length > 0\n const labelAlt = `${js.adjustedHTMLString(label)}${mandatory && mandatoryTitle ? `, ${mandatoryTitle}` : ''}`\n const signal = signalProp || detectSignal(dirty, showError, mandatory, hasValue)\n\n return (\n <FocusWithin>\n {({focused, getRef}) => {\n const secondaryPosition = (!immutable && focused) || hasValue || isDisplay || fixLabel\n return (\n <StyledStatedValueWrapper\n ref={getRef}\n secondaryPosition={secondaryPosition}>\n <StyledStatedValueBox\n className=\"StyledStatedValueBox\"\n hasValue={hasValue}\n immutable={immutable}\n isDisplay={isDisplay}\n signal={signal}>\n {children}\n {label && <StyledLabelWrapper>\n <StyledStatedValueLabel\n {...!isDisplay && !immutable && {htmlFor: id}}\n hasValue={hasValue}\n dirty={dirty}\n title={labelAlt}\n secondaryPosition={secondaryPosition}\n immutable={immutable}\n isDisplay={isDisplay}\n signal={signal}\n >\n <span dangerouslySetInnerHTML={{__html: `${html.sanitizeHtml(label)}${mandatory ? ' *' : ''}`}}/>\n </StyledStatedValueLabel>\n </StyledLabelWrapper>\n }\n </StyledStatedValueBox>\n {description\n && <StyledStatedValueDescription>{description}</StyledStatedValueDescription>}\n {showError && <StyledStatedValueError>\n <ErrorList error={error}/>\n </StyledStatedValueError>\n }\n </StyledStatedValueWrapper>\n )\n }}\n </FocusWithin>\n )\n}\n\nStatedValue.propTypes = {\n /**\n * A component to enter or display data.\n */\n children: PropTypes.node,\n /**\n * Visualize as display and not as field.\n */\n isDisplay: PropTypes.bool,\n /**\n * A helper text to instruct users.\n */\n description: PropTypes.string,\n /**\n * If true field is marked as changed.\n */\n dirty: PropTypes.bool,\n /**\n * Error object.\n */\n error: PropTypes.objectOf(PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n ),\n /**\n * Force label on secondaryPosition.\n */\n fixLabel: PropTypes.bool,\n /**\n * If true label is moved to uncover value.\n */\n hasValue: PropTypes.bool,\n /**\n * Focus target id by clicking on label.\n */\n id: PropTypes.string,\n /**\n * Describe editable value briefly.\n */\n label: PropTypes.string,\n /**\n * If true an asterisk is appended to the label.\n */\n mandatory: PropTypes.bool,\n /**\n * Append to label's alternative text.\n */\n mandatoryTitle: PropTypes.string,\n /**\n * Determines if value is editable\n */\n immutable: PropTypes.bool,\n /**\n * Pass a valid signal condition to omit auto detection\n */\n signal: PropTypes.string,\n /**\n * If true field was in focus.\n */\n touched: PropTypes.bool\n}\n\nexport default StatedValue\n","import styled, {css} from 'styled-components'\n\nimport {\n colorizeBorder,\n colorizeText,\n declareFocus,\n declareFont,\n scale,\n theme\n} from '../utilStyles'\nimport {StyledHtmlFormatter} from '../FormattedValue/typeFormatters/HtmlFormatter'\n\nconst borderWidth = '1.1px' // deliberately uneven to force correct rendering in chrome\n\nexport const getTextColor = ({\n isDisplay,\n secondaryPosition,\n immutable,\n signal,\n hasValue\n}) => {\n return signal\n ? 'signal'\n : hasValue\n ? 'hasValue'\n : isDisplay && secondaryPosition && immutable && !signal\n ? 'shade1'\n : isDisplay\n ? secondaryPosition\n ? 'shade0'\n : 'shade1'\n : secondaryPosition\n ? 'shade1'\n : immutable\n ? 'shade0'\n : signal\n ? 'signal'\n : 'shade1'\n}\n\nexport const getBorderColor = ({\n immutable,\n isDisplay,\n signal,\n isDirty\n}) => {\n return isDirty\n ? 'isDirty'\n : isDisplay || immutable\n ? 'transparent'\n : signal\n ? 'signal'\n : 'shade1'\n}\n\nconst transformLabel = ({secondaryPosition}) => css`\n &&& {\n ${secondaryPosition && css`\n top: 0;\n font-size: ${scale.font(-0.8)};\n margin: calc(${scale.font(-0.5)} / -2) 0 0;\n `}\n }\n`\n\nconst declareCursor = ({\n isDisplay,\n immutable\n}) => `cursor: ${(!isDisplay && immutable) ? 'not-allowed' : 'auto'};`\n\nexport const StyledLabelWrapper = styled.div`\n width: calc(100% - ${scale.space(0.5)});\n`\n\nexport const StyledStatedValueLabel = styled.label`\n &&& {\n ${declareFont({\n fontSize: scale.font(0),\n fontWeight: ({dirty}) => dirty ? theme.fontWeight('bold') : theme.fontWeight('regular'),\n lineHeight: 1\n })}\n background-color: ${theme.color('paper')};\n color: ${props => colorizeText[getTextColor(props)](props)};\n left: ${scale.space(-2)};\n margin: calc(${scale.font(0)} / -2) 0 0;\n padding: 1px ${scale.space(-2)}; // 1px to prevent label bottom from being cut\n position: absolute;\n top: 50%;\n width: ${({secondaryPosition}) => secondaryPosition ? 'auto' : 'inherit'};\n height: calc(${scale.font(0)} + 1px);\n overflow: hidden;\n ${props => transformLabel(props)}\n ${props => declareCursor(props)}\n pointer-events: ${({secondaryPosition}) => secondaryPosition ? 'auto' : 'none'};\n padding-left: ${({immutable}) => immutable && '0'};\n\n span {\n white-space: nowrap;\n }\n }\n`\n\nexport const StyledStatedValueBox = styled.div`\n &&& {\n border: ${borderWidth} solid ${props => colorizeBorder[getBorderColor(props)](props)};\n padding: ${scale.space(-1)} ${scale.space(-1)} ${scale.space(-2)} ${scale.space(-1)};\n position: relative;\n ${props => !props.immutable && declareFocus(props)}\n ${props => declareCursor(props)}\n margin-top: ${({isDisplay}) => isDisplay && scale.space(-1)};\n padding-left: ${({immutable}) => immutable && scale.space(-2)};\n padding-top: ${({\n isDisplay,\n immutable\n }) => isDisplay && immutable && scale.space(-1)};\n\n * {\n padding-left: ${({isDisplay}) => isDisplay && '0'};\n margin-bottom: 0;\n }\n\n > ${StyledHtmlFormatter} {\n padding-top: ${({isDisplay}) => isDisplay && scale.space(-1)};\n position: relative;\n top: 5px;\n\n p:first-of-type {\n margin-top: 0;\n }\n }\n }\n`\n\nexport const StyledStatedValueDescription = styled.p`\n &&& {\n ${declareFont({\n fontSize: scale.font(-1)\n })}\n }\n`\n\nexport const StyledStatedValueError = styled.div``\n\nexport const StyledStatedValueWrapper = styled.div`\n &&& {\n margin-bottom: ${scale.space(-1)};\n padding-top: ${scale.space(-2)};\n\n ${/* sc-selector */StyledStatedValueBox},\n ${/* sc-selector */StyledStatedValueDescription},\n ${/* sc-selector */StyledStatedValueError} {\n margin-bottom: ${scale.space(-2)};\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n ${/* sc-selector */StyledStatedValueDescription},\n ${/* sc-selector */StyledStatedValueError} {\n margin-left: calc(${scale.space(-1)} + ${borderWidth});\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor} from '../'\n\nexport const StyledResizeHandle = styled.span`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: ${({theme}) => shadeColor(_get(theme, 'colors.paper'), 3)};\n opacity: 0;\n width: 3px;\n cursor: col-resize;\n`\n\nconst ResizingController = ({\n column,\n startResize\n}) => <StyledResizeHandle\n data-cy={`header-cell-${column.id}-resizing-controller`}\n onMouseDown={startResize(column)}\n/>\n\nResizingController.propTypes = {\n column: PropTypes.shape({\n resizable: PropTypes.bool,\n id: PropTypes.string\n }).isRequired,\n startResize: PropTypes.func.isRequired\n}\n\nexport default ResizingController\n","import styled, {css} from 'styled-components'\nimport _get from 'lodash/get'\nimport {darken} from 'polished'\n\nimport {\n declareFont,\n theme,\n shadeColor,\n StyledScrollbar,\n scale\n} from '../'\nimport {StyledResizeHandle} from './ResizingController'\nimport {generateShades} from '../utilStyles'\n\nconst borderColor = ({theme}) => shadeColor(_get(theme, 'colors.paper'), 3)\nconst basePadding = scale.space(-1.5)\n\nexport const StyledTableCell = styled.td`\n padding: ${basePadding};\n background-color: ${theme.color('paper')};\n border-bottom: 1px solid ${borderColor};\n align-content: center;\n box-sizing: content-box;\n`\n\nexport const StyledDnD = styled.div`\n padding: ${basePadding};\n width: 100%;\n display: flex;\n align-items: center;\n opacity: ${({isDragged}) => isDragged ? 0.2 : 1};\n`\n\nexport const StyledTableHeaderCell = styled.th`\n position: sticky;\n top: 0;\n background-color: ${theme.color('paper')};\n text-align: left;\n border-bottom: 2px solid ${borderColor};\n ${declareFont({fontWeight: theme.fontWeight('bold')})};\n user-select: none;\n cursor: ${({sortable}) => sortable ? 'pointer' : 'auto'};\n white-space: nowrap;\n display: flex;\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.text}` : 'none'};\n ${({id}) => id === 'header-cell-navigation-column' && 'z-index: 1'};\n ${({isResizingThisCell, theme}) => isResizingThisCell && `\n background-color: ${generateShades(theme.colors.paper)[1]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n `\n }\n ${({isResizingAnyCell, theme}) => !isResizingAnyCell && `\n &:hover {\n background-color: ${generateShades(theme.colors.paper)[1]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n }\n `\n }\n ${({isResizingThisCell, sortable, fixedPosition, theme}) => !sortable\n ? `\n &:hover {\n background-color: ${theme.colors.paper};\n }\n `\n : !isResizingThisCell && !sortable && !fixedPosition && `\n &:hover {\n background-color: transparent;\n }\n `\n }\n`\n\nexport const StyledTableFooter = styled.div`\n grid-row-start: pagination-start;\n height: 40px;\n display: flex;\n align-items: center;\n border-top: 1px solid ${borderColor};\n`\n\nconst selectionStyles = css`\n display: contents;\n ${({clickable}) => clickable && 'cursor: pointer;'}\n\n &.selected {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[2]};\n }\n }\n\n &.selectableRow:not(.selected):hover {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[1]};\n }\n }\n`\n\nexport const StyledSortingSpan = styled.span`\n height: 100%;\n margin-right: 2px;\n`\n\nexport const StyledFullRowProgress = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n`\n\nexport const StyledFullRow = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n ${declareFont()};\n`\n\nexport const StyledTableHead = styled.thead`\n ${selectionStyles}\n`\n\nexport const StyledTableRow = styled.tr`\n ${selectionStyles}\n\n &:nth-child(even) td {\n background-color: ${({theme}) => darken(0.05, theme.colors.paper)};\n }\n`\n\nexport const StyledTableBody = styled.tbody`\n ${selectionStyles}\n`\n\nconst StyledTable = styled.table`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: auto;\n display: grid;\n border-collapse: collapse;\n grid-template-columns: ${({columns}) =>\n columns.map(column =>\n column.width\n ? column.width + 'px'\n : column.shrinkToContent\n ? 'max-content'\n : 'minmax(100px, auto)'\n ).join(' ')};\n grid-auto-rows: min-content;\n min-width: 100%;\n ${StyledScrollbar}\n`\n\nexport const StretchingTableContainer = styled.div`\n grid-row-start: table-start;\n position: relative;\n`\n\nexport const StyledTableWrapper = styled.div`\n display: grid;\n background-color: ${theme.color('paper')};\n grid-template-rows: [table-start] 1fr [pagination-start] auto auto;\n height: 100%;\n\n // reset external styles in old client\n input[type='checkbox'],\n input[type='radio'] {\n margin: 3px 3px 3px 4px !important;\n }\n\n @media screen and (max-height: 650px) {\n grid-template-rows: [table-start] 1fr [pagination-start] auto auto;\n }\n`\n\nexport const StyledDraggable = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n`\n\nexport default StyledTable\n","import {useState} from 'react'\n\nconst removeAllTextSelections = () => {\n if (document.getSelection) {\n document.getSelection().removeAllRanges()\n }\n}\n\nexport default (selection = [], currentKeys, onSelectChange) => {\n const [lastSelected, setLastSelected] = useState(null)\n\n const isSelected = key => selection.includes(key)\n\n const selectionChange = (key, value, shiftSelection) => {\n if (Array.isArray(key)) {\n onSelectChange(key, value)\n setLastSelected(null)\n } else {\n if (shiftSelection) {\n removeAllTextSelections()\n\n const idxLastSelection = lastSelected ? currentKeys.findIndex(k => k === lastSelected) : 0\n const idxSelection = currentKeys.findIndex(k => k === key)\n onSelectChange(\n currentKeys.slice(Math.min(idxLastSelection, idxSelection), Math.max(idxLastSelection, idxSelection) + 1),\n value\n )\n } else {\n onSelectChange([key], value || !isSelected(key))\n setLastSelected(key)\n }\n }\n }\n\n return {\n isSelected,\n selectionChange\n }\n}\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst SingleSelectCell = ({rowData, isSelected, selectionChange}) =>\n <div onClick={e => e.stopPropagation()}>\n <input type=\"radio\" checked={isSelected(rowData.__key)} onChange={e => {\n selectionChange(rowData.__key, e.target.value)\n }}/>\n </div>\n\nSingleSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired\n }).isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default SingleSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {rowDataPropType} from '../propTypes'\n\nconst MultiSelectCell = ({rowData, isSelected, selectionChange, rowIdx}) => {\n const rowSelectionState = rowData => isSelected(rowData.__key) ? 'checked' : 'unchecked'\n const rowSelectionChange = rowData => value => selectionChange(rowData.__key, value === 'checked')\n\n return <div onClick={e => {\n if (e.shiftKey) {\n selectionChange(rowData.__key, true, true)\n }\n e.stopPropagation()\n }}\n data-cy=\"list-selection-checkbox\"\n >\n <MultiCheckbox\n value={rowSelectionState(rowData)}\n onChange={rowSelectionChange(rowData)}\n label={`${rowData.__model} ${rowIdx + 1}`}\n id={'list-selection-checkbox ' + rowData.__key}/>\n </div>\n}\n\nMultiSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: rowDataPropType.isRequired,\n rowIdx: PropTypes.number,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {dataPropType} from '../propTypes'\n\nconst MultiSelectHeader = ({data, isSelected, selectionChange}) => {\n const allKeys = data.map(e => e.__key)\n const allRowsSelectionChange = v => {\n selectionChange(allKeys, v === 'checked')\n }\n\n const allRowsSelectionState = allKeys.every(k => isSelected(k))\n ? 'checked'\n : allKeys.some(k => isSelected(k))\n ? 'indeterminate'\n : 'unchecked'\n return data.length === 0\n ? null\n : <MultiCheckbox value={allRowsSelectionState} onChange={allRowsSelectionChange}/>\n}\n\nMultiSelectHeader.propTypes = {\n isSelected: PropTypes.func.isRequired,\n data: dataPropType.isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectHeader\n","import React from 'react'\n\nimport selectionStyles from './selectionStyles'\nimport SingleSelectCell from './SingleSelectCell'\nimport MultiSelectCell from './MultiSelectCell'\nimport MultiSelectHeader from './MultiSelectHeader'\n\nexport const getSelectionCell = (selectionStyle, columns, isSelected, selectionChange) => {\n if (selectionStyle && selectionStyle !== selectionStyles.NONE) {\n return selectionStyle === selectionStyles.MULTI\n ? getMultiSelectionCell(isSelected, selectionChange)\n : getSingleSelectionCell(isSelected, selectionChange)\n }\n return null\n}\n\nconst getSingleSelectionCell = (isSelected, selectionChange) => ({\n id: 'single-selection',\n width: 30,\n resizable: false,\n fixedPosition: true,\n dynamic: true,\n sorting: {\n sortable: false\n },\n HeaderRenderer: () => null,\n CellRenderer: props => <SingleSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n\nconst getMultiSelectionCell = (isSelected, selectionChange) => ({\n id: 'multi-selection',\n dynamic: true,\n resizable: false,\n fixedPosition: true,\n width: 30,\n sorting: {\n sortable: false\n },\n HeaderRenderer: props => <MultiSelectHeader {...props} isSelected={isSelected} selectionChange={selectionChange}/>,\n CellRenderer: props => <MultiSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Icon} from '../'\nimport {StyledSortingSpan} from './StyledTable'\n\nconst SortingState = ({column}) =>\n column.sorting && column.sorting.sortRank && column.sorting.order\n ? <StyledSortingSpan>\n <Icon icon={`sort-${column.sorting.order === 'asc' ? 'up' : 'down'}`}/>\n {column.sorting.sortRank > 1 && <span>{column.sorting.sortRank}</span>}\n </StyledSortingSpan>\n : null\n\nSortingState.propTypes = {\n column: PropTypes.shape({\n sorting: PropTypes.shape({\n sortable: PropTypes.bool,\n sortRank: PropTypes.number,\n order: PropTypes.oneOf(['asc', 'desc'])\n })\n }).isRequired\n}\n\nexport default SortingState\n","import React, {useCallback} from 'react'\nimport PropTypes from 'prop-types'\nimport {dragAndDrop, resize} from 'tocco-util'\n\nimport {StyledDnD, StyledTableHead, StyledTableHeaderCell, StyledTableRow, StyledDraggable} from './StyledTable'\nimport SortingState from './SortingState'\nimport ResizingController from './ResizingController'\nimport {columnPropType, dataPropType} from './propTypes'\n\nconst ThContent = ({column, data}) =>\n column.HeaderRenderer\n ? <column.HeaderRenderer column={column} data={data}/>\n : <div dangerouslySetInnerHTML={{__html: column.label}} title={column.label}/>\n\nThContent.propTypes = {\n data: dataPropType,\n column: columnPropType\n}\n\nconst TableHeader = props => {\n const {\n columns,\n data,\n onColumnPositionChange,\n onSortingChange,\n tableEl,\n onColumnWidthChanging,\n onColumnWidthChanged\n } = props\n const {dndEvents, dndState} = dragAndDrop.useDnD(onColumnPositionChange)\n\n const currentResizeElementSelector = resizeElement =>\n tableEl.current.querySelector(`th[id='header-cell-${resizeElement.id}']`)\n\n const handleResize = useCallback((el, {width}) => onColumnWidthChanging(el.id, width), [onColumnWidthChanging])\n const handleResizeFinsihed = useCallback(el => onColumnWidthChanged(el.id), [onColumnWidthChanged])\n \n const {\n startResize,\n resizingEvents,\n resizeState\n } = resize.useResize(\n currentResizeElementSelector,\n handleResize,\n handleResizeFinsihed)\n\n const {isResizing, resizingElement} = resizeState\n\n const thOnClick = column => e => {\n if (!isResizing && column.sorting && column.sorting.sortable) {\n onSortingChange(column.id, e.shiftKey)\n }\n }\n\n return <StyledTableHead {...resizingEvents}>\n <StyledTableRow>\n {columns.map(column => {\n const key = `header-cell-${column.id}`\n return <StyledTableHeaderCell\n key={key}\n data-cy={key}\n id={key}\n onClick={thOnClick(column)}\n isResizingAnyCell={isResizing}\n isResizingThisCell={isResizing && column.id === resizingElement?.id}\n sortable={column.sorting && column.sorting.sortable}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n >\n <StyledDraggable\n id={`header-cell-drop-${column.id}`}\n key={`header-cell-drop-${column.id}`}\n {...(!column.fixedPosition && {\n draggable: true,\n ...dndEvents(column.id)\n })}\n >\n <StyledDnD\n isDragged={dndState.currentlyDragging === column.id}\n >\n <SortingState column={column}/>\n <ThContent column={column} data={data}/>\n </StyledDnD>\n </StyledDraggable>\n {column.resizable && <ResizingController column={column} startResize={startResize}/>}\n </StyledTableHeaderCell>\n }\n )}\n </StyledTableRow>\n </StyledTableHead>\n}\n\nTableHeader.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n onColumnWidthChanging: PropTypes.func,\n onColumnWidthChanged: PropTypes.func,\n onColumnPositionChange: PropTypes.func,\n onSortingChange: PropTypes.func,\n tableEl: PropTypes.shape({current: PropTypes.object})\n}\n\nexport default TableHeader\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport {StyledTableCell} from './StyledTable'\nimport {Typography} from '../index'\nimport {columnPropType, rowDataPropType} from './propTypes'\n\nconst StaticCell = React.memo(({column, rowData, rowIdx}) => {\n return <StyledTableCell\n {...column.rightAligned === true && {style: {textAlign: 'right'}}}\n data-cy=\"list-cell\"\n >\n {column.CellRenderer\n ? <column.CellRenderer rowData={rowData} column={column} rowIdx={rowIdx}/>\n : <Typography.Span>{rowData[column.id]}</Typography.Span>\n }\n </StyledTableCell>\n})\n\nStaticCell.propTypes = {\n rowData: rowDataPropType.isRequired,\n column: columnPropType.isRequired,\n rowIdx: PropTypes.number\n}\n\nconst areEqual = (prevProps, nextProps) => {\n if (!prevProps.column.dynamic) {\n return true\n }\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(StaticCell, areEqual)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {Typography, LoadingSpinner} from '../'\nimport {StyledFullRow, StyledFullRowProgress, StyledTableBody, StyledTableRow} from './StyledTable'\nimport StaticCell from './StaticCell'\nimport {columnPropType, dataPropType} from './propTypes'\n\nconst InProgressRow = () => <StyledTableRow>\n <StyledFullRowProgress>\n <LoadingSpinner size=\"20\"/>\n <Typography.P>\n <FormattedMessage id=\"client.component.table.dataLoading\"/>\n </Typography.P>\n </StyledFullRowProgress>\n</StyledTableRow>\n\nconst NoDataRow = () => <StyledTableRow>\n <StyledFullRow>\n <Typography.Span>\n <FormattedMessage id=\"client.component.table.noData\"/>\n </Typography.Span>\n </StyledFullRow>\n</StyledTableRow>\n\nconst TableBody = ({data, columns, isSelected, selectionChange, dataLoadingInProgress, onRowClick, clickable}) => {\n const trOnClick = entity => e => {\n if (e.shiftKey) {\n selectionChange(entity.__key, true, true)\n } else if (e.metaKey || e.ctrlKey) {\n selectionChange(entity.__key)\n } else if (clickable && onRowClick) {\n onRowClick(entity.__key)\n }\n }\n\n return <StyledTableBody>\n {\n dataLoadingInProgress\n ? <InProgressRow/>\n : data.length > 0\n ? data.map((rowData, idx) =>\n <StyledTableRow\n key={`list-row-${rowData.__key}`}\n className={`selectableRow ${isSelected(rowData.__key) && 'selected'}`}\n onClick={trOnClick(rowData)}\n clickable={clickable}\n data-cy=\"list-row\"\n >\n {\n columns.map(column =>\n <StaticCell\n key={`table-static-cell-${rowData.__key}-${column.id}`}\n selected={isSelected(rowData.__key)}\n rowData={rowData}\n column={column}\n rowIdx={idx}\n />\n )\n }\n </StyledTableRow>\n )\n : <NoDataRow/>\n }\n </StyledTableBody>\n}\n\nTableBody.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n isSelected: PropTypes.func.isRequired,\n selectionChange: PropTypes.func,\n dataLoadingInProgress: PropTypes.bool,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool\n}\n\nexport default TableBody\n","import styled from 'styled-components'\n\nimport Button from '../Button'\nimport {scale} from '../'\n\nexport const StyledPagination = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-left: 5px;\n\n span {\n padding-right: 6px;\n }\n`\n\nexport const StyledPaginationButton = styled(Button)`\n padding: ${scale.space(-2)} ${scale.space(-0.8)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport ButtonGroup from '../ButtonGroup'\nimport Typography from '../Typography'\nimport {StyledPagination, StyledPaginationButton} from './StyledComponents'\n\n/**\n * Controlled Pagination component\n */\nconst Pagination = ({totalCount, recordsPerPage, currentPage, onPageChange, intl}) => {\n const totalPages = Math.ceil(totalCount / recordsPerPage)\n const start = Math.min((currentPage - 1) * recordsPerPage + 1, totalCount)\n const to = Math.min(currentPage * recordsPerPage, totalCount)\n\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledPagination>\n <ButtonGroup>\n <StyledPaginationButton\n disabled={currentPage === 1}\n label={msg('client.component.pagination.firstPageTitle')}\n iconOnly\n icon=\"chevron-double-left\"\n onClick={() => onPageChange(1)}/>\n <StyledPaginationButton\n disabled={currentPage === 1}\n label={msg('client.component.pagination.prePageTitle')}\n iconOnly\n icon=\"chevron-left\"\n onClick={() => onPageChange(currentPage - 1)}/>\n <StyledPaginationButton\n disabled={currentPage >= totalPages}\n label={msg('client.component.pagination.nextPageTitle')}\n iconOnly\n icon=\"chevron-right\"\n onClick={() => onPageChange(currentPage + 1)}/>\n <StyledPaginationButton\n disabled={currentPage >= totalPages}\n label={msg('client.component.pagination.lastPageTitle')}\n iconOnly\n icon=\"chevron-double-right\"\n onClick={() => onPageChange(totalPages)}/>\n </ButtonGroup>\n\n {totalCount > 0 && (\n <Typography.Span>\n <FormattedMessage id=\"client.component.pagination.text\" values={{\n start,\n to,\n total: totalCount\n }}/>\n </Typography.Span>)}\n </StyledPagination>\n )\n}\n\nPagination.propTypes = {\n intl: PropTypes.object.isRequired,\n /**\n * Currently displayed page\n */\n currentPage: PropTypes.number.isRequired,\n /**\n * Total of records available\n */\n totalCount: PropTypes.number,\n /**\n * Limit for a page\n */\n recordsPerPage: PropTypes.number.isRequired,\n /**\n * Callback on page change with provided button, returns new page as single argument\n */\n onPageChange: PropTypes.func.isRequired\n}\n\nexport default injectIntl(Pagination)\n","import Pagination from './Pagination'\n\nexport default Pagination\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\n\nimport {Pagination} from '../'\nimport {StyledTableFooter} from './StyledTable'\nimport Ball from '../Ball'\n\nconst TableFooter = ({onPageChange, onPageRefresh, paginationInfo, intl}) => {\n const showPagination = Boolean(paginationInfo)\n const showRefresh = typeof onPageRefresh === 'function'\n const showFooter = showPagination || showRefresh\n\n const msg = id => intl.formatMessage({id})\n\n if (!showFooter) {\n return null\n }\n\n return <StyledTableFooter>\n {showPagination && <Pagination\n onPageChange={onPageChange}\n currentPage={paginationInfo.currentPage}\n totalCount={paginationInfo.totalCount}\n recordsPerPage={paginationInfo.recordsPerPage}\n />}\n {showRefresh && <Ball\n type=\"button\"\n title={msg('client.component.table.refreshTitle')}\n icon=\"sync\"\n onClick={onPageRefresh}\n />}\n </StyledTableFooter>\n}\n\nTableFooter.propTypes = {\n intl: PropTypes.object.isRequired,\n onPageRefresh: PropTypes.func,\n onPageChange: PropTypes.func,\n /**\n * Used to display pagination\n */\n paginationInfo: PropTypes.shape({\n totalCount: PropTypes.number,\n currentPage: PropTypes.number,\n recordsPerPage: PropTypes.number\n })\n}\n\nexport default injectIntl(TableFooter)\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport StyledTable, {StretchingTableContainer, StyledTableWrapper} from './StyledTable'\nimport useSelection from './selection/useSelection'\nimport {selectionStylePropType} from './selection/selectionStyles'\nimport {getSelectionCell} from './selection/selectionColumnEnhancer'\nimport {columnPropType, dataPropType, keyPropType} from './propTypes'\nimport TableHeader from './TableHeader'\nimport TableBody from './TableBody'\nimport TableFooter from './TableFooter'\n\nconst Table = props => {\n const {\n selection,\n data,\n onSelectionChange,\n selectionStyle,\n paginationInfo,\n onColumnPositionChange,\n onSortingChange,\n dataLoadingInProgress,\n onRowClick,\n clickable,\n onPageChange,\n onPageRefresh\n } = props\n const [columns, setColumns] = useState(props.columns)\n const tableEl = useRef(null)\n\n const onColumnWidthChanged = useCallback(columnId => {\n const finalWidth = columns.find(c => c.id === columnId)?.width\n if (props.onColumnWidthChange) {\n props.onColumnWidthChange(columnId, finalWidth)\n }\n }, [columns])\n\n const onColumnWidthChanging = useCallback((columnId, width) => {\n setColumns([...columns.map(c => c.id === columnId\n ? {\n ...c,\n width\n }\n : c)])\n }, [columns])\n\n const {isSelected, selectionChange}\n = useSelection(selection, data ? data.map(e => e.__key) : [], onSelectionChange)\n\n useEffect(() => {\n const selectionColumn = getSelectionCell(selectionStyle, props.columns, isSelected, selectionChange)\n setColumns([...(selectionColumn ? [selectionColumn] : []), ...props.columns])\n }, [props.columns, selection])\n\n return <StyledTableWrapper>\n <StretchingTableContainer>\n <StyledTable ref={tableEl} columns={columns}>\n <TableHeader\n columns={columns}\n data={data}\n onColumnWidthChanging={onColumnWidthChanging}\n onColumnWidthChanged={onColumnWidthChanged}\n onColumnPositionChange={onColumnPositionChange}\n tableEl={tableEl}\n onSortingChange={onSortingChange}\n />\n <TableBody\n columns={columns}\n data={data}\n isSelected={isSelected}\n selectionChange={selectionChange}\n dataLoadingInProgress={dataLoadingInProgress}\n onRowClick={onRowClick}\n clickable={clickable}\n />\n </StyledTable>\n </StretchingTableContainer>\n <TableFooter onPageChange={onPageChange} onPageRefresh={onPageRefresh} paginationInfo={paginationInfo}/>\n </StyledTableWrapper>\n}\n\nTable.propTypes = {\n /**\n * Array of column definitions. Determines how the cells are rendered.\n */\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n /**\n * List of data to be displayed in the table. Should contain a __key property.\n */\n data: dataPropType,\n /**\n * True if data loading is in process.\n */\n dataLoadingInProgress: PropTypes.bool,\n /**\n * Used to display pagination\n */\n paginationInfo: PropTypes.shape({\n totalCount: PropTypes.number,\n currentPage: PropTypes.number,\n recordsPerPage: PropTypes.number\n }),\n /**\n * Determines if a select row is added\n */\n selectionStyle: selectionStylePropType,\n /**\n * List of selected keys\n */\n selection: PropTypes.arrayOf(keyPropType),\n /**\n * Boolean flag to disable clicking on rows\n */\n clickable: PropTypes.bool,\n /**\n * Callback for selection changes\n */\n onSelectionChange: PropTypes.func,\n /**\n * Callback on page change\n */\n onPageChange: PropTypes.func,\n /**\n * Callback on page reload\n */\n onPageRefresh: PropTypes.func,\n /**\n * Callback if a column is drag and dropped to a new position\n */\n onColumnPositionChange: PropTypes.func,\n /**\n * Callback if sorting changed\n */\n onSortingChange: PropTypes.func,\n /**\n * Callback if column got resized with drag and drop\n */\n onColumnWidthChange: PropTypes.func,\n /**\n * Callback if a row is clicked\n */\n onRowClick: PropTypes.func\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(Table, areEqual)\n","import _get from 'lodash/get'\n\nimport {shadeColor} from '../utilStyles'\n\nconst colorizeText = {\n shade0: ({theme}) => _get(theme, 'colors.text'),\n shade1: ({theme}) => shadeColor(_get(theme, 'colors.text'), 3.5),\n shade2: ({theme}) => shadeColor(_get(theme, 'colors.text'), 5.5),\n signal: ({theme, signal}) => _get(theme, `colors.signal.${signal}.text`),\n hasValue: ({theme}) => _get(theme, 'colors.signal.info.text')\n}\n\nconst colorizeBorder = {\n shade0: ({theme}) => _get(theme, 'colors.paper'),\n shade1: ({theme}) => shadeColor(_get(theme, 'colors.paper'), 2),\n shade2: ({theme}) => shadeColor(_get(theme, 'colors.paper'), 4),\n signal: ({theme, signal}) => _get(theme, `colors.signal.${signal}.text`),\n isDirty: ({theme}) => _get(theme, 'colors.secondaryLight'),\n transparent: () => 'transparent'\n}\n\nexport {colorizeBorder, colorizeText}\n","import _pick from 'lodash/pick'\nimport _get from 'lodash/get'\nimport _set from 'lodash/set'\nimport _reduce from 'lodash/reduce'\nimport _isObject from 'lodash/isObject'\n\nconst metaFields = {\n KEY: '__key',\n MODEL: '__model',\n VERSION: '__version'\n}\n\nexport const relationFieldTypes = ['single-select-box', 'multi-select-box', 'single-remote-field', 'multi-remote-field']\nexport const relevantRelationAttributes = ['key', 'display', 'model', 'version']\n\nconst typeValueExtractor = (type, value) => {\n switch (type) {\n case 'entity':\n return value ? _pick(value, relevantRelationAttributes) : null\n case 'entity-list':\n return value.length > 0 ? value.map(childValue => _pick(childValue, relevantRelationAttributes)) : null\n case 'login':\n return _get(value, 'username')\n case 'longitude':\n case 'latitude':\n return _get(value, 'value')\n default:\n return value\n }\n}\n\n/**\n * Transforms a entity object into a flatten structure wil only one hierarchy of properties.\n * @param {object} entity - Entity as retrieved by the rest endpoint.\n */\nexport const getFlattenEntity = entity => ({\n [metaFields.KEY]: entity.key,\n [metaFields.MODEL]: entity.model,\n [metaFields.VERSION]: entity.version,\n ...flattenPaths(entity.paths)\n})\n\nexport const flattenPaths = (paths, currentPath = []) =>\n _reduce(\n paths,\n (acc, path, pathId) => {\n let subPaths = {}\n if (path.value) {\n if (Array.isArray(path.value)) {\n subPaths = path.value.reduce((acc, v) => {\n const flatten = flattenPaths(v.paths, [...currentPath, pathId])\n const combinedArrayVales = _reduce(flatten, (acc2, val, key) =>\n ({...acc2, [key]: [...(acc[key] || []), val]}), {})\n return {...acc, ...combinedArrayVales}\n }, {})\n } else {\n subPaths = flattenPaths(path.value.paths, [...currentPath, pathId])\n }\n }\n\n return {...acc, [[...currentPath, pathId].join('.')]: typeValueExtractor(path.type, path.value), ...subPaths}\n },\n {}\n )\n\n/**\n * Transforms a flatten entity back to a api compatible entity object. Only regards fields that are marked as dirty.\n * @param {object} flattenEntity - Entity that was prior transformed with 'getFlattenEntity'\n * @param {array} dirtyFields - Optional list of dirty field names (paths). If undefined, all paths are applied\n */\nexport const toEntity = (flattenEntity, dirtyFields) => {\n const ignoredPath = path => (Object.values(metaFields).includes(path))\n || (dirtyFields && !dirtyFields.some(dirtyField => dirtyField === path || dirtyField.startsWith(path + '.')))\n\n const valueSimplifier = value => {\n if (Array.isArray(value)) {\n return value.map(v => valueSimplifier(v))\n }\n\n return _isObject(value) ? _pick(value, ['key', 'version', 'id']) : value\n }\n\n const paths = Object.keys(flattenEntity).reduce((acc, path) => {\n if (!ignoredPath(path)) {\n const t = path.split('.').join('.paths.')\n return _set(acc, t, valueSimplifier(flattenEntity[path]))\n }\n return acc\n }, {})\n\n return {\n model: flattenEntity[metaFields.MODEL],\n key: flattenEntity[metaFields.KEY],\n version: flattenEntity[metaFields.VERSION],\n paths\n }\n}\n","const isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\n/**\n * Transforms nice form column definitions in a tocco-ui table compatible format.\n * @param {array} columns - columns from table form definition\n * @param {array} sorting - sorting array with field and order attributes\n * @param {function} cellRenderer - Function to return rendered cell given data and column definition\n */\nexport const getColumnDefinition = (columns, sorting, cellRenderer, ...args) => {\n if (!columns) {\n return []\n }\n return columns\n .filter(column => !column.hidden)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map((c, idx) => (\n {\n idx: idx,\n id: c.id,\n label: c.label,\n sorting: {\n sortable: c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) => column.children.map(child => cellRenderer(child, rowData, ...args))\n }\n ))\n}\n","import {getFlattenEntity, flattenPaths, toEntity, relationFieldTypes, relevantRelationAttributes} from './entities'\nimport {getDisplayRequest, getPathDisplayRequest} from './display'\nimport {getColumnDefinition} from './table'\n\nexport default {\n relationFieldTypes,\n relevantRelationAttributes,\n getFlattenEntity,\n flattenPaths,\n toEntity,\n getPathDisplayRequest,\n getDisplayRequest,\n getColumnDefinition\n}\n","import _get from 'lodash/get'\nimport _set from 'lodash/set'\n\nconst alreadyLoaded = (model, key, lazyData) => {\n return !!_get(lazyData, ['defaultDisplays', model, key], '')\n}\n\nconst alreadyInRequest = (model, key, request) => {\n return _get(request, [model], []).includes(key)\n}\n\n/**\n * Gets a request object to retrieve all the displays of the given paths within the entities.\n *\n * @param {array} entities - List of all entities.\n * @param {object} relationPaths - Field that need a display to be loaded\n * @param {object} lazyData - Optional object with the already loaded displays to shrink the request.\n */\nexport const getPathDisplayRequest = (entities, relationPaths, lazyData) => {\n const request = {}\n entities.forEach(entity => {\n relationPaths.forEach(field => {\n if (entity[field]) {\n const fieldValue = entity[field]\n const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue]\n\n values.forEach(value => {\n const {model, key} = value\n\n if (!alreadyLoaded(model, key, lazyData) && !alreadyInRequest(model, key, request)) {\n _set(request, [model], [..._get(request, [model], []), key])\n }\n })\n }\n })\n })\n\n return request\n}\n\n/**\n * Gets a request object to retrieve all displays of the entities.\n *\n * @param {array} entities - List of all entities.\n */\nexport const getDisplayRequest = entities => (\n entities.reduce((acc, val) => ({\n ...acc,\n [val.model]: [...(acc[val.model] || []), val.key]\n }\n ), {})\n)\n","import {isEqual} from 'lodash'\nimport {useState} from 'react'\n\nconst initialState = {\n currentlyDragging: null,\n currentlyDragOver: null,\n dropPosition: null,\n offset: null\n}\n\nexport const DropPosition = {\n Top: 'Top',\n Bottom: 'Bottom'\n}\n\nexport default changePosition => {\n const [state, setState] = useState(initialState)\n\n const events = item => ({\n onDragStart: e => {\n setState({...state, currentlyDragging: item})\n \n /**\n * Workaround: https://github.com/facebook/react/issues/1355\n * dragEnd-event is not fired in React for already removed components.\n * That's why we need to add the event listener for this event on the dom node directly.\n */\n const draggableElement = e.target\n const onDragEnd = dragEndEvent => {\n setState(initialState)\n dragEndEvent.stopPropagation()\n if (draggableElement) {\n draggableElement.removeEventListener('dragend', onDragEnd)\n }\n }\n if (draggableElement) {\n draggableElement.addEventListener('dragend', onDragEnd, false)\n }\n\n e.stopPropagation()\n },\n onDragEnter: e => {\n if (state.currentlyDragging && !isEqual(state.currentlyDragOver, item)) {\n const bounding = e.target ? e.target.getBoundingClientRect() : {}\n const offset = bounding.y + (bounding.height / 2)\n setState({...state, currentlyDragOver: item, offset})\n }\n e.stopPropagation()\n },\n onDragOver: e => {\n if (state.currentlyDragging) {\n const after = e.clientY - state.offset > 0\n const dropPosition = after ? DropPosition.Bottom : DropPosition.Top\n setState(state => ({...state, dropPosition}))\n e.preventDefault()\n e.stopPropagation()\n return true\n }\n },\n onDrop: e => {\n if (state.currentlyDragging && state.currentlyDragOver) {\n changePosition(state.currentlyDragging, state.currentlyDragOver, state.dropPosition)\n setState(initialState)\n e.stopPropagation()\n }\n }\n })\n\n return {dndEvents: events, dndState: state}\n}\n","import useDnD, {DropPosition} from './useDnD'\n\nexport default {useDnD, DropPosition}\n","import queryStringUtil from 'query-string'\nimport _isObject from 'lodash/isObject'\nimport _mapValues from 'lodash/mapValues'\n\n/**\n * Build query string from params map object.\n *\n * Note: object values will be JSON-stringified\n *\n * @param obj The params map.\n * @returns the params map as query string.\n */\nexport const toQueryString = obj => {\n const stringifiedValues = _mapValues(obj, value => _isObject(value) ? JSON.stringify(value) : value)\n return queryStringUtil.stringify(stringifiedValues)\n}\n\n/**\n * Get params map object from query string.\n *\n * Note: param values that represent a JSON string will be parsed and returned as object.\n *\n * @param queryString The query string to parse.\n * @returns the query string as parsed object.\n */\nexport const fromQueryString = queryString => {\n const obj = queryStringUtil.parse(queryString)\n return _mapValues(obj, value => hasJsonStructure(value) ? JSON.parse(value) : value)\n}\n\nexport const hasJsonStructure = str => {\n if (typeof str !== 'string') {\n return false\n }\n try {\n const parsed = JSON.parse(str)\n const type = Object.prototype.toString.call(parsed)\n return type === '[object Object]'\n } catch (err) {\n return false\n }\n}\n","import {fromQueryString, toQueryString} from './queryString'\nexport default {\n fromQueryString,\n toQueryString\n}\n","const measureSize = (lastPosition, currentPosition, currentSize) => {\n const diff = currentPosition - lastPosition\n return Math.max(50, currentSize + diff)\n}\n\nexport default measureSize\n","import useResize from './useResize'\n\nexport default {useResize}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport measureSize from './measureSize'\n\n/**\n * resizingElementSelector: (resizingElement) => HtmlElement\n * selector to retrieve the current HtmlElement for taking size measurements\n *\n * resizeCallback: (resizingElement, size) => void\n * gets called on every mouse move with the new size ({height, width})\n *\n * resizeFinishedCallback: (resizingElement) => void\n * gets called when user has finished moving the element (on mouseUp)\n */\nexport default (resizingElementSelector, resizeCallback, resizeFinishedCallback) => {\n const [resizingElement, setResizingElement] = useState(null)\n const lastPosition = useRef(null)\n const handler = useRef()\n\n /**\n * Workaround:\n * Problem:\n * The `onClick` event after the `onMouseUp` should still be handled within the \"resizing\"-context.\n * However any follow up `onMouseMove` should not be handled within the \"resizing\"-context anymore.\n * Solution:\n * Therefore we have an `isResizing` state which we will propagate to the outside\n * which will switch to `false` AFTER the follow up `onClick` event.\n * And we have an `isResizingInternal` state which will switch to `false` IMMEDIATELY and\n * can be used in any follow up `onMouseMove` handler.\n */\n const [isResizing, setIsResizing] = useState(false)\n const [isResizingInternal, setIsResizingInternal] = useState(false)\n\n const resizeState = useMemo(() => ({resizingElement, isResizing}), [resizingElement, isResizing])\n\n const startResize = element => e => {\n setResizingElement(element)\n setIsResizing(true)\n setIsResizingInternal(true)\n lastPosition.current = undefined\n\n // stop any further events e.g. `onDragStart`\n e.stopPropagation()\n e.preventDefault()\n }\n\n const onMouseUp = useCallback(() => {\n if (resizingElement) {\n resizeFinishedCallback(resizingElement)\n setIsResizingInternal(false)\n\n /**\n * Workaround:\n * The follow up `onClick` event should still be within the context of \"resizing\".\n * Therefore change these state in the next cycle after the `onClick` event fired already.\n */\n setTimeout(() => {\n setIsResizing(false)\n setResizingElement(null)\n lastPosition.current = undefined\n }, 0)\n }\n }, [resizingElement, resizeFinishedCallback])\n\n const onMouseMove = useCallback(e => {\n if (resizingElement && isResizingInternal) {\n handler.current = requestAnimationFrame(() => {\n if (lastPosition.current) {\n const element = resizingElementSelector(resizingElement)\n\n const height = measureSize(lastPosition.current.y, e.clientY, element.clientHeight)\n const width = measureSize(lastPosition.current.x, e.clientX, element.clientWidth)\n\n resizeCallback(resizingElement, {height, width})\n }\n \n lastPosition.current = {y: e.clientY, x: e.clientX}\n })\n }\n }, [resizingElement, resizeCallback, isResizingInternal])\n\n const events = {\n onMouseMove,\n onMouseUp\n }\n\n useEffect(() => {\n if (!isResizingInternal) {\n cancelAnimationFrame(handler.current)\n }\n\n return () => {\n cancelAnimationFrame(handler.current)\n }\n }, [isResizingInternal])\n\n return {resizeState, startResize, resizingEvents: events}\n}\n","import _isObject from 'lodash/isObject'\nimport moment from 'moment'\n\nconst isDefined = v => v !== null && v !== undefined && v !== ''\n\nexport const getTql = (path, value, fieldType) => {\n if (!isDefined(value)) {\n return null\n }\n\n const type = fieldType || guessType(value)\n value = rangeMappings(type)(value)\n\n const isRangeValue = value && typeof value === 'object' && value.isRangeValue\n const typeHandler = typeHandlers(type)\n\n if (isRangeValue) {\n return handleRangeValue(value, typeHandler, path)\n } else {\n return typeHandler(path, value, '==')\n }\n}\n\nconst handleRangeValue = (value, typeHandler, path) => (\n [\n ...(isDefined(value.from) ? [typeHandler(path, value.from, '>=')] : []),\n ...(isDefined(value.to) ? [typeHandler(path, value.to, value.exclusive ? '<' : '<=')] : [])\n ].join(' and ')\n)\n\nconst rangeMappings = type => {\n switch (type) {\n case 'datetime':\n case 'createts':\n case 'updatets':\n return value => {\n const momentValue = moment(value, 'YYYY-MM-DD', true)\n if (momentValue.isValid()) {\n return {\n from: value,\n to: momentValue.add(1, 'd'),\n isRangeValue: true,\n exclusive: true\n }\n } else {\n return value\n }\n }\n default:\n return value => value\n }\n}\n\nconst typeHandlers = type => {\n switch (type) {\n case 'multi-select-box':\n case 'multi-remote-field':\n return (path, value) => `KEYS(\"${path}\",${value.map(v => v.key).join(',')})`\n case 'single-remote-field':\n case 'single-select-box':\n return (path, value) => `${path}.pk == ${value.key}`\n case 'fulltext-search':\n return (path, value) => path === 'txtFulltext'\n ? `(fulltext(\"${value}\") or fulltext(\"${value}*\"))`\n : `(fulltext(\"${value}\", ${path}) or fulltext(\"${value}*\", ${path}))`\n case 'birthdate':\n case 'date':\n case 'create_timestamp':\n return (path, value, comp) => `${path} ${comp} date:\"${value}\"`\n case 'datetime':\n case 'createts':\n case 'updatets':\n return (path, value, comp) => `${path} ${comp} datetime:\"${moment(value).utc().format('YYYY-MM-DD HH:mm')}\"`\n case 'time':\n return (path, value, comp) => `${path} ${comp} time:\"${moment(value, 'HH:mm').format('HH:mm:ss.sss')}\"`\n case 'compressed-text':\n case 'string':\n case 'createuser':\n case 'updateuser':\n return (path, value) => `${path} ~= \"${value}\"`\n case 'boolean':\n return (path, value) => value === false ? null : `${path} == ${value}`\n case 'marking':\n return (path, value) => value === false ? null : `exists(${path})`\n default:\n return (path, value, comp) => `${path} ${comp} ${value}`\n }\n}\n\n// For fields that are not in the search form (e.g. parent and preselectedSearchFields)\nconst guessType = value => {\n if (_isObject(value) && value.key) {\n return 'single-select-box'\n }\n\n if (Array.isArray(value) && value.every(v => !!v.key)) {\n return 'multi-select-box'\n }\n\n return 'string'\n}\n","import {getTql} from './tqlBuilder'\n\nexport default {getTql}\n","/**\n * extracts the first error message of a validation failed response object\n */\nexport const getErrorCompact = errors => {\n for (const error of errors) {\n if (error.entityValidatorErrors) {\n return getFirstElement(error.entityValidatorErrors)[0]\n }\n\n if (error.paths) {\n return getFirstElement(getFirstElement(error.paths))[0]\n }\n }\n\n return null\n}\n\nconst getFirstElement = obj => Object.keys(obj).length >= 1 ? obj[Object.keys(obj)[0]] : undefined\n","import {getErrorCompact} from './validation'\n\nexport default {getErrorCompact}\n","\nimport _get from 'lodash/get'\n\nlet persistedViews = {}\n\nexport const viewInfoSelector = location =>\n _get(persistedViews, [location, 'info'], {})\n\nexport const persistViewInfo = (location, info, level = 0) => {\n persistedViews = {\n ...persistedViews,\n [location]: {\n level,\n info: {...(_get(persistedViews, [location, 'info'], {})), ...info}\n }\n }\n}\n\nexport const clearPersistedViews = (level = 0) => {\n persistedViews = {\n ...(Object.keys(persistedViews).reduce((acc, key) => {\n const persistedView = persistedViews[key]\n return {...acc, ...(persistedView.level < level && {[key]: persistedView})}\n }, {}))\n }\n}\n","import {viewInfoSelector, persistViewInfo, clearPersistedViews} from './viewPersistor'\n\nexport default {persistViewInfo, viewInfoSelector, clearPersistedViews}\n","export const CONNECT_LOGIN = 'two-factor-connector/CONNECT_LOGIN'\nexport const INITIALIZE = 'two-factor-connector/INITIALIZE'\nexport const SET_TWO_STEP_ACTIVE = 'two-factor-connector/SET_TWO_STEP_ACTIVE'\nexport const SET_SECRET = 'two-factor-connector/SET_SECRET'\nexport const SET_USER_NAME = 'two-factor-connector/SET_USER_NAME'\nexport const REQUEST_SECRET = 'two-factor-connector/REQUEST_SECRET'\nexport const GO_TO_SECRET_VERIFICATION = 'two-factor-connector/GO_TO_SECRET_VERIFICATION'\nexport const GO_TO_START = 'two-factor-connector/GO_TO_START'\nexport const GO_TO_SECRET = 'two-factor-connector/GO_TO_SECRET'\nexport const VERIFY_CODE = 'two-factor-connector/VERIFY_CODE'\nexport const SUCCESS = 'root/SUCCESS'\nexport const SET_SETUP_SUCCESSFUL = 'root/SET_SETUP_SUCCESSFUL'\nexport const GO_TO_RESULT = 'root/GO_TO_RESULT'\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setTwoFactorActive = twoFactorActive => ({\n type: SET_TWO_STEP_ACTIVE,\n payload: {\n twoFactorActive\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n\nexport const setUserName = username => ({\n type: SET_USER_NAME,\n payload: {\n username\n }\n})\n\nexport const requestSecret = () => ({\n type: REQUEST_SECRET\n})\n\nexport const goToSecretVerification = () => ({\n type: GO_TO_SECRET_VERIFICATION\n})\n\nexport const goToStart = () => ({\n type: GO_TO_START\n})\n\nexport const goToSecret = () => ({\n type: GO_TO_SECRET\n})\n\nexport const verifyCode = userCode => ({\n type: VERIFY_CODE,\n payload: {\n userCode\n }\n})\n\nexport const success = () => ({\n type: SUCCESS\n})\n\nexport const setSetupSuccessful = setupSuccessful => ({\n type: SET_SETUP_SUCCESSFUL,\n payload: {\n setupSuccessful\n }\n})\n\nexport const goToResult = () => ({\n type: GO_TO_RESULT\n})\n","import {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {rest, externalEvents} from 'tocco-app-extensions'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst twoFactorField = 'relTwo_step_login_status'\nconst twoFactorActiveState = '1'\n\nexport const usernameSelector = state => state.twoFactorConnector.username\nexport const secretSelector = state => state.twoFactorConnector.secret\nexport const inputSelector = state => state.input\n\nexport function* requestSecret() {\n const {secret: inputSecret} = yield select(inputSelector)\n if (!inputSecret) {\n const username = yield select(usernameSelector)\n const principalsResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`, {method: 'GET'})\n const {secret, totpUri} = principalsResponse.body\n yield put(actions.setSecret({secret, uri: totpUri}))\n }\n yield put(actions.goToSecret())\n}\n\n/* the regular two-factor endpoint can only be accessed while logged in to secure against anonymous activation of\n two-factor validation on arbitrary accounts, so without a session we send a request to the login servlet which uses\n the forced two-factor authenticator to validate login data and activate the two-factor login */\nfunction* activateTwoFactorWithoutSession(secret, userCode, username, password) {\n const data = {\n secret,\n userCode,\n username,\n password\n }\n const response = yield call(rest.requestSaga, 'nice2/login',\n {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n }),\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n })\n\n yield put(actions.setSetupSuccessful(_get(response, 'body.TWOSTEPLOGIN_ACTIVATION.success', false)))\n}\n\nfunction* activateTwoFactor(username, secret, code) {\n const codeVerifyResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`,\n {\n method: 'POST',\n body: {\n secret,\n code\n },\n acceptedStatusCodes: [400]\n })\n\n yield put(actions.setSetupSuccessful(codeVerifyResponse.status === 204))\n}\n\nexport function* verifyCode({payload: {userCode}}) {\n const username = yield select(usernameSelector)\n const {secret} = yield select(secretSelector)\n const {password, forced} = yield select(inputSelector)\n\n if (forced) {\n yield call(activateTwoFactorWithoutSession, secret, userCode, username, password)\n } else {\n yield call(activateTwoFactor, username, secret, userCode)\n }\n yield put(actions.goToResult())\n}\n\nexport function* initialize() {\n yield call(loadPrincipal2FAInfo)\n const {secret} = yield select(inputSelector)\n if (secret) {\n yield put(actions.setSecret(secret))\n }\n yield put(actions.goToStart())\n}\n\nexport function* success() {\n yield put(externalEvents.fireExternalEvent('onSuccess'))\n}\n\nexport function* loadPrincipal2FAInfo() {\n const username = yield call(getUsername)\n yield put(actions.setUserName(username))\n const where = `username === \"${username}\"`\n const principals = yield call(rest.fetchEntities, 'Principal', {where, paths: [twoFactorField]})\n\n if (principals.length > 1) {\n throw new Error(`More than one user found for username ${username}`)\n }\n\n const twoFactorKey = _get(principals, `[0].paths.${twoFactorField}.value.key`)\n const twoFactorActive = twoFactorKey === twoFactorActiveState\n\n yield put(actions.setTwoFactorActive(twoFactorActive))\n}\n\nfunction* getUsername() {\n const {username: inputUsername} = yield select(inputSelector)\n if (inputUsername) {\n return inputUsername\n } else {\n const principalsResponse = yield call(rest.requestSaga, 'principals')\n return principalsResponse.body.username\n }\n}\n\nexport function* fireResize() {\n yield put(externalEvents.fireExternalEvent('onResize'))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.REQUEST_SECRET, requestSecret),\n takeLatest(actions.VERIFY_CODE, verifyCode),\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.SUCCESS, success),\n takeLatest(actions.GO_TO_START, fireResize),\n takeLatest(actions.GO_TO_SECRET, fireResize),\n takeLatest(actions.GO_TO_SECRET_VERIFICATION, fireResize),\n takeLatest(actions.GO_TO_RESULT, fireResize)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst setStage = stage => state => ({\n ...state,\n stage\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TWO_STEP_ACTIVE]: reducerUtil.singleTransferReducer('twoFactorActive'),\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret'),\n [actions.SET_USER_NAME]: reducerUtil.singleTransferReducer('username'),\n [actions.SET_SETUP_SUCCESSFUL]: reducerUtil.singleTransferReducer('setupSuccessful'),\n [actions.GO_TO_START]: setStage(0),\n [actions.GO_TO_SECRET]: setStage(1),\n [actions.GO_TO_SECRET_VERIFICATION]: setStage(2),\n [actions.GO_TO_RESULT]: setStage(3)\n}\n\nconst initialState = {\n stage: null,\n twoFactorActive: null,\n secret: null,\n username: null,\n setupSuccessful: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport twoFactorConnector from './reducer'\n\nexport default {\n twoFactorConnector\n}\n\nexport const sagas = [rootSaga]\n","import styled from 'styled-components'\nimport {scale, StyledButton} from 'tocco-ui'\n\nexport const StyledButtonWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: ${scale.space(0.5)};\n\n > ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\n\nconst Start = ({twoFactorActive, forced, requestSecret, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <>\n <Typography.P>\n {\n twoFactorActive\n ? <FormattedMessage id=\"client.two-factor-connector.overwriteInfo\"/>\n : forced\n ? <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.forcedInfo')}}/>\n : <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.info')}}/>\n }\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.nextButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={requestSecret}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nStart.propTypes = {\n intl: PropTypes.object.isRequired,\n requestSecret: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n forced: PropTypes.bool\n}\n\nexport default Start\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize, requestSecret} from '../../modules/actions'\nimport Start from './Start'\n\nconst mapActionCreators = {\n initialize,\n requestSecret\n}\n\nconst mapStateToProps = state => ({\n twoFactorActive: state.twoFactorConnector.twoFactorActive,\n secret: state.twoFactorConnector.secret,\n forced: state.input.forced\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Start))\n","import Start from './StartContainer'\n\nexport default Start\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledQRCodeWrapper = styled.div`\n display: flex;\n justify-content: center;\n margin: ${scale.space(1.2)} ${scale.space(1)} ${scale.space(1.5)} ${scale.space(1)};\n`\n\nexport const StyledParagraph = styled.div`\n display: flex;\n justify-content: center;\n margin-top: ${scale.space(-1)};\n margin-bottom: ${scale.space(-0.9)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {QRCode, Typography, Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledQRCodeWrapper, StyledParagraph} from './StyledComponents'\n\nconst Secret = ({secret, goToSecretVerification}) => {\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.qrCodeInfo\"/>\n </Typography.P>\n <StyledQRCodeWrapper>\n <QRCode value={secret.uri}/>\n </StyledQRCodeWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.secretInfo\"/>\n </Typography.P>\n <StyledParagraph>\n <Typography.B>{secret.secret}</Typography.B>\n </StyledParagraph>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.backupInfo\"/>\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n ink=\"primary\"\n look=\"raised\"\n onClick={goToSecretVerification}\n >\n <FormattedMessage id=\"client.two-factor-connector.nextButton\"/>\n </Button>\n </StyledButtonWrapper>\n </>\n}\n\nSecret.propTypes = {\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n goToSecretVerification: PropTypes.func.isRequired\n}\n\nexport default Secret\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Secret from './Secret'\nimport {goToSecretVerification} from '../../modules/actions'\n\nconst mapActionCreators = {\n goToSecretVerification\n}\n\nconst mapStateToProps = state => ({\n secret: state.twoFactorConnector.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Secret))\n","import Secret from './SecretContainer'\n\nexport default Secret\n","import styled from 'styled-components'\nimport {StyledEditableWrapperCss} from 'tocco-ui'\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, EditableValue, StatedValue, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledLoginFormInputWrapper} from './StyledComponents'\n\nconst Verification = ({verifyCode, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const msg = id => intl.formatMessage({id})\n const handleVerifyClick = () => verifyCode(userCode)\n\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.verificationText\"/>\n </Typography.P>\n <form onSubmit={e => {\n e.preventDefault()\n e.stopPropagation()\n if (userCode && userCode.toString().length >= 6) {\n handleVerifyClick()\n }\n }}>\n <StatedValue\n hasValue={!!userCode}\n id=\"verification-input\"\n label={msg('client.two-factor-connector.verificationInputLabel')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n type=\"submit\"\n disabled={!userCode || userCode.toString().length < 6}\n />\n </StyledButtonWrapper>\n </form>\n </>\n}\n\nVerification.propTypes = {\n intl: PropTypes.object.isRequired,\n verifyCode: PropTypes.func.isRequired\n}\n\nexport default Verification\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Verification from './Verification'\nimport {verifyCode} from '../../modules/actions'\n\nconst mapActionCreators = {\n verifyCode\n}\n\nconst mapStateToProps = (state, props) => ({\n\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Verification))\n","import Verification from './VerificationContainer'\n\nexport default Verification\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledMessageWrapper = styled.div`\n display: grid;\n grid-template-columns: 9% 1fr;\n grid-column-gap: ${scale.space(-0.5)};\n`\n\nexport const StyledIconWrapper = styled.span`\n display: flex;\n align-items: center;\n color: ${({isSuccessful}) => isSuccessful ? theme.color('signal.success.text') : theme.color('signal.danger.text')};\n font-size: ${scale.font(10)};\n\n > * {\n max-width: 100%;\n }\n`\n\nexport const StyledTextWrapper = styled.div`\n display: flex;\n align-items: center;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography, Icon} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledMessageWrapper, StyledIconWrapper, StyledTextWrapper} from './StyledComponents'\n\nconst Result = ({success, goToStart, setupSuccessful, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n if (setupSuccessful) {\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={true}>\n <Icon icon={'check'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.successfulText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={success}\n />\n </StyledButtonWrapper>\n </>\n )\n }\n\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={false}>\n <Icon icon={'times'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.errorText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={goToStart}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nResult.propTypes = {\n intl: PropTypes.object.isRequired,\n success: PropTypes.func.isRequired,\n goToStart: PropTypes.func.isRequired,\n setupSuccessful: PropTypes.bool\n}\n\nexport default Result\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {success, goToStart} from '../../modules/actions'\nimport Result from './Result'\n\nconst mapActionCreators = {\n success,\n goToStart\n}\n\nconst mapStateToProps = state => ({\n setupSuccessful: state.twoFactorConnector.setupSuccessful\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Result))\n","import Result from './ResultContainer'\n\nexport default Result\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {notification} from 'tocco-app-extensions'\n\nimport Start from '../Start'\nimport Secret from '../Secret'\nimport Verification from '../Verification'\nimport Result from '../Result'\n\nconst stages = {\n Start: 0,\n Secret: 1,\n Verification: 2,\n Result: 3\n}\n\nconst TwoFactorConnector = ({initialize, stage}) => {\n useEffect(() => {\n initialize()\n }, [])\n\n const renderContent = () => {\n switch (stage) {\n case stages.Start:\n return <Start/>\n case stages.Secret:\n return <Secret/>\n case stages.Verification:\n return <Verification/>\n case stages.Result:\n return <Result/>\n default:\n return <LoadMask/>\n }\n }\n\n return (\n <>\n <notification.Notifications/>\n {renderContent()}\n </>\n )\n}\n\nTwoFactorConnector.propTypes = {\n stage: PropTypes.number,\n initialize: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n secret: PropTypes.shape({\n secret: PropTypes.string,\n uri: PropTypes.string\n })\n}\n\nexport default TwoFactorConnector\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize} from '../../modules/actions'\nimport TwoFactorConnector from './TwoFactorConnector'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = state => ({\n stage: state.twoFactorConnector.stage\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoFactorConnector))\n","import TwoFactorConnector from './TwoFactorConnectorContainer'\n\nexport default TwoFactorConnector\n","import React, {useEffect, useState} from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, errorLogging, externalEvents, notification} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport TwoFactorConnector from './components/TwoFactorConnector'\n\nconst packageName = 'two-factor-connector'\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <TwoFactorConnector/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n\n notification.addToStore(store, true)\n errorLogging.addToStore(store, true, ['console', 'remote', 'notification'])\n externalEvents.addToStore(store, events)\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/reducer', () => {\n const reducers = require('./modules/reducer').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst EXTERNAL_EVENTS = [\n 'onSuccess',\n 'onCancel',\n 'onResize'\n]\n\nconst TwoFactorConnectorApp = props => {\n const [app, setApp] = useState(null)\n useEffect(() => {\n const events = EXTERNAL_EVENTS.reduce((events, event) => (\n {...events, ...(props[event] && {[event]: props[event]})}\n ), {})\n\n setApp(initApp('two-factor-connector', props, events))\n }, [])\n\n return app ? app.component : null\n}\n\nTwoFactorConnectorApp.propTypes = {\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {}),\n username: PropTypes.string,\n password: PropTypes.string,\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }),\n forced: PropTypes.bool\n}\n\nexport default TwoFactorConnectorApp\n","module.exports = __webpack_public_path__ + \"imgs/tocco-circle.25b8cb1141417ffc7763e9309b5a36ec.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_red.6ab51a129d1195d204cd84e69da2f044.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_white.8f9290d80aa3635828f36920cf13aa11.svg\";"],"sourceRoot":""}
|