diff --git a/.gitignore b/.gitignore index 30527c7d..9e28974e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ pom.xml.asc *.class /.lein-* /.nrepl-port -/resources/public/js/compiled +resources/public/js/compiled *.log examples/ \#*\# diff --git a/config/dev.edn b/config/dev.edn index 8a49fc09..e0b68e0c 100644 --- a/config/dev.edn +++ b/config/dev.edn @@ -1,5 +1,6 @@ {:db {:server "localhost"} :scheme "http" + :base-url "http://localhost:3449" :solr-uri "http://localhost:8983" :solr-impl :solr :client-config {:server-type :dev-local @@ -24,103 +25,22 @@ :yodlee-cobrand-name "restserver" :yodlee-cobrand-login "sbCobda48aa19712a83c3ca4e935dd5e5d46b1a" :yodlee-cobrand-password "0a07ea32-1b5d-461b-ad0f-2752cdd77602" - :yodlee-user-login "sbMemda48aa19712a83c3ca4e935dd5e5d46b1a4" + :yodlee-user-login "G7T9kiwaG8rMiykdV4pckmQnfj4OM2pf" :yodlee-user-password "sbMemda48aa19712a83c3ca4e935dd5e5d46b1a4#123" :yodlee-base-url "https://developer.api.yodlee.com/ysl" :yodlee-app "10003600" - :yodlee-fastlink "https://node.developer.yodlee.com/authenticate/restserver/?channelAppName=restserver" + :yodlee-fastlink "https://fl4.sandbox.yodlee.com/authenticate/restserver/fastlink" :run-web? true :run-background? true :dd-env "dev" :dd-service "integreat-app" - :yodlee2-admin-user "e02b38f9-9865-4264-8e4f-6a5ac2c500b0_ADMIN" + :yodlee2-admin-user "50ec7e57-297d-4970-941e-1cb07b8dcb4e_ADMIN" :yodlee2-integreat-user "integreat-main" - :yodlee2-client-id "l6sUyK2NEq3mwopISHlFGWUcJ1U8OUQd" - :yodlee2-client-secret "wZQHoGEkv5AGG2ZH" - :yodlee2-base-url "https://development.api.yodlee.com/ysl" - :yodlee2-fastlink "https://fl4.preprod.yodlee.com/authenticate/USDevexPreProd2-195/fastlink/?channelAppName=usdevexpreprod2" - - :square-config {"NGE1" - {:square-location "SCX0Y8CTGM1S0", - :location "UC", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGOP" - {:square-location "L3GMNBFARX9GG", - :location "OP", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGDG" - {:square-location "LQTHXQY69MYB6", - :location "DB", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGPG" - {:square-location "AMQ0NPA8FGDEF", - :location "SZ", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGEZ" - {:square-location "L0Z167T2T7W7F", - :location "JS", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGLK" - {:square-location "LRC7WVD77ZM81", - :location "SM", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGA1" - {:square-location "FZ3ZYC77T3W1T", - :location "KA", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGKG" - {:square-location "8JT71V8XGYAT3", - :location "NB", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGEB" - {:square-location "LEV4GM1JPJS6R", - :location "CV", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGGG" - {:square-location "L7S9MXZBJ00HY", - :location "LM", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGRV" - {:square-location "L0J45VZKHWXVR", - :location "RV", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGSM" - {:square-location "LG5X0MHA4NZDM", - :location "SM", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGZO" - {:square-location "KMVFQ9CRCXJ10", - :location "VT", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGWL" - {:square-location "LSWNP14T0YKD9", - :location "WL", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGMJ" - {:square-location "FNH5VRT890WK8", - :location "SC", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGHG" - {:square-location "LXJCAHYGZVNEJ", - :location "DC", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGVZ" - {:square-location "ACNTYY8WVZ6DV", - :location "NP", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGAK" - {:square-location "2RVBYER6QSV7W", - :location "MH", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}, - "NGGH" - {:square-location "LT322EK0S2TRD", - :location "FM", - :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"} - "20TY" - {:square-location "L2579ATQ0X1ET", - :location "WG", - :token "EAAAEEr749Ea6AdPTdngsmUPwIM3ETbPwcx3QQl_NS0KWuIL-JNzAg4f3W9DGQhb"}} - + :yodlee2-test-user "sbMem5f61421aba2161" + :yodlee2-client-id "G7T9kiwaG8rMiykdV4pckmQnfj4OM2pf" + :yodlee2-client-secret "8I0mmq1wmAWSSpr9" + :yodlee2-base-url "https://sandbox.api.yodlee.com/ysl" + :yodlee2-fastlink "https://fl4.sandbox.yodlee.com/authenticate/restserver/fastlink" :intuit {:client-id "ABBAQI0qeck149vEC1e8tV6b3YJNujOCdwsUMkJ1ZoptzumyYu" :client-secret "7DriIEend1K9RHlzhupIxPFQozXHELLfeFW2GfTR" :redirect-uri "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl"}} diff --git a/config/prod-cloud.edn b/config/prod-cloud.edn index 44b742d7..db5449f8 100644 --- a/config/prod-cloud.edn +++ b/config/prod-cloud.edn @@ -1,5 +1,6 @@ {:scheme "https" :db-name "prod-mirror2" + :base-url "https://prod-cloud.app.integreatconsult.com" :solr-uri "http://solr-prod-cloud.local:8983" :solr-impl :solr :datomic-url "datomic:ddb://us-east-1/iol-dev/dev" diff --git a/config/prod.edn b/config/prod.edn index ed829225..6629a8cd 100644 --- a/config/prod.edn +++ b/config/prod.edn @@ -1,5 +1,6 @@ {:db {:server "database"} :datomic-url "datomic:ddb://us-east-1/integreat/integreat-prod" + :base-url "https://app.integreatconsult.com" :solr-uri "http://solr-prod.local:8983" :solr-impl :solr :scheme "https" @@ -23,7 +24,6 @@ :yodlee-proxy-port 8888 :run-background? false :run-web? true - :yodlee2-admin-user "93398522-412b-470d-8400-3691392b12fb_ADMIN" :yodlee2-integreat-user "integreat-main" :yodlee2-client-id "3AATcwfPsWP1rP9oDoo4HvZhtaroGVcA" :yodlee2-client-secret "cXTBmKbGfkaBFIpM" diff --git a/data/inference-outcome.csv b/data/inference-outcome.csv new file mode 100644 index 00000000..35d51ccc --- /dev/null +++ b/data/inference-outcome.csv @@ -0,0 +1,1871 @@ +,transaction,best_vendor,best_account,confidence +2,7375524016070717,6891738899426960,101155069755498,0.8820305 +9,7406310341674089,6891738899431434,101155069755498,0.9972274 +10,7393116202138345,6891738899431434,101155069755498,0.99865675 +11,7419504481208074,6891738899431434,101155069755498,0.99880815 +12,7410708388184670,6891738899431434,101155069755498,0.9974873 +13,7419504481218904,6891738899431434,101155069755498,0.9982944 +14,7419504481207955,6891738899431434,101155069755498,0.9982961 +15,7393116202139150,6891738899430508,101155069755498,0.9683728 +43,7393116202119634,6891738899431499,101155069755498,0.98397344 +44,7204000201967862,6891738899431499,101155069755498,0.99966 +45,7384320109106309,6891738899431499,101155069755498,0.9995789 +46,7278766992720605,6891738899431499,101155069755498,0.99992275 +47,7454688853344701,6891738899431499,101155069755498,0.9996809 +48,7384320109084176,6891738899431499,101155069755498,0.99981064 +49,7265572853191149,6891738899431499,101155069755498,0.99878305 +50,7195204108925870,6891738899431499,101155069755498,0.9998323 +51,7265572853180808,6891738899431499,101155069755498,0.9994603 +52,7459086899859663,6891738899431499,101155069755498,0.99929535 +53,7296359178777838,6891738899431499,101155069755498,0.9997775 +54,7393116202118754,6891738899431499,101155069755498,0.99986696 +55,7353533783487642,6891738899431499,101155069755498,0.99982566 +56,7463484946370446,6891738899431499,101155069755498,0.99935395 +57,7441494713784294,6891738899431499,101155069755498,0.99964607 +58,7300757225308029,6891738899431499,101155069755498,0.99945027 +59,7353533783476503,6891738899431499,101155069755498,0.99924797 +60,7300757225311308,6891738899431499,101155069755498,0.99970347 +61,7287563085773279,6891738899431499,101155069755498,0.9997032 +62,7212796294988315,6891738899431499,101155069755498,0.999845 +63,7353533783487801,6891738899431499,101155069755498,0.9997894 +64,7406310341676762,6891738899431499,101155069755498,0.9499903 +65,7423902527749145,6891738899431499,101155069755498,0.9996456 +66,7318349411369342,6891738899431499,101155069755498,0.9995807 +67,7459086899859815,6891738899431499,101155069755498,0.99935335 +68,7401912295165083,6891738899431499,101155069755498,0.99973696 +69,7388718155600749,6891738899431499,101155069755498,0.99982697 +70,7265572853191105,6891738899431499,101155069755498,0.99993837 +71,7371125969557199,6891738899431499,101155069755498,0.9998623 +72,7555843923185794,6891738899431499,101155069755498,0.9998801 +73,7357931830004992,6891738899431499,101155069755498,0.9993605 +74,7353533783487813,6891738899431499,101155069755498,0.9998192 +75,7401912295165014,6891738899431499,101155069755498,0.97123575 +76,7234786527584605,6891738899431499,101155069755498,0.9996537 +77,7300757225306962,6891738899431499,101155069755498,0.9995807 +78,7384320109087217,6891738899431499,101155069755498,0.99652666 +79,7472281039392856,6891738899431499,101155069755498,0.99935323 +80,7379922062584624,6891738899431499,101155069755498,0.99979204 +81,7437096667294162,6891738899431499,101155069755498,0.99980944 +82,7287563085747385,6891738899431499,101155069755498,0.9974221 +83,7393116202113882,6891738899431499,101155069755498,0.99820983 +84,7472281039392895,6891738899431499,101155069755498,0.9988764 +85,7234786527577233,6891738899431499,101155069755498,0.9981317 +86,7459086899859751,6891738899431499,101155069755498,0.99887735 +87,7459086899859703,6891738899431499,101155069755498,0.9992949 +88,7204000201967910,6891738899431499,101155069755498,0.999426 +89,7287563085747313,6891738899431499,101155069755498,0.9999025 +90,7357931830014297,6891738899431499,101155069755498,0.9992261 +91,7503067365024257,6891738899431499,101155069755498,0.9986803 +92,7230388481073915,6891738899431499,101155069755498,0.9996538 +93,7371125969558760,6891738899431499,101155069755498,0.9999217 +94,7327145504388516,6891738899431499,101155069755498,0.9998989 +95,7371125969549167,6891738899431499,101155069755498,0.99973696 +96,7432698620769790,6891738899431499,101155069755498,0.96603274 +97,7459086899850257,6891738899431499,101155069755498,0.99086505 +98,7331543550909023,6891738899431499,101155069755498,0.9999008 +99,7173213876371317,6891738899431499,101155069755498,0.9996743 +100,7371125969557225,6891738899431499,101155069755498,0.99599695 +101,7388718155600692,6891738899431499,101155069755498,0.9997477 +102,7393116202118786,6891738899431499,101155069755498,0.9985055 +103,7265572853191113,6891738899431499,101155069755498,0.9999397 +104,7287563085774234,6891738899431499,101155069755498,0.9995807 +105,7384320109084175,6891738899431499,101155069755498,0.99956876 +106,7278766992720417,6891738899431499,101155069755498,0.9975631 +107,7371125969556963,6891738899431499,101155069755498,0.99987257 +108,7410708388195262,6891738899431499,101155069755498,0.9995969 +109,7401912295164979,6891738899431499,101155069755498,0.9709839 +110,7371125969555589,6891738899431499,101155069755498,0.9961612 +111,7401912295164970,6891738899431499,101155069755498,0.96404606 +112,7419504481229795,6891738899431499,101155069755498,0.99968016 +113,7300757225306899,6891738899431499,101155069755498,0.9995809 +114,7463484946370997,6891738899431499,101155069755498,0.9992944 +115,7366727923049406,6891738899431499,101155069755498,0.99973375 +116,7388718155601791,6891738899431499,101155069755498,0.9998932 +117,7296359178781865,6891738899431499,101155069755498,0.99858165 +118,7428300574243492,6891738899431499,101155069755498,0.96879107 +119,7195204108925876,6891738899431499,101155069755498,0.9998203 +120,7287563085754557,6891738899431499,101155069755498,0.9977252 +121,7555843923185774,6891738899431499,101155069755498,0.99985933 +122,7278766992720581,6891738899431499,101155069755498,0.9999242 +123,7287563085754514,6891738899431499,101155069755498,0.9998776 +124,7463484946370953,6891738899431499,101155069755498,0.9988764 +125,7371125969552918,6891738899431499,101155069755498,0.9994604 +126,7234786527584616,6891738899431499,101155069755498,0.9996538 +127,7371125969555637,6891738899431499,101155069755498,0.99990857 +128,7454688853339535,6891738899431499,101155069755498,0.99937075 +129,7498669318502603,6891738899431499,101155069755498,0.99840456 +130,7274368946207419,6891738899431499,101155069755498,0.9999138 +131,7472281039392834,6891738899431499,101155069755498,0.9993537 +132,7437096667267542,6891738899431499,101155069755498,0.9997049 +133,7419504481218887,6891738899431499,101155069755498,0.999423 +134,7300757225311342,6891738899431499,101155069755498,0.9997032 +135,7366727923042183,6891738899431499,101155069755498,0.9993162 +136,7467882992890463,6891738899431499,101155069755498,0.99988484 +137,7520659551076135,6891738899431499,101155069755498,0.99992216 +138,7419504481229785,6891738899431108,101155069755498,0.9076722 +139,7256776760165601,6874146713381684,101155069755498,0.90578693 +140,7256776760165640,6874146713381684,101155069755498,0.87459755 +141,7388718155600206,6874146713381684,101155069755498,0.93064946 +142,7432698620764161,6891738899427024,101155069755498,0.9913657 +144,7309553318323835,6891738899431297,101155069755498,0.99797994 +145,7195204108937229,6891738899433273,101155069755498,0.9966893 +146,7234786527562323,6891738899433273,101155069755498,0.9972765 +147,7393116202141652,6891738899431492,101155069755498,0.9959746 +148,7353533783504120,6891738899430721,101155069755498,0.99609333 +151,7371125969557050,6874146713381364,101155069755498,0.999905 +152,7278766992720689,6874146713381364,101155069755498,0.9998981 +153,7265572853193239,6874146713381364,101155069755498,0.9997154 +154,7428300574252127,6874146713381364,101155069755498,0.9935759 +155,7388718155601786,6874146713381364,101155069755498,0.9997948 +156,7516261504546438,6874146713381364,101155069755498,0.9951061 +157,7287563085747377,6874146713381364,101155069755498,0.99988973 +158,7287563085754527,6874146713381364,101155069755498,0.99984777 +159,7274368946213260,6874146713381364,101155069755498,0.9998816 +160,7371125969558750,6874146713381364,101155069755498,0.9999032 +161,7274368946207442,6874146713381364,101155069755498,0.9997305 +162,7375524016066652,6874146713381364,101155069755498,0.9999157 +163,7375524016066474,6874146713381364,101155069755498,0.9998097 +164,7507465411524394,6874146713381364,101155069755498,0.99005973 +165,7362329876534270,6874146713381364,101155069755498,0.99989176 +166,7256776760160405,6891738899426920,101155069755498,0.99968016 +167,7265572853189856,6891738899426920,101155069755498,0.99935347 +168,7476679085908956,6891738899426920,101155069755498,0.9996321 +169,7357931829996174,6891738899426920,101155069755498,0.99968696 +170,7287563085747236,6891738899426920,101155069755498,0.99972516 +172,7278766992738893,6882942806404219,101155069755498,0.96263045 +174,7362329876535665,6891738899432322,101155069755498,0.9928093 +175,7529455644107178,6891738899432322,101155069755498,0.99032193 +176,7371125969552907,6891738899432278,101155069755498,0.8260893 +177,7353533783487914,6891738899433014,101155069755508,0.97364 +178,7261174806676906,101155069755482,101155069755508,0.9990036 +179,7353533783499931,101155069755482,101155069755508,0.9970192 +180,7173213876375254,101155069755482,101155069755508,0.99866664 +181,7300757225304971,101155069755482,101155069755508,0.9959721 +182,7375524016055632,101155069755482,101155069755508,0.9983303 +183,7274368946202213,101155069755482,101155069755508,0.9986665 +184,7503067365024226,101155069755482,101155069755508,0.9976386 +185,7560241969711904,101155069755482,101155069755508,0.98745793 +186,7300757225306722,6891738899432835,101155069755508,0.9991553 +187,7256776760145017,6891738899432835,101155069755508,0.9993457 +188,7428300574251142,6891738899432835,101155069755508,0.9989147 +189,7300757225306981,6891738899432835,101155069755508,0.99905306 +190,7322747457869210,6891738899432835,101155069755508,0.9989881 +191,7423902527743833,6891738899432835,101155069755508,0.9992099 +192,7230388481059910,6891738899432835,101155069755508,0.9976494 +193,7186408015914362,6891738899432835,101155069755508,0.9992099 +194,7195204108948058,6891738899432835,101155069755508,0.99926084 +195,7300757225309674,6891738899432835,101155069755508,0.99914944 +196,7190806062435001,6891738899432835,101155069755508,0.99927396 +197,7234786527584687,6891738899432835,101155069755508,0.9991493 +198,7252378713628635,6891738899432835,101155069755508,0.9992182 +199,7256776760145003,6891738899432835,101155069755508,0.999316 +200,7256776760140770,6891738899432835,101155069755508,0.9990233 +201,7300757225306733,6891738899432835,101155069755508,0.999257 +202,7204000201958003,6891738899432835,101155069755508,0.99927396 +203,7287563085774318,6891738899432835,101155069755508,0.9992304 +204,7476679085906140,6891738899432835,101155069755508,0.99335974 +205,7247980667118720,6891738899432835,101155069755508,0.99920005 +206,7459086899863592,6891738899432835,101155069755508,0.99500763 +207,7195204108948121,6891738899432835,101155069755508,0.9992607 +208,7190806062409346,6891738899432835,101155069755508,0.99209845 +209,7212796294989986,6891738899432835,101155069755508,0.99927396 +210,7318349411369335,6891738899432835,101155069755508,0.99925345 +211,7256776760143613,6891738899432835,101155069755508,0.9987972 +212,7195204108927402,6891738899432835,101155069755508,0.9992099 +213,7300757225307939,6891738899432835,101155069755508,0.99927264 +214,7300757225306862,6891738899432835,101155069755508,0.9992254 +215,7190806062435087,6891738899432835,101155069755508,0.9992099 +216,7287563085774337,6891738899432835,101155069755508,0.9992254 +217,7441494713793280,6891738899432835,101155069755508,0.9989147 +218,7256776760141271,6891738899432835,101155069755508,0.9989837 +219,7313951364844467,6891738899432835,101155069755508,0.9991493 +220,7195204108948115,6891738899432835,101155069755508,0.99927396 +221,7300757225307987,6891738899432835,101155069755508,0.99913687 +222,7296359178799765,6891738899432835,101155069755508,0.9992725 +223,7450290806816330,6891738899432835,101155069755508,0.9108708 +224,7195204108948185,6891738899432835,101155069755508,0.9992304 +225,7300757225311495,6891738899432835,101155069755508,0.9992254 +226,7230388481073997,6891738899432835,101155069755508,0.9989837 +227,7287563085773274,6891738899432835,101155069755508,0.99928826 +228,7274368946213107,6891738899432835,101155069755508,0.99591225 +229,7212796294989823,6891738899432835,101155069755508,0.99926347 +230,7256776760140744,6891738899432835,101155069755508,0.99921715 +231,7256776760140757,6891738899432835,101155069755508,0.9991493 +232,7256776760140841,6891738899432835,101155069755508,0.9989837 +233,7256776760140775,6891738899432835,101155069755508,0.9991493 +234,7300757225309582,6891738899432835,101155069755508,0.9989837 +235,7287563085773289,6891738899432835,101155069755508,0.9991167 +236,7300757225306976,6891738899432835,101155069755508,0.9992637 +237,7204000201967878,6891738899432835,101155069755508,0.9992662 +238,7195204108948210,6891738899432835,101155069755508,0.9990233 +239,7569038062739187,6891738899432835,101155069755508,0.9924476 +240,7234786527586098,6891738899432835,101155069755508,0.99921715 +241,7318349411369433,6891738899432835,101155069755508,0.9989837 +242,7520659551067393,6891738899432835,101155069755508,0.9924326 +244,7322747457873481,6891738899432835,101155069755508,0.99927264 +245,7300757225311387,6891738899432835,101155069755508,0.9992304 +246,7173213876371315,6891738899432835,101155069755508,0.99927396 +247,7503067365011967,6891738899432835,101155069755508,0.9995067 +248,7234786527584543,6891738899432835,101155069755508,0.9991429 +249,7441494713793253,6891738899432835,101155069755508,0.9989147 +250,7375524016071457,6891738899432835,101155069755508,0.9890372 +251,7186408015914369,6891738899432835,101155069755508,0.99927396 +252,7437096667270130,6891738899432835,101155069755508,0.99873 +253,7300757225306786,6891738899432835,101155069755508,0.9991326 +254,7423902527739761,6891738899432835,101155069755508,0.9989147 +255,7291961132288852,6891738899432835,101155069755508,0.99922025 +256,7190806062434209,6891738899432835,101155069755508,0.99925786 +257,7300757225307073,6891738899432835,101155069755508,0.99905294 +258,7252378713628612,6891738899432835,101155069755508,0.99933773 +259,7322747457873492,6891738899432835,101155069755508,0.99922025 +260,7195204108947769,6891738899432835,101155069755508,0.99921715 +261,7384320109087090,6891738899432835,101155069755508,0.9957377 +262,7234786527586058,6891738899432835,101155069755508,0.99921715 +263,7190806062434210,6891738899432835,101155069755508,0.99934584 +264,7287563085774308,6891738899432835,101155069755508,0.99927264 +265,7287563085773222,6891738899432835,101155069755508,0.99922025 +266,7243582620610884,6891738899432835,101155069755508,0.99925774 +267,7287563085774323,6891738899432835,101155069755508,0.9989837 +268,7199602155459080,6891738899432835,101155069755508,0.9991429 +269,7375524016066543,6891738899432835,101155069755508,0.9957482 +270,7300757225308023,6891738899432835,101155069755508,0.9992674 +271,7296359178799694,6891738899432835,101155069755508,0.99890304 +272,7234786527584540,6891738899432835,101155069755508,0.99921715 +273,7190806062434255,6891738899432835,101155069755508,0.99933773 +274,7300757225309572,6891738899432835,101155069755508,0.99905354 +275,7296359178796160,6891738899432835,101155069755508,0.99905294 +276,7247980667118799,6891738899432835,101155069755508,0.9989837 +277,7190806062435023,6891738899432835,101155069755508,0.99928635 +278,7204000201957941,6891738899432835,101155069755508,0.99922633 +279,7287563085773204,6891738899432835,101155069755508,0.9989837 +280,7230388481073002,6891738899432835,101155069755508,0.99921834 +281,7234786527586077,6891738899432835,101155069755508,0.99921715 +282,7195204108948206,6891738899432835,101155069755508,0.9992637 +283,7186408015914303,6891738899432835,101155069755508,0.99922645 +284,7195204108927420,6891738899432835,101155069755508,0.9992662 +285,7190806062434940,6891738899432835,101155069755508,0.9992766 +286,7195204108927408,6891738899432835,101155069755508,0.99927396 +287,7318349411369394,6891738899432835,101155069755508,0.99914753 +288,7195204108947777,6891738899432835,101155069755508,0.99922645 +289,7520659551073583,6891738899432835,101155069755508,0.9966538 +290,7230388481074598,6891738899432835,101155069755508,0.9991374 +291,7419504481229827,6891738899432835,101155069755508,0.9987301 +292,7287563085773227,6891738899432835,101155069755508,0.99927753 +293,7318349411369398,6891738899432835,101155069755508,0.9992034 +294,7173213876371364,6891738899432835,101155069755508,0.99927396 +295,7388718155601310,6891738899432835,101155069755508,0.9993311 +296,7300757225307080,6891738899432835,101155069755508,0.9992248 +297,7234786527586005,6891738899432835,101155069755508,0.9991374 +298,7415106434707179,6891738899432835,101155069755508,0.99924624 +299,7247980667119537,6891738899432835,101155069755508,0.9991374 +300,7375524016071328,6891738899432835,101155069755508,0.9939902 +301,7199602155458906,6891738899432835,101155069755508,0.9992607 +302,7204000201969439,6891738899432835,101155069755508,0.9991153 +303,7283165039233379,6891738899432835,101155069755508,0.99937385 +304,7278766992732814,6891738899432835,101155069755508,0.9954852 +305,7309553318321931,6891738899432835,101155069755508,0.99362296 +306,7322747457873464,6891738899432835,101155069755508,0.9989015 +307,7529455644113295,6891738899432566,101155069755508,0.9983499 +308,7503067365011976,6891738899432566,101155069755508,0.9992981 +309,7428300574238390,6891738899432566,101155069755508,0.99900407 +310,7388718155600679,6891738899432566,101155069755508,0.99823856 +311,7393116202141162,6891738899432566,101155069755508,0.99852544 +312,7252378713625150,6891738899432566,101155069755508,0.9980819 +313,7252378713625141,6891738899432566,101155069755508,0.9973109 +314,7503067365011962,6891738899432566,101155069755508,0.9990921 +315,7256776760137881,6891738899432566,101155069755508,0.99787927 +316,7287563085747359,6891738899432566,101155069755508,0.99506605 +317,7327145504412157,6891738899432566,101155069755508,0.9988275 +318,7177611922887302,6891738899432566,101155069755508,0.9991874 +319,7190806062425114,6891738899432566,101155069755508,0.998884 +320,7401912295171495,6891738899432566,101155069755508,0.9982034 +321,7274368946207436,6891738899432566,101155069755508,0.9940971 +322,7177611922887380,6891738899432566,101155069755508,0.99888057 +323,7327145504412111,6891738899432566,101155069755508,0.9982608 +324,7529455644113290,6891738899432566,101155069755508,0.99792767 +325,7428300574238387,6891738899432566,101155069755508,0.9992206 +326,7379922062584700,6891738899432566,101155069755508,0.9953323 +327,7230388481073895,6891738899432566,101155069755508,0.99354845 +328,7371125969558982,6891738899432566,101155069755508,0.99424523 +329,7265572853193219,6891738899432566,101155069755508,0.99754983 +330,7327145504412138,6891738899432566,101155069755508,0.9988649 +331,7327145504412967,6891738899432566,101155069755508,0.9981645 +332,7269970899700465,6891738899432566,101155069755508,0.99515414 +333,7265572853192558,6891738899432566,101155069755508,0.99808466 +334,7393116202113991,6891738899432566,101155069755508,0.99423146 +335,7362329876535570,6891738899432566,101155069755508,0.9979849 +336,7190806062425125,6891738899432566,101155069755508,0.99946207 +337,7401912295171583,6891738899432566,101155069755508,0.9448945 +338,7393116202134894,6891738899432566,101155069755508,0.99842393 +339,7371125969557350,6891738899432566,101155069755508,0.994414 +340,7243582620598747,6891738899432566,101155069755508,0.9977477 +341,7287563085747308,6891738899432566,101155069755508,0.99383885 +342,7560241969717553,6891738899432566,101155069755508,0.9994025 +343,7327145504412152,6891738899432566,101155069755508,0.99858296 +344,7362329876535575,6891738899432566,101155069755508,0.9986261 +345,7503067365011958,6891738899432566,101155069755508,0.9990895 +346,7560241969717587,6891738899432566,101155069755508,0.998871 +347,7362329876535562,6891738899432566,101155069755508,0.99828583 +348,7388718155624566,6891738899432566,101155069755508,0.9987822 +349,7428300574238829,6891738899432566,101155069755508,0.99900633 +350,7327145504412159,6891738899432566,101155069755508,0.99852496 +351,7247980667124815,6891738899432566,101155069755508,0.9970162 +352,7393116202141172,6891738899432566,101155069755508,0.99820733 +353,7393116202134893,6891738899432566,101155069755508,0.9990356 +354,7547047830157925,6891738899432566,101155069755508,0.9986772 +355,7190806062425133,6891738899432566,101155069755508,0.99924207 +356,7190806062420303,6891738899432566,101155069755508,0.9994118 +357,7256776760137914,6891738899432566,101155069755508,0.99819714 +359,7212796294988273,6891738899432566,101155069755508,0.99443746 +360,7371125969555048,6891738899432566,101155069755508,0.99748826 +361,7560241969717562,6891738899432566,101155069755508,0.9992125 +362,7371125969556985,6891738899432566,101155069755508,0.9952691 +363,7256776760137874,6891738899432566,101155069755508,0.9985513 +364,7437096667294525,6874146713382768,101155069755508,0.996182 +365,7459086899850412,6874146713382768,101155069755508,0.99617165 +366,7300757225291166,6874146713382768,101155069755508,0.9988199 +367,7432698620769726,6874146713382768,101155069755508,0.99855155 +368,7313951364850822,6874146713382768,101155069755508,0.99832195 +369,7459086899850441,6874146713382768,101155069755508,0.9961701 +370,7432698620769717,6874146713382768,101155069755508,0.9985505 +371,7313951364850989,6874146713382768,101155069755508,0.998323 +372,7300757225291178,6874146713382768,101155069755508,0.9988201 +373,7318349411365243,6874146713382768,101155069755508,0.99872345 +374,7335941597429112,6874146713382768,101155069755508,0.9985898 +375,7335941597422189,6874146713382768,101155069755508,0.9983203 +376,7331543550904263,6874146713382768,101155069755508,0.99764854 +377,7362329876532149,6874146713382768,101155069755508,0.99860555 +378,7313951364850967,6874146713382768,101155069755508,0.9983176 +379,7375524016070867,6891738899432833,101155069755508,0.99819607 +380,7318349411377352,6891738899432833,101155069755508,0.99779785 +381,7401912295148400,6891738899432833,101155069755508,0.9904565 +382,7397514248633076,6891738899432833,101155069755508,0.9987613 +383,7243582620599783,6891738899432833,101155069755508,0.9986141 +384,7371125969551756,6891738899432833,101155069755508,0.9991372 +385,7516261504546425,6891738899432833,101155069755508,0.98995376 +386,7564640016221493,6891738899432833,101155069755508,0.9982722 +387,7423902527729800,6891738899432833,101155069755508,0.99732375 +388,7221592388027918,6891738899432833,101155069755508,0.9980896 +389,7322747457871588,6891738899432833,101155069755508,0.99752945 +390,7331543550908359,6891738899432833,101155069755508,0.998468 +391,7182009969405600,6891738899432833,101155069755508,0.99313265 +392,7450290806836877,6900534992449855,101155069755508,0.9620501 +393,7459086899863600,6874146713380882,101155069755508,0.8309146 +394,7516261504544552,6874146713380882,101155069755508,0.9080236 +395,7230388481059901,6874146713380882,101155069755508,0.97070944 +396,7177611922878808,6891738899431701,101155069755508,0.8207027 +397,7459086899861845,6891738899431701,101155069755508,0.98915976 +398,7498669318503892,6891738899431701,101155069755508,0.84226143 +399,7481077132431712,6891738899431701,101155069755508,0.8207425 +405,7547047830175105,6891738899431532,4085785217347644,0.99666256 +406,7305155271832687,6891738899432463,4085785217347644,0.9995616 +407,7335941597429080,6891738899432463,4085785217347644,0.99944586 +408,7335941597422206,6891738899432463,4085785217347644,0.99944586 +409,7247980667124762,6891738899432463,4085785217347644,0.9992774 +410,7371125969559015,6891738899431774,4085785217347644,0.9986761 +411,7300757225311375,6874146713382657,4085785217347644,0.9997328 +412,7322747457867710,6874146713382657,4085785217347644,0.9997373 +413,7313951364844823,6874146713382657,4085785217347644,0.9997521 +414,7322747457867809,6874146713382657,4085785217347644,0.99972373 +415,7313951364844867,6874146713382657,4085785217347644,0.9997682 +416,7300757225311477,6874146713382657,4085785217347644,0.9997838 +417,7322747457867622,6874146713382657,4085785217347644,0.99978393 +418,7322747457867795,6874146713382657,4085785217347644,0.9997234 +419,7300757225311457,6874146713382657,4085785217347644,0.9997832 +420,7322747457867699,6874146713382657,4085785217347644,0.9995952 +421,7186408015909615,6874146713381270,4085785217347644,0.99972814 +422,7182009969404893,6874146713381270,4085785217347644,0.9993406 +423,7529455644099198,6891738899425541,4085785217347644,0.9994252 +424,7384320109091349,6891738899431018,4085785217347662,0.9944041 +425,7208398248493496,6891738899431018,4085785217347662,0.9430324 +426,7467882992897857,6891738899431018,4085785217347662,0.9595148 +427,7300757225311318,6891738899431018,4085785217347662,0.99113184 +428,7463484946369472,6891738899431018,4085785217347662,0.956374 +429,7393116202139805,6891738899431899,4085785217347663,0.99749315 +431,7305155271814857,6896136945937614,4085785217347666,0.9974591 +432,7265572853180819,6896136945937614,4085785217347666,0.9981623 +433,7313951364850860,6896136945937614,4085785217347666,0.9982292 +434,7349135736987561,6896136945937614,4085785217347666,0.9831646 +435,7362329876525195,6896136945937614,4085785217347666,0.99642015 +436,7362329876525190,6896136945937614,4085785217347666,0.9970517 +437,7313951364850870,6896136945937614,4085785217347666,0.99743515 +438,7459086899850385,6896136945937614,4085785217347666,0.99626094 +439,7472281039403504,6896136945937614,4085785217347666,0.9971596 +440,7375524016055475,6896136945937614,4085785217347666,0.9930139 +441,7406310341679920,6896136945937614,4085785217347666,0.9984413 +442,7300757225317378,6896136945937614,4085785217347666,0.9974362 +443,7362329876530838,6896136945937614,4085785217347666,0.99733317 +444,7397514248650746,6896136945937614,4085785217347666,0.9883845 +445,7507465411539446,6896136945937614,4085785217347666,0.9977875 +446,7353533783475517,6896136945937614,4085785217347666,0.99930143 +447,7459086899853799,6896136945937614,4085785217347666,0.9917446 +448,7265572853180856,6896136945937614,4085785217347666,0.99818486 +449,7287563085745569,6896136945937614,4085785217347666,0.99572766 +450,7357931830012248,6896136945937614,4085785217347666,0.9992167 +451,7463484946359869,6896136945937614,4085785217347666,0.9967301 +452,7164417783333170,6896136945937614,4085785217347666,0.9963201 +453,7450290806838832,6896136945937614,4085785217347666,0.99722123 +454,7401912295171680,6896136945937614,4085785217347666,0.99821633 +455,7230388481064667,6896136945937614,4085785217347666,0.99866307 +456,7234786527576239,6896136945937614,4085785217347666,0.9946695 +457,7406310341661110,6896136945937614,4085785217347666,0.9846705 +458,7437096667294174,6896136945937614,4085785217347666,0.9996369 +459,7300757225317457,6896136945937614,4085785217347666,0.99743736 +460,7340339643939119,6896136945937614,4085785217347666,0.9888095 +461,7516261504558029,6896136945937614,4085785217347666,0.9908618 +462,7463484946370434,6896136945937614,4085785217347666,0.9995796 +463,7481077132427097,6896136945937614,4085785217347666,0.9944353 +464,7230388481068723,6896136945937614,4085785217347666,0.9989184 +465,7313951364850845,6896136945937614,4085785217347666,0.9974354 +466,7300757225317383,6896136945937614,4085785217347666,0.9974362 +467,7371125969545105,6896136945937614,4085785217347666,0.99796754 +468,7393116202132419,6896136945937614,4085785217347666,0.99652416 +469,7551445876686494,6896136945937614,4085785217347666,0.97494566 +470,7256776760158668,6896136945937614,4085785217347666,0.9974394 +471,7379922062576628,6896136945937614,4085785217347666,0.99907386 +472,7410708388184647,6896136945937614,4085785217347666,0.99624556 +473,7309553318324181,6896136945937614,4085785217347666,0.99900013 +474,7406310341679904,6896136945937614,4085785217347666,0.99844056 +475,7410708388178803,6896136945937614,4085785217347666,0.9997873 +476,7300757225317402,6896136945937614,4085785217347666,0.9974361 +477,7353533783499837,6896136945937614,4085785217347666,0.99757737 +478,7472281039398451,6896136945937614,4085785217347666,0.98984504 +479,7300757225317393,6896136945937614,4085785217347666,0.9975189 +480,7313951364850850,6896136945937614,4085785217347666,0.9974354 +481,7511863458044110,6896136945937614,4085785217347666,0.9943297 +482,7300757225317415,6896136945937614,4085785217347666,0.99743587 +483,7265572853180828,6896136945937614,4085785217347666,0.99823713 +484,7287563085771915,6896136945937614,4085785217347666,0.99767417 +485,7445892760297672,6896136945937614,4085785217347666,0.99828315 +486,7349135736987554,6896136945937614,4085785217347666,0.99317414 +487,7349135736965459,6896136945937614,4085785217347666,0.9981071 +488,7454688853334828,6896136945937614,4085785217347666,0.99912757 +489,7269970899703946,6896136945937614,4085785217347666,0.9975701 +490,7300757225317453,6896136945937614,4085785217347666,0.997437 +491,7300757225317352,6896136945937614,4085785217347666,0.9974367 +492,7459086899859809,6896136945937614,4085785217347666,0.9967704 +493,7256776760158664,6896136945937614,4085785217347666,0.99823725 +494,7357931830015384,6896136945937614,4085785217347666,0.99319506 +495,7560241969699655,6896136945937614,4085785217347666,0.9984781 +496,7472281039398484,6896136945937614,4085785217347666,0.99175876 +497,7573436109243977,6896136945937614,4085785217347666,0.99730694 +498,7225990434555879,6896136945937614,4085785217347666,0.99871004 +499,7313951364850875,6896136945937614,4085785217347666,0.9974353 +500,7313951364850825,6896136945937614,4085785217347666,0.99743575 +501,7507465411539463,6896136945937614,4085785217347666,0.9938135 +502,7300757225317407,6896136945937614,4085785217347666,0.99743587 +503,7331543550920355,6896136945937614,4085785217347666,0.98015726 +504,7423902527733393,6896136945937614,4085785217347666,0.9977842 +505,7397514248653225,6896136945937614,4085785217347666,0.9975721 +506,7393116202139838,6896136945937614,4085785217347666,0.9916407 +507,7393116202139856,6896136945937614,4085785217347666,0.99055356 +508,7353533783499934,6896136945937614,4085785217347666,0.994183 +509,7428300574265394,6896136945937614,4085785217347666,0.9985619 +510,7445892760306611,6891738899430553,4085785217347666,0.9960967 +511,7186408015906675,6891738899430553,4085785217347666,0.9894007 +512,7283165039253665,6891738899430553,4085785217347666,0.9948467 +513,7445892760317758,6891738899430741,4085785217347668,0.99875 +514,7437096667294696,6891738899430741,4085785217347668,0.9990206 +515,7393116202119525,6891738899430741,4085785217347668,0.99968183 +516,7516261504558015,6891738899433148,4085785217347668,0.9897626 +519,7481077132431749,6896136945937655,4085785217347716,0.9995795 +520,7353533783494174,6896136945937655,4085785217347716,0.9994648 +521,7481077132431759,6896136945937655,4085785217347716,0.99963856 +522,7371125969559265,6891738899432703,4085785217347716,0.9967913 +523,7371125969559226,6891738899432703,4085785217347716,0.99738806 +524,7327145504406367,6900534992448969,4085785217347716,0.99938476 +525,7283165039253893,6900534992448969,4085785217347716,0.9994518 +526,7560241969710927,6900534992448969,4085785217347716,0.9994338 +527,7401912295171519,6891738899433217,4085785217347716,0.9873453 +528,7450290806837000,6891738899431149,4085785217347716,0.9998004 +529,7410708388178664,6874146713382634,4085785217347729,0.995751 +530,7401912295156846,6874146713382634,4085785217347729,0.99575114 +531,7401912295156821,6874146713382634,4085785217347729,0.99575114 +532,7401912295156721,6874146713382634,4085785217347729,0.995751 +533,7410708388178684,6874146713382634,4085785217347729,0.995751 +534,7410708388178655,6874146713382634,4085785217347729,0.99575114 +535,7401912295156690,6874146713382634,4085785217347729,0.995751 +538,7322747457867712,6891738899431763,4085785217347738,0.9952213 +539,7401912295170761,6891738899431763,4085785217347738,0.88004035 +540,7300757225317349,6891738899431763,4085785217347738,0.9998659 +542,7296359178777889,6874146713381313,4085785217347745,0.99927026 +543,7252378713625055,6874146713381313,4085785217347745,0.9997185 +544,7190806062425732,6874146713381313,4085785217347745,0.99415624 +545,7494271271986787,6874146713381313,4085785217347745,0.9997845 +546,7379922062584518,6874146713381313,4085785217347745,0.9900367 +547,7331543550920652,6874146713381313,4085785217347745,0.99933016 +548,7327145504409020,6874146713381313,4085785217347745,0.99973184 +549,7322747457891763,6874146713381313,4085785217347745,0.9980823 +550,7353533783492613,6874146713381313,4085785217347745,0.99968266 +551,7327145504409014,6874146713381313,4085785217347745,0.99972695 +552,7555843923185745,6874146713381313,4085785217347745,0.9980671 +553,7481077132431543,6874146713381313,4085785217347745,0.99975294 +554,7283165039253887,6874146713381313,4085785217347745,0.99286085 +555,7327145504408924,6874146713381313,4085785217347745,0.9994692 +556,7212796295007935,6874146713381313,4085785217347745,0.99969935 +557,7327145504406192,6874146713381313,4085785217347745,0.99918467 +558,7463484946370488,6874146713381313,4085785217347745,0.9987349 +559,7397514248645081,6874146713381313,4085785217347745,0.9994137 +560,7274368946212403,6874146713381313,4085785217347745,0.9996296 +561,7371125969563556,6874146713381313,4085785217347745,0.999315 +562,7327145504412206,6874146713381313,4085785217347745,0.99856794 +563,7481077132422699,6874146713381313,4085785217347745,0.9992291 +564,7463484946370383,6874146713381313,4085785217347745,0.998919 +565,7353533783497416,6874146713381313,4085785217347745,0.9997546 +566,7265572853181951,6874146713381313,4085785217347745,0.9979068 +567,7525057597593353,6874146713381313,4085785217347745,0.99964094 +568,7463484946370958,6874146713381313,4085785217347745,0.9988181 +569,7437096667294179,6874146713381313,4085785217347745,0.99967813 +570,7186408015914208,6874146713381313,4085785217347745,0.9992137 +571,7419504481229574,6874146713381313,4085785217347745,0.9994765 +572,7362329876534220,6874146713381313,4085785217347745,0.9993055 +573,7459086899855567,6874146713381313,4085785217347745,0.99966216 +574,7243582620599777,6874146713381313,4085785217347745,0.9997913 +575,7459086899859764,6874146713381313,4085785217347745,0.99868554 +576,7533853690618523,6874146713381313,4085785217347745,0.99975616 +577,7494271271986763,6874146713381313,4085785217347745,0.9940943 +578,7463484946370476,6874146713381313,4085785217347745,0.9986847 +579,7560241969710139,6874146713381313,4085785217347745,0.994166 +580,7428300574238832,6874146713381313,4085785217347745,0.9910228 +581,7265572853185989,6874146713381313,4085785217347745,0.9987109 +582,7388718155600685,6874146713381313,4085785217347745,0.9997732 +583,7401912295159180,6874146713381313,4085785217347745,0.99927956 +584,7349135736968028,6874146713381313,4085785217347745,0.9997472 +585,7516261504563440,6874146713381313,4085785217347745,0.9979443 +586,7296359178777927,6874146713381313,4085785217347745,0.99927026 +587,7463484946371094,6874146713381313,4085785217347745,0.99884063 +588,7494271271986713,6874146713381313,4085785217347745,0.99975663 +589,7560241969710232,6874146713381313,4085785217347745,0.99791485 +590,7190806062434276,6874146713381313,4085785217347745,0.9987469 +591,7344737690463308,6874146713381313,4085785217347745,0.99938834 +592,7287563085745496,6874146713381313,4085785217347745,0.999548 +593,7520659551061719,6874146713381313,4085785217347745,0.9998671 +594,7199602155446145,6874146713381313,4085785217347745,0.9996681 +595,7375524016070820,6874146713381313,4085785217347745,0.9978969 +596,7199602155440810,6874146713381313,4085785217347745,0.99975294 +597,7353533783497538,6874146713381313,4085785217347745,0.99003977 +598,7459086899860108,6874146713381313,4085785217347745,0.99818075 +599,7186408015909608,6874146713381313,4085785217347745,0.9995944 +600,7344737690463209,6874146713381313,4085785217347745,0.9933549 +601,7463484946370490,6874146713381313,4085785217347745,0.99865794 +602,7357931830005114,6874146713381313,4085785217347745,0.9972499 +603,7463484946370485,6874146713381313,4085785217347745,0.9986608 +604,7247980667108697,6874146713381313,4085785217347745,0.9996772 +605,7269970899705066,6874146713381313,4085785217347745,0.9995364 +606,7428300574238408,6874146713381313,4085785217347745,0.9998406 +607,7388718155600673,6874146713381313,4085785217347745,0.999777 +608,7388718155622518,6874146713381313,4085785217347745,0.99938726 +609,7450290806821132,6874146713381313,4085785217347745,0.9995741 +610,7511863458053500,6874146713381313,4085785217347745,0.9996381 +611,7195204108937219,6874146713381313,4085785217347745,0.99791485 +612,7551445876686518,6874146713381313,4085785217347745,0.9972499 +613,7243582620602256,6874146713381313,4085785217347745,0.9995691 +614,7423902527742865,6874146713381313,4085785217347745,0.99959 +615,7498669318483702,6874146713381313,4085785217347745,0.99972755 +616,7401912295164813,6874146713381313,4085785217347745,0.99922633 +617,7472281039392810,6874146713381313,4085785217347745,0.9988103 +618,7494271271986767,6874146713381313,4085785217347745,0.99408686 +619,7265572853181942,6874146713381313,4085785217347745,0.9993105 +620,7419504481209753,6874146713381313,4085785217347745,0.99959606 +621,7305155271833327,6874146713381313,4085785217347745,0.99968433 +622,7366727923042094,6891738899426872,4085785217347752,0.98099077 +623,7467882992891266,6891738899426872,4085785217347752,0.9904553 +624,7415106434695589,6900534992449861,4085785217347753,0.9958715 +625,7371125969559130,6891738899431191,4085785217347753,0.9995415 +626,7384320109091323,6891738899431191,4085785217347753,0.9996389 +627,7463484946386313,6891738899431191,4085785217347753,0.99927944 +628,7485475178942163,6891738899431191,4085785217347753,0.9992467 +629,7397514248645072,6891738899431191,4085785217347753,0.9996656 +630,7419504481208013,6891738899431191,4085785217347753,0.9993968 +631,7428300574265337,6891738899431191,4085785217347753,0.9971814 +632,7353533783475467,6874146713381355,4085785217347753,0.9994361 +633,7331543550908783,6874146713381355,4085785217347753,0.9993992 +634,7401912295159156,6874146713381355,4085785217347753,0.9995721 +635,7375524016071417,6874146713381355,4085785217347753,0.9995721 +636,7406310341676906,6891738899430892,4085785217347780,0.9969131 +637,7401912295163142,6891738899430892,4085785217347780,0.99637836 +638,7331543550908439,6874146713382780,4085785217347785,0.9680378 +639,7393116202141091,6874146713382780,4085785217347785,0.96406454 +640,7168815829857622,6891738899431732,4085785217347791,0.9967656 +641,7182009969390853,6891738899431732,4085785217347791,0.9974136 +642,7573436109244663,6891738899431732,4085785217347791,0.9968731 +643,7507465411517128,6891738899431732,4085785217347791,0.99061185 +644,7428300574265467,6891738899431732,4085785217347791,0.97379446 +645,7182009969390762,6891738899431732,4085785217347791,0.9974136 +646,7182009969390767,6891738899431732,4085785217347791,0.9967656 +647,7445892760317779,6891738899431732,4085785217347791,0.9975216 +648,7459086899853607,6891738899430454,4085785217347792,0.99888045 +649,7287563085769091,6891738899430454,4085785217347792,0.99889296 +650,7357931830015291,6896136945937136,4085785217347802,0.9990569 +651,7353533783500361,6896136945937136,4085785217347802,0.9990569 +652,7340339643952322,6896136945937136,4085785217347802,0.9998635 +653,7234786527587765,6896136945937136,4085785217347802,0.99505866 +654,7393116202141112,6896136945937136,4085785217347802,0.99508804 +655,7472281039392886,6900534992448981,4085785217347803,0.9954137 +656,7353533783487752,6900534992448981,4085785217347803,0.9947725 +657,7375524016070748,6900534992448981,4085785217347803,0.97532666 +658,7261174806677999,6900534992448981,4085785217347803,0.9955818 +659,7278766992732975,6900534992448981,4085785217347803,0.99600816 +660,7511863458053072,6900534992448981,4085785217347803,0.9789627 +661,7375524016070674,6900534992448981,4085785217347803,0.9926116 +662,7401912295166406,6900534992448981,4085785217347803,0.995666 +663,7459086899859725,6900534992448981,4085785217347803,0.994572 +664,7410708388176282,6900534992448981,4085785217347803,0.9947436 +665,7401912295165055,6900534992448981,4085785217347803,0.99387264 +666,7520659551076142,6900534992448981,4085785217347803,0.99350005 +667,7278766992720468,6900534992448981,4085785217347803,0.9942061 +668,7375524016066641,6900534992448981,4085785217347803,0.9943778 +669,7507465411539468,6900534992448981,4085785217347803,0.99502665 +670,7261174806681819,6900534992448981,4085785217347803,0.9945537 +671,7564640016220236,6900534992448981,4085785217347803,0.995027 +672,7437096667294140,6900534992448981,4085785217347803,0.99456453 +673,7401912295170514,6900534992448981,4085785217347803,0.99558145 +674,7269970899702695,6900534992448981,4085785217347803,0.97819704 +675,7221592388027930,6900534992448981,4085785217347803,0.99565256 +676,7463484946370499,6900534992448981,4085785217347803,0.99571335 +677,7261174806672684,6900534992448981,4085785217347803,0.9936021 +678,7384320109087181,6900534992448981,4085785217347803,0.99622923 +679,7371125969549184,6900534992448981,4085785217347803,0.99387276 +680,7516261504546571,6900534992448981,4085785217347803,0.98929113 +681,7384320109096444,6900534992448981,4085785217347803,0.9956657 +682,7375524016066607,6900534992448981,4085785217347803,0.99421644 +683,7327145504408937,6900534992448981,4085785217347803,0.99448484 +684,7423902527733267,6900534992448981,4085785217347803,0.9955329 +685,7503067365024154,6891738899431738,4085785217347803,0.99960953 +686,7371125969557333,6891738899431738,4085785217347803,0.99965656 +687,7375524016073709,6891738899431738,4085785217347803,0.99912566 +688,7529455644099148,6891738899431738,4085785217347803,0.9990532 +689,7269970899704492,6891738899431738,4085785217347803,0.9995461 +690,7287563085749353,6891738899431738,4085785217347803,0.9992888 +691,7296359178777830,6891738899431738,4085785217347803,0.99923146 +692,7529455644096593,6891738899431738,4085785217347803,0.9995759 +693,7366727923050323,6891738899431738,4085785217347803,0.99948263 +694,7256776760162705,6891738899431738,4085785217347803,0.9996488 +695,7507465411539527,6891738899431738,4085785217347803,0.9993793 +696,7388718155600585,6891738899431738,4085785217347803,0.99931824 +697,7177611922878957,6900534992449937,4085785217347807,0.9967775 +698,7265572853181962,6900534992449937,4085785217347807,0.9974312 +700,7454688853347469,6874146713381638,4085785217347814,0.99253076 +701,7507465411524449,6874146713381638,4085785217347814,0.98478436 +702,7507465411524446,6874146713381638,4085785217347814,0.9839491 +703,7353533783475537,6891738899425615,4085785217347814,0.9960383 +704,7190806062434216,6891738899425615,4085785217347814,0.99674606 +705,7278766992743951,6891738899425615,4085785217347814,0.9976447 +706,7375524016052576,6891738899425615,4085785217347814,0.9983694 +707,7305155271817362,6891738899425615,4085785217347814,0.9966612 +708,7375524016052556,6891738899425615,4085785217347814,0.99821424 +709,7520659551085634,6891738899425615,4085785217347814,0.995767 +710,7463484946386338,6891738899425615,4085785217347814,0.99801385 +711,7234786527563212,6891738899425615,4085785217347814,0.99668545 +712,7520659551085616,6891738899425615,4085785217347814,0.9961515 +713,7362329876517135,6891738899425615,4085785217347814,0.99570674 +714,7401912295148547,6891738899425615,4085785217347814,0.99474144 +715,7190806062409354,6891738899425615,4085785217347814,0.99586356 +716,7498669318483591,6891738899425615,4085785217347814,0.99706787 +717,7309553318321938,6891738899425615,4085785217347814,0.9975726 +718,7375524016055530,6891738899431634,4085785217347822,0.9997087 +719,7331543550920337,6891738899431634,4085785217347822,0.9995166 +720,7379922062581728,6891738899431634,4085785217347822,0.99902177 +721,7204000201969341,6891738899431634,4085785217347822,0.9995578 +722,7182009969406487,6891738899431634,4085785217347822,0.99982363 +723,7516261504568405,6891738899431634,4085785217347822,0.9995154 +724,7498669318509730,6891738899431634,4085785217347822,0.9998215 +725,7371125969551575,6891738899431634,4085785217347822,0.99990356 +726,7318349411365227,6891738899431634,4085785217347822,0.9999021 +727,7362329876532135,6891738899431634,4085785217347822,0.9998988 +728,7256776760162502,6891738899431634,4085785217347822,0.9987425 +729,7476679085910791,6891738899431634,4085785217347822,0.99988854 +730,7529455644099298,6891738899431712,4085785217347822,0.99776936 +731,7503067365024255,6891738899431712,4085785217347822,0.996887 +732,7520659551074188,6891738899431712,4085785217347822,0.9818295 +733,7503067365024185,6891738899431712,4085785217347822,0.9968861 +734,7489873225479737,6874146713381327,4085785217347822,0.9942983 +735,7459086899853535,6874146713381327,4085785217347822,0.99438924 +736,7459086899853540,6874146713381327,4085785217347822,0.9943982 +737,7393116202113734,6874146713381327,4085785217347822,0.9962986 +743,7274368946214346,6891738899425472,4090183263858182,0.90031844 +744,7401912295150956,6891738899431639,4090183263858208,0.9985461 +745,7397514248645164,6891738899431639,4090183263858208,0.9989334 +746,7459086899855444,6891738899431639,4090183263858208,0.99932456 +747,7362329876530865,6891738899431639,4090183263858208,0.99967194 +748,7503067365023591,6891738899431639,4090183263858208,0.99913603 +749,7327145504408994,6891738899431639,4090183263858208,0.9998387 +750,7349135736985112,6891738899431639,4090183263858208,0.99954045 +751,7318349411376941,6891738899431639,4090183263858208,0.9998599 +752,7379922062578956,6891738899431639,4090183263858208,0.9989334 +753,7234786527576269,6891738899431639,4090183263858208,0.9997588 +754,7397514248655911,6891738899431639,4090183263858208,0.9992285 +755,7406310341679802,6891738899431639,4090183263858208,0.99987483 +756,7234786527587791,6891738899431639,4090183263858208,0.99880564 +757,7547047830153242,6891738899431639,4090183263858208,0.9998041 +758,7204000201963871,6891738899431639,4090183263858208,0.99986804 +759,7560241969711898,6891738899431639,4090183263858208,0.99864584 +760,7498669318502663,6891738899431639,4090183263858208,0.99619836 +761,7538251737147873,6891738899431639,4090183263858208,0.99816114 +762,7564640016225732,6891738899431639,4090183263858208,0.9985726 +763,7481077132422746,6891738899431639,4090183263858208,0.9991147 +764,7406310341676806,6891738899431639,4090183263858208,0.9997428 +765,7269970899703823,6891738899431639,4090183263858208,0.9998547 +766,7212796294988395,6891738899431639,4090183263858208,0.9998963 +767,7234786527587835,6891738899431639,4090183263858208,0.9988475 +768,7472281039396748,6891738899431639,4090183263858208,0.9996276 +769,7331543550908810,6891738899431639,4090183263858208,0.9998417 +770,7529455644096590,6891738899431639,4090183263858208,0.9990526 +771,7423902527730996,6891738899431639,4090183263858208,0.99985504 +772,7573436109244069,6891738899431639,4090183263858208,0.9990526 +773,7397514248645170,6891738899431639,4090183263858208,0.9989334 +774,7366727923050317,6891738899431639,4090183263858208,0.9991253 +775,7362329876513673,6891738899431639,4090183263858208,0.99857664 +776,7397514248650721,6891738899431639,4090183263858208,0.9998005 +777,7375524016081203,6891738899431639,4090183263858208,0.9983051 +778,7384320109096427,6891738899431639,4090183263858208,0.9997129 +779,7375524016071373,6891738899431639,4090183263858208,0.9993268 +780,7406310341679867,6891738899431639,4090183263858208,0.9998734 +781,7538251737147907,6891738899431639,4090183263858208,0.99896145 +782,7256776760137998,6891738899431639,4090183263858208,0.99784374 +783,7256776760137948,6891738899431639,4090183263858208,0.9991167 +784,7529455644096543,6891738899431639,4090183263858208,0.99859494 +785,7357931830010669,6891738899431639,4090183263858208,0.9998149 +786,7357931830012236,6891738899431639,4090183263858208,0.9997894 +787,7357931830004909,6891738899431639,4090183263858208,0.99857664 +788,7375524016081132,6891738899431639,4090183263858208,0.9985933 +789,7186408015914373,6891738899431639,4090183263858208,0.99973994 +790,7401912295159175,6891738899431639,4090183263858208,0.99989045 +791,7393116202119612,6891738899431639,4090183263858208,0.9998548 +792,7375524016070816,6891738899431639,4090183263858208,0.9994198 +793,7182009969404942,6891738899431639,4090183263858208,0.9997758 +794,7384320109091436,6891738899431639,4090183263858208,0.9989334 +795,7393116202117221,6891738899431639,4090183263858208,0.99914944 +796,7397514248655896,6891738899431639,4090183263858208,0.99960726 +797,7375524016073789,6891738899431639,4090183263858208,0.9991027 +798,7234786527574933,6891738899431639,4090183263858208,0.9985227 +799,7375524016071407,6891738899431639,4090183263858208,0.99985456 +800,7366727923044254,6891738899431639,4090183263858208,0.9980453 +801,7445892760315015,6891738899431639,4090183263858208,0.99834466 +802,7406310341680400,6891738899431639,4090183263858208,0.99984527 +803,7168815829844139,6891738899431639,4090183263858208,0.99964046 +804,7278766992728614,6891738899431639,4090183263858208,0.999363 +805,7547047830177157,6891738899431639,4090183263858208,0.99859613 +806,7516261504555932,6900534992448855,4090183263858267,0.9956151 +807,7494271271986650,6900534992448855,4090183263858267,0.99785006 +808,7498669318494521,6900534992448855,4090183263858267,0.9953387 +809,7349135736987548,6900534992448957,4090183263858267,0.99868196 +810,7393116202134973,6874146713381741,4090183263858279,0.9989755 +813,7393116202134927,6891738899431717,4090183263858279,0.99781966 +814,7419504481229841,6874146713382681,4090183263858279,0.99722725 +816,7287563085771947,6891738899432128,4090183263858299,0.9883128 +817,7287563085745509,6891738899431771,4090183263858543,0.9938273 +818,7349135736965501,6891738899431492,4090183263858543,0.94982874 +819,7349135736965577,6891738899431492,4090183263858543,0.9498285 +820,7349135736965454,6891738899431492,4090183263858543,0.94982743 +821,7322747457890515,6891738899431492,4090183263858543,0.9500488 +822,7401912295166319,6891738899431492,4090183263858543,0.99570566 +823,7261174806672633,6891738899431492,4090183263858543,0.95073795 +824,7349135736965448,6891738899431492,4090183263858543,0.94982743 +825,7393116202139118,6891738899431492,4090183263858543,0.9969903 +826,7349135736985070,6891738899431492,4090183263858543,0.99201804 +827,7371125969555679,6891738899431492,4090183263858543,0.99503064 +828,7349135736965508,6891738899431492,4090183263858543,0.94982874 +829,7410708388194102,6891738899431492,4090183263858543,0.9959209 +830,7322747457890565,6891738899431492,4090183263858543,0.9498313 +831,7349135736965591,6891738899431492,4090183263858543,0.9499222 +832,7419504481214746,6891738899431492,4090183263858543,0.9977463 +833,7560241969699635,6891738899431492,4090183263858543,0.975662 +834,7459086899850840,6891738899431492,4090183263858543,0.9956246 +835,7393116202126651,6891738899431492,4090183263858543,0.95923096 +836,7401912295163131,6891738899431492,4090183263858543,0.99717134 +837,7349135736965473,6891738899431492,4090183263858543,0.9499102 +838,7349135736965549,6891738899431492,4090183263858543,0.94994843 +839,7322747457890487,6891738899431492,4090183263858543,0.9498587 +840,7401912295171089,6891738899431492,4090183263858543,0.99550503 +841,7393116202141623,6891738899431492,4090183263858543,0.99722314 +842,7529455644107170,6891738899431256,4090183263858547,0.99692506 +843,7247980667136065,6891738899431256,4090183263858547,0.9966677 +844,7538251737120417,6891738899431256,4090183263858547,0.9970771 +845,7247980667136062,6891738899431256,4090183263858547,0.9966678 +846,7511863458053674,6891738899431256,4090183263858547,0.9970772 +847,7419504481222345,6891738899431256,4090183263858547,0.9992107 +848,7511863458053687,6891738899431256,4090183263858547,0.9970772 +849,7529455644107182,6891738899431256,4090183263858547,0.99692506 +850,7247980667136057,6891738899431256,4090183263858547,0.9966677 +851,7529455644107175,6891738899431256,4090183263858547,0.9969252 +852,7182009969405492,6891738899431256,4090183263858547,0.9990509 +853,7450290806836835,6891738899427041,4090183263858567,0.911374 +855,7274368946202260,6891738899427041,4090183263858567,0.8624367 +856,7498669318483729,6891738899427041,4090183263858567,0.8409075 +857,7327145504409006,6891738899427041,4090183263858567,0.873714 +859,7230388481069973,6891738899431679,4090183263858567,0.9991301 +860,7503067365011972,6891738899431679,4090183263858567,0.9992347 +862,7274368946212499,6891738899431679,4090183263858567,0.90539 +863,7327145504409095,6891738899431679,4090183263858567,0.99913555 +864,7560241969717552,6891738899430818,4090183263858567,0.99969876 +865,7419504481222877,6896136945937024,4090183263858572,0.9682711 +868,7296359178781896,6874146713381684,4090183263858578,0.90113986 +874,7296359178781973,6874146713381684,4090183263858578,0.9010842 +875,7393116202132334,6874146713381684,4090183263858578,0.81961995 +877,7300757225298715,6874146713381684,4090183263858578,0.88944024 +878,7168815829857595,6891738899425607,4090183263858578,0.9886022 +879,7287563085745452,6891738899425607,4090183263858578,0.9878285 +880,7564640016232846,6891738899425607,4090183263858578,0.9902644 +881,7498669318495733,6891738899431844,4090183263858583,0.99343723 +882,7498669318495740,6891738899431844,4090183263858583,0.99343747 +883,7498669318495755,6891738899431844,4090183263858583,0.99343747 +884,7507465411517106,6891738899431844,4090183263858583,0.99343747 +885,7507465411517101,6891738899431844,4090183263858583,0.99343723 +886,7507465411517098,6891738899431844,4090183263858583,0.99343723 +887,7498669318495726,6891738899431844,4090183263858583,0.99343723 +888,7498669318495713,6891738899431844,4090183263858583,0.99343747 +889,7498669318495746,6891738899431844,4090183263858583,0.99343723 +890,7498669318495722,6891738899431844,4090183263858583,0.99343747 +891,7507465411517096,6891738899431844,4090183263858583,0.99343723 +892,7498669318495748,6891738899431844,4090183263858583,0.99343747 +893,7318349411376983,6882942806404175,4090183263858592,0.9923793 +894,7230388481064681,6882942806404175,4090183263858592,0.99817836 +895,7291961132261638,6882942806404175,4090183263858592,0.9963103 +896,7529455644110579,6882942806404175,4090183263858592,0.99822265 +897,7379922062576760,6882942806404175,4090183263858592,0.96268445 +898,7503067365006088,6882942806404175,4090183263858592,0.97991884 +899,7247980667108722,6882942806404175,4090183263858592,0.9994148 +900,7186408015914356,6882942806404175,4090183263858592,0.9944147 +901,7529455644099478,6882942806404175,4090183263858592,0.9830912 +902,7300757225309610,6882942806404175,4090183263858592,0.9954678 +903,7547047830177277,6882942806404175,4090183263858592,0.9976555 +904,7362329876534312,6882942806404175,4090183263858592,0.82263166 +905,7371125969554970,6882942806404175,4090183263858592,0.9995529 +906,7239184574099299,6882942806404175,4090183263858592,0.9971738 +907,7243582620606592,6882942806404175,4090183263858592,0.9995338 +908,7410708388176270,6882942806404175,4090183263858592,0.9993749 +909,7393116202126634,6882942806404175,4090183263858592,0.9950789 +910,7256776760138027,6882942806404175,4090183263858592,0.9925269 +911,7371125969545116,6882942806404175,4090183263858592,0.9908982 +912,7375524016070848,6882942806404175,4090183263858592,0.99908686 +913,7353533783500472,6882942806404175,4090183263858592,0.96907246 +914,7401912295159139,6882942806404175,4090183263858592,0.992496 +915,7507465411539474,6882942806404175,4090183263858592,0.9979572 +916,7384320109100664,6882942806404175,4090183263858592,0.97055286 +917,7190806062434196,6882942806404175,4090183263858592,0.9986272 +918,7406310341661112,6882942806404175,4090183263858592,0.99878293 +919,7401912295166426,6882942806404175,4090183263858592,0.9989255 +920,7454688853339399,6882942806404175,4090183263858592,0.9914232 +921,7542649783634671,6882942806404175,4090183263858592,0.99594045 +922,7406310341682421,6882942806404175,4090183263858592,0.9964694 +923,7529455644113503,6882942806404175,4090183263858592,0.9877806 +925,7195204108937377,6882942806404175,4090183263858592,0.97557133 +926,7547047830177271,6882942806404175,4090183263858592,0.9989286 +927,7481077132432406,6882942806404175,4090183263858592,0.95871407 +928,7265572853193067,6882942806404175,4090183263858592,0.99922264 +929,7511863458044390,6882942806404175,4090183263858592,0.9944149 +930,7432698620769785,6882942806404175,4090183263858592,0.99042726 +931,7204000201956740,6882942806404175,4090183263858592,0.99588335 +932,7454688853339360,6882942806404175,4090183263858592,0.9853022 +933,7252378713636422,6882942806404175,4090183263858592,0.9633218 +934,7573436109243981,6882942806404175,4090183263858592,0.9968742 +935,7410708388188401,6882942806404175,4090183263858592,0.99686384 +936,7300757225306791,6882942806404175,4090183263858592,0.985783 +937,7256776760162494,6882942806404175,4090183263858592,0.9992053 +938,7261174806681922,6882942806404175,4090183263858592,0.9990362 +939,7309553318338038,6882942806404175,4090183263858592,0.9286939 +940,7247980667108795,6882942806404175,4090183263858592,0.99952245 +941,7247980667108827,6882942806404175,4090183263858592,0.9994142 +942,7199602155446116,6882942806404175,4090183263858592,0.9949549 +943,7542649783634663,6882942806404175,4090183263858592,0.9960504 +944,7410708388176292,6882942806404175,4090183263858592,0.999508 +945,7393116202132453,6882942806404175,4090183263858592,0.99882096 +946,7243582620606581,6882942806404175,4090183263858592,0.99691355 +947,7309553318332684,6882942806404175,4090183263858592,0.9990388 +948,7406310341682490,6882942806404175,4090183263858592,0.995874 +949,7300757225314449,6882942806404175,4090183263858592,0.9982327 +950,7256776760162556,6882942806404175,4090183263858592,0.9957295 +951,7182009969390807,6882942806404175,4090183263858592,0.9964928 +952,7234786527574900,6882942806404175,4090183263858592,0.9964445 +953,7243582620602190,6882942806404175,4090183263858592,0.99946433 +954,7415106434698437,6882942806404175,4090183263858592,0.9990633 +955,7322747457873570,6882942806404175,4090183263858592,0.9861601 +957,7551445876687220,6882942806404175,4090183263858592,0.9964557 +958,7507465411539472,6882942806404175,4090183263858592,0.99843246 +959,7375524016070796,6882942806404175,4090183263858592,0.99673694 +960,7327145504412164,6882942806404175,4090183263858592,0.9963018 +961,7388718155600289,6882942806404175,4090183263858592,0.9984869 +962,7406310341679893,6882942806404175,4090183263858592,0.9935881 +963,7498669318495630,6882942806404175,4090183263858592,0.96844876 +964,7507465411539469,6882942806404175,4090183263858592,0.9972933 +965,7353533783499816,6882942806404175,4090183263858592,0.9467096 +966,7182009969390842,6882942806404175,4090183263858592,0.9980147 +967,7243582620606710,6882942806404175,4090183263858592,0.9989104 +968,7247980667108746,6882942806404175,4090183263858592,0.99958354 +969,7459086899850374,6882942806404175,4090183263858592,0.98473006 +970,7419504481208316,6882942806404175,4090183263858592,0.9810198 +971,7410708388194276,6882942806404175,4090183263858592,0.9963761 +972,7186408015914211,6882942806404175,4090183263858592,0.9913694 +973,7573436109244134,6882942806404175,4090183263858592,0.99863845 +974,7393116202113934,6882942806404175,4090183263858592,0.99878913 +975,7327145504412218,6882942806404175,4090183263858592,0.9972817 +976,7349135736989760,6882942806404175,4090183263858592,0.99144894 +977,7261174806653920,6882942806404175,4090183263858592,0.9969887 +978,7564640016220198,6882942806404175,4090183263858592,0.99399614 +979,7533853690611236,6882942806404175,4090183263858592,0.99239665 +980,7511863458044227,6882942806404175,4090183263858592,0.9958973 +981,7379922062581691,6882942806404175,4090183263858592,0.999212 +982,7199602155446171,6882942806404175,4090183263858592,0.99770606 +983,7173213876371387,6882942806404175,4090183263858592,0.9969591 +984,7309553318324274,6882942806404175,4090183263858592,0.99776185 +985,7419504481207148,6882942806404175,4090183263858592,0.99340713 +986,7397514248655832,6882942806404175,4090183263858592,0.9992865 +987,7379922062581760,6882942806404175,4090183263858592,0.9967283 +988,7397514248655892,6882942806404175,4090183263858592,0.9992238 +989,7410708388178674,6882942806404175,4090183263858592,0.9989285 +990,7564640016220232,6882942806404175,4090183263858592,0.9980063 +991,7366727923050374,6882942806404175,4090183263858592,0.99740523 +992,7234786527574924,6882942806404175,4090183263858592,0.99950385 +993,7445892760297542,6882942806404175,4090183263858592,0.99594057 +994,7397514248655790,6882942806404175,4090183263858592,0.9987753 +995,7371125969554977,6882942806404175,4090183263858592,0.99944216 +996,7542649783634631,6882942806404175,4090183263858592,0.99696594 +997,7256776760137865,6882942806404175,4090183263858592,0.9989446 +998,7261174806678037,6882942806404175,4090183263858592,0.99898976 +999,7564640016220221,6882942806404175,4090183263858592,0.9987684 +1000,7283165039250341,6882942806404175,4090183263858592,0.982864 +1001,7511863458044352,6882942806404175,4090183263858592,0.99319273 +1002,7410708388188376,6882942806404175,4090183263858592,0.9968702 +1003,7503067365025746,6882942806404175,4090183263858592,0.9935616 +1005,7261174806672630,6882942806404175,4090183263858592,0.9953241 +1006,7459086899861486,6882942806404175,4090183263858592,0.9980198 +1007,7261174806678086,6882942806404175,4090183263858592,0.9990088 +1008,7318349411369418,6882942806404175,4090183263858592,0.99209595 +1009,7182009969390802,6882942806404175,4090183263858592,0.99737656 +1010,7287563085773245,6882942806404175,4090183263858592,0.9917093 +1011,7507465411539431,6882942806404175,4090183263858592,0.9966798 +1012,7459086899855542,6882942806404175,4090183263858592,0.99082935 +1013,7357931830015411,6882942806404175,4090183263858592,0.9833022 +1014,7247980667108806,6882942806404175,4090183263858592,0.9994624 +1015,7410708388176228,6882942806404175,4090183263858592,0.99946934 +1016,7371125969557128,6882942806404175,4090183263858592,0.99815565 +1017,7393116202118739,6882942806404175,4090183263858592,0.99944717 +1018,7520659551067716,6882942806404175,4090183263858592,0.9957775 +1019,7190806062412083,6882942806404175,4090183263858592,0.9789499 +1020,7406310341661060,6882942806404175,4090183263858592,0.9995524 +1021,7393116202117274,6882942806404175,4090183263858592,0.9833241 +1022,7256776760137981,6882942806404175,4090183263858592,0.99643916 +1023,7173213876371340,6882942806404175,4090183263858592,0.99743253 +1024,7525057597589577,6882942806404175,4090183263858592,0.9960718 +1025,7265572853181963,6882942806404175,4090183263858592,0.9912134 +1026,7401912295170794,6882942806404175,4090183263858592,0.9910678 +1027,7573436109242809,6882942806404175,4090183263858592,0.99144894 +1028,7230388481073953,6882942806404175,4090183263858592,0.9960775 +1029,7406310341682456,6882942806404175,4090183263858592,0.99598783 +1030,7256776760140812,6882942806404175,4090183263858592,0.99602145 +1031,7393116202135026,6882942806404175,4090183263858592,0.9914908 +1032,7529455644096558,6882942806404175,4090183263858592,0.99765223 +1033,7278766992739022,6882942806404175,4090183263858592,0.993669 +1034,7529455644096555,6882942806404175,4090183263858592,0.99863607 +1035,7516261504545915,6882942806404175,4090183263858592,0.99395627 +1036,7393116202132318,6882942806404175,4090183263858592,0.99933076 +1037,7287563085747263,6882942806404175,4090183263858592,0.9989298 +1038,7327145504412172,6882942806404175,4090183263858592,0.9691131 +1039,7190806062433621,6882942806404175,4090183263858592,0.99779344 +1040,7410708388188349,6882942806404175,4090183263858592,0.9973283 +1041,7401912295166476,6882942806404175,4090183263858592,0.99926716 +1042,7300757225307964,6882942806404175,4090183263858592,0.997563 +1043,7190806062433580,6882942806404175,4090183263858592,0.99826163 +1044,7190806062434239,6882942806404175,4090183263858592,0.9986326 +1046,7318349411369465,6882942806404175,4090183263858592,0.98324955 +1047,7410708388188319,6882942806404175,4090183263858592,0.99796706 +1048,7366727923050294,6882942806404175,4090183263858592,0.9994998 +1049,7322747457890587,6882942806404175,4090183263858592,0.9958405 +1050,7256776760137891,6882942806404175,4090183263858592,0.99950325 +1051,7256776760137926,6882942806404175,4090183263858592,0.99957675 +1052,7529455644096599,6882942806404175,4090183263858592,0.9933826 +1053,7177611922880022,6882942806404175,4090183263858592,0.9976198 +1054,7239184574099340,6882942806404175,4090183263858592,0.9993494 +1055,7459086899850353,6882942806404175,4090183263858592,0.9938445 +1056,7353533783478145,6882942806404175,4090183263858592,0.97209203 +1057,7265572853193101,6882942806404175,4090183263858592,0.9987765 +1058,7384320109110841,6882942806404175,4090183263858592,0.9992895 +1060,7450290806825966,6882942806404175,4090183263858592,0.9980178 +1061,7247980667108832,6882942806404175,4090183263858592,0.99915016 +1062,7366727923050264,6882942806404175,4090183263858592,0.99928707 +1063,7353533783495280,6882942806404175,4090183263858592,0.99379057 +1064,7401912295156838,6882942806404175,4090183263858592,0.99573743 +1065,7511863458045291,6882942806404175,4090183263858592,0.9952638 +1066,7507465411520379,6882942806404175,4090183263858592,0.96479523 +1067,7230388481074508,6882942806404175,4090183263858592,0.998061 +1068,7547047830154082,6882942806404175,4090183263858592,0.9959561 +1069,7234786527576327,6882942806404175,4090183263858592,0.9906365 +1071,7195204108948136,6882942806404175,4090183263858592,0.9944623 +1072,7401912295170806,6882942806404175,4090183263858592,0.99311936 +1073,7177611922878898,6882942806404175,4090183263858592,0.9821891 +1074,7243582620606625,6882942806404175,4090183263858592,0.99947387 +1076,7397514248655850,6882942806404175,4090183263858592,0.99877673 +1077,7564640016220311,6882942806404175,4090183263858592,0.9963761 +1078,7393116202126663,6882942806404175,4090183263858592,0.99952626 +1079,7401912295164986,6882942806404175,4090183263858592,0.9917412 +1080,7463484946359859,6882942806404175,4090183263858592,0.99148375 +1081,7225990434559192,6882942806404175,4090183263858592,0.9592846 +1082,7265572853193072,6882942806404175,4090183263858592,0.9987753 +1083,7287563085745500,6882942806404175,4090183263858592,0.97117907 +1084,7239184574099413,6882942806404175,4090183263858592,0.9989312 +1085,7388718155620425,6882942806404175,4090183263858592,0.9994943 +1086,7287563085774283,6882942806404175,4090183263858592,0.99364907 +1087,7529455644110591,6882942806404175,4090183263858592,0.9983688 +1088,7507465411539470,6882942806404175,4090183263858592,0.99735874 +1089,7247980667108801,6882942806404175,4090183263858592,0.99824417 +1090,7278766992742757,6882942806404175,4090183263858592,0.9927556 +1091,7353533783495285,6882942806404175,4090183263858592,0.9870907 +1092,7186408015907331,6882942806404175,4090183263858592,0.9982407 +1093,7547047830154089,6882942806404175,4090183263858592,0.9951566 +1095,7243582620606657,6882942806404175,4090183263858592,0.9995043 +1096,7503067365010510,6882942806404175,4090183263858592,0.99313897 +1097,7384320109110872,6882942806404175,4090183263858592,0.99914134 +1098,7190806062434244,6882942806404175,4090183263858592,0.9967608 +1099,7278766992720777,6882942806404175,4090183263858592,0.9949527 +1101,7199602155446454,6882942806404175,4090183263858592,0.990341 +1102,7379922062581641,6882942806404175,4090183263858592,0.9990281 +1103,7349135736989784,6882942806404175,4090183263858592,0.9937723 +1104,7331543550920369,6882942806404175,4090183263858592,0.95537186 +1105,7379922062576768,6882942806404175,4090183263858592,0.96268445 +1106,7256776760138037,6882942806404175,4090183263858592,0.9991492 +1107,7410708388194297,6882942806404175,4090183263858592,0.99771297 +1108,7503067365025704,6882942806404175,4090183263858592,0.994772 +1109,7410708388194285,6882942806404175,4090183263858592,0.99690104 +1110,7353533783478118,6882942806404175,4090183263858592,0.94185513 +1111,7190806062433626,6882942806404175,4090183263858592,0.90341574 +1112,7239184574099278,6882942806404175,4090183263858592,0.99928147 +1113,7247980667108797,6882942806404175,4090183263858592,0.99892443 +1114,7551445876687218,6882942806404175,4090183263858592,0.99408215 +1115,7463484946386176,6882942806404175,4090183263858592,0.9976261 +1116,7318349411365234,6882942806404175,4090183263858592,0.9979602 +1117,7547047830153282,6882942806404175,4090183263858592,0.97778314 +1118,7256776760137901,6882942806404175,4090183263858592,0.99958307 +1119,7252378713632889,6882942806404175,4090183263858592,0.9995241 +1120,7327145504412212,6882942806404175,4090183263858592,0.9946682 +1121,7393116202134993,6882942806404175,4090183263858592,0.9914909 +1122,7243582620606586,6882942806404175,4090183263858592,0.99587375 +1124,7243582620606595,6882942806404175,4090183263858592,0.99644595 +1125,7261174806658434,6882942806404175,4090183263858592,0.9987245 +1126,7410708388188384,6882942806404175,4090183263858592,0.9964444 +1127,7410708388188377,6882942806404175,4090183263858592,0.99797016 +1128,7393116202118723,6882942806404175,4090183263858592,0.9991912 +1129,7261174806681940,6882942806404175,4090183263858592,0.99935585 +1130,7472281039417500,6882942806404175,4090183263858592,0.81857145 +1131,7397514248655877,6882942806404175,4090183263858592,0.9990362 +1132,7195204108937237,6882942806404175,4090183263858592,0.9897508 +1133,7393116202135007,6882942806404175,4090183263858592,0.989507 +1134,7322747457890547,6882942806404175,4090183263858592,0.99534047 +1135,7397514248655923,6882942806404175,4090183263858592,0.99922264 +1136,7274368946215848,6882942806404175,4090183263858592,0.998626 +1137,7261174806678018,6882942806404175,4090183263858592,0.9988005 +1138,7511863458053088,6882942806404175,4090183263858592,0.9870812 +1139,7274368946215816,6882942806404175,4090183263858592,0.9987684 +1140,7247980667108790,6882942806404175,4090183263858592,0.99892443 +1141,7406310341661106,6882942806404175,4090183263858592,0.99878293 +1142,7278766992728617,6882942806404175,4090183263858592,0.99819225 +1143,7177611922880480,6882942806404175,4090183263858592,0.99412054 +1144,7261174806678022,6882942806404175,4090183263858592,0.99859625 +1145,7366727923050287,6882942806404175,4090183263858592,0.99928623 +1146,7415106434708455,6882942806404175,4090183263858592,0.9850898 +1147,7283165039231452,6882942806404175,4090183263858592,0.9951761 +1148,7406310341661100,6882942806404175,4090183263858592,0.99867094 +1149,7182009969390832,6882942806404175,4090183263858592,0.99649954 +1150,7261174806681914,6882942806404175,4090183263858592,0.99840754 +1151,7230388481069077,6882942806404175,4090183263858592,0.9992962 +1152,7393116202127071,6882942806404175,4090183263858592,0.9968732 +1153,7388718155624502,6882942806404175,4090183263858592,0.9965005 +1154,7560241969700020,6882942806404175,4090183263858592,0.9937133 +1155,7234786527576316,6882942806404175,4090183263858592,0.9793594 +1156,7269970899690681,6882942806404175,4090183263858592,0.9937627 +1157,7388718155600728,6882942806404175,4090183263858592,0.998102 +1158,7481077132422596,6882942806404175,4090183263858592,0.98301333 +1159,7247980667127319,6882942806404175,4090183263858592,0.97187763 +1161,7195204108947648,6882942806404175,4090183263858592,0.9985274 +1162,7168815829857596,6882942806404175,4090183263858592,0.9984767 +1165,7401912295148660,6882942806404175,4090183263858592,0.99510694 +1167,7256776760138046,6882942806404175,4090183263858592,0.9995604 +1168,7388718155625411,6882942806404175,4090183263858592,0.99893075 +1169,7393116202126587,6882942806404175,4090183263858592,0.9961804 +1170,7234786527577293,6882942806404175,4090183263858592,0.99384177 +1171,7349135736965449,6882942806404175,4090183263858592,0.9950695 +1172,7212796294989845,6882942806404175,4090183263858592,0.9985305 +1173,7472281039417475,6882942806404175,4090183263858592,0.8180098 +1174,7397514248655901,6882942806404175,4090183263858592,0.99928844 +1175,7208398248478502,6882942806404175,4090183263858592,0.9779739 +1176,7230388481069085,6882942806404175,4090183263858592,0.9991887 +1177,7322747457890604,6882942806404175,4090183263858592,0.9947465 +1178,7564640016220250,6882942806404175,4090183263858592,0.9988004 +1179,7419504481221956,6882942806404175,4090183263858592,0.99795735 +1180,7529455644096562,6882942806404175,4090183263858592,0.9976555 +1181,7393116202132433,6882942806404175,4090183263858592,0.99582064 +1182,7247980667108711,6882942806404175,4090183263858592,0.99928445 +1183,7384320109091382,6882942806404175,4090183263858592,0.9977671 +1184,7234786527574910,6882942806404175,4090183263858592,0.9993673 +1185,7186408015893907,6882942806404175,4090183263858592,0.9795284 +1186,7243582620598759,6882942806404175,4090183263858592,0.99797016 +1187,7393116202126641,6882942806404175,4090183263858592,0.9990056 +1188,7243582620606688,6882942806404175,4090183263858592,0.99944216 +1189,7384320109095458,6882942806404175,4090183263858592,0.996837 +1190,7243582620606549,6882942806404175,4090183263858592,0.9991436 +1191,7366727923050300,6882942806404175,4090183263858592,0.9994135 +1192,7384320109095276,6882942806404175,4090183263858592,0.997607 +1193,7230388481069838,6882942806404175,4090183263858592,0.9990434 +1194,7186408015909602,6882942806404175,4090183263858592,0.9808435 +1195,7560241969710848,6882942806404175,4090183263858592,0.99726725 +1197,7278766992743770,6882942806404175,4090183263858592,0.80674964 +1198,7261174806681959,6882942806404175,4090183263858592,0.9984119 +1199,7256776760137860,6882942806404175,4090183263858592,0.99865556 +1200,7459086899855609,6882942806404175,4090183263858592,0.99717253 +1201,7313951364848931,6882942806404175,4090183263858592,0.99707866 +1202,7182009969390779,6882942806404175,4090183263858592,0.99767464 +1203,7204000201967864,6882942806404175,4090183263858592,0.989646 +1204,7551445876687210,6882942806404175,4090183263858592,0.9981706 +1205,7261174806653891,6882942806404175,4090183263858592,0.9969009 +1206,7287563085745585,6882942806404175,4090183263858592,0.99440324 +1207,7415106434698416,6882942806404175,4090183263858592,0.9986658 +1208,7256776760138033,6882942806404175,4090183263858592,0.99904054 +1209,7296359178777843,6882942806404175,4090183263858592,0.9977182 +1210,7300757225311411,6882942806404175,4090183263858592,0.9917087 +1211,7256776760141356,6882942806404175,4090183263858592,0.9702342 +1212,7327145504412118,6882942806404175,4090183263858592,0.9862331 +1213,7256776760137886,6882942806404175,4090183263858592,0.9992323 +1214,7520659551076112,6882942806404175,4090183263858592,0.9837546 +1215,7397514248638770,6882942806404175,4090183263858592,0.996646 +1216,7520659551076497,6882942806404175,4090183263858592,0.9837134 +1217,7199602155446162,6882942806404175,4090183263858592,0.99400276 +1218,7428300574265512,6882942806404175,4090183263858592,0.9961867 +1219,7305155271832698,6882942806404175,4090183263858592,0.99796104 +1220,7261174806678144,6882942806404175,4090183263858592,0.99928397 +1221,7318349411369331,6882942806404175,4090183263858592,0.9956541 +1222,7401912295165025,6882942806404175,4090183263858592,0.9784182 +1223,7384320109087270,6882942806404175,4090183263858592,0.9994992 +1224,7182009969390884,6882942806404175,4090183263858592,0.9984748 +1225,7230388481069173,6882942806404175,4090183263858592,0.9971956 +1226,7520659551074295,6882942806404175,4090183263858592,0.99863845 +1227,7459086899859670,6882942806404175,4090183263858592,0.975573 +1228,7494271271986601,6882942806404175,4090183263858592,0.991104 +1230,7459086899855449,6882942806404175,4090183263858592,0.9977431 +1231,7393116202126664,6882942806404175,4090183263858592,0.99864215 +1232,7230388481069053,6882942806404175,4090183263858592,0.99903166 +1233,7278766992738889,6882942806404175,4090183263858592,0.99389786 +1234,7274368946207452,6882942806404175,4090183263858592,0.98929197 +1235,7406310341661020,6882942806404175,4090183263858592,0.9994999 +1236,7393116202138292,6882942806404175,4090183263858592,0.9718829 +1237,7564640016220143,6882942806404175,4090183263858592,0.99843246 +1239,7463484946380128,6882942806404175,4090183263858592,0.99237293 +1240,7401912295148431,6882942806404175,4090183263858592,0.972313 +1241,7388718155624513,6882942806404175,4090183263858592,0.9972156 +1242,7511863458044347,6882942806404175,4090183263858592,0.9931988 +1243,7204000201967982,6882942806404175,4090183263858592,0.99795234 +1244,7287563085747366,6882942806404175,4090183263858592,0.99876875 +1245,7230388481069220,6882942806404175,4090183263858592,0.99920243 +1246,7353533783478127,6882942806404175,4090183263858592,0.9553711 +1247,7410708388176281,6882942806404175,4090183263858592,0.9968141 +1248,7357931830005061,6882942806404175,4090183263858592,0.97741264 +1249,7274368946215860,6882942806404175,4090183263858592,0.9992673 +1250,7204000201967936,6882942806404175,4090183263858592,0.99499196 +1251,7300757225309501,6882942806404175,4090183263858592,0.98308474 +1252,7265572853193109,6882942806404175,4090183263858592,0.99541557 +1253,7243582620606615,6882942806404175,4090183263858592,0.99933857 +1254,7507465411539455,6882942806404175,4090183263858592,0.9764282 +1255,7507465411539471,6882942806404175,4090183263858592,0.9984701 +1256,7300757225306743,6882942806404175,4090183263858592,0.9832313 +1257,7393116202126660,6882942806404175,4090183263858592,0.9995529 +1258,7261174806678030,6882942806404175,4090183263858592,0.9989255 +1259,7511863458044281,6882942806404175,4090183263858592,0.9943715 +1260,7204000201957870,6882942806404175,4090183263858592,0.9917528 +1261,7247980667108718,6882942806404175,4090183263858592,0.99894613 +1263,7168815829855656,6882942806404175,4090183263858592,0.9990275 +1264,7182009969390836,6882942806404175,4090183263858592,0.9980117 +1265,7472281039392903,6882942806404175,4090183263858592,0.94741684 +1266,7305155271832711,6882942806404175,4090183263858592,0.9965031 +1267,7243582620602173,6882942806404175,4090183263858592,0.9964616 +1268,7547047830177124,6882942806404175,4090183263858592,0.99840766 +1269,7256776760137870,6882942806404175,4090183263858592,0.9938355 +1270,7208398248478429,6882942806404175,4090183263858592,0.985261 +1271,7472281039392862,6882942806404175,4090183263858592,0.8187587 +1272,7393116202113802,6882942806404175,4090183263858592,0.99332994 +1273,7503067365010541,6882942806404175,4090183263858592,0.9928306 +1274,7415106434698406,6882942806404175,4090183263858592,0.9982931 +1275,7318349411352562,6882942806404175,4090183263858592,0.9863897 +1276,7335941597434734,6882942806404175,4090183263858592,0.9659257 +1277,7547047830177185,6882942806404175,4090183263858592,0.9984119 +1278,7401912295166420,6882942806404175,4090183263858592,0.99933463 +1279,7287563085745413,6882942806404175,4090183263858592,0.99312097 +1280,7547047830177226,6882942806404175,4090183263858592,0.9982243 +1281,7212796294989983,6882942806404175,4090183263858592,0.99795145 +1282,7261174806681953,6882942806404175,4090183263858592,0.99903786 +1283,7388718155600364,6882942806404175,4090183263858592,0.9966978 +1284,7419504481212748,6882942806404175,4090183263858592,0.9947989 +1285,7291961132288717,6882942806404175,4090183263858592,0.99019605 +1286,7287563085760953,6882942806404175,4090183263858592,0.9955382 +1287,7410708388176265,6882942806404175,4090183263858592,0.99947864 +1288,7353533783476069,6882942806404175,4090183263858592,0.9966587 +1289,7243582620606559,6882942806404175,4090183263858592,0.9995285 +1290,7168815829855631,6882942806404175,4090183263858592,0.8700235 +1291,7454688853347421,6882942806404175,4090183263858592,0.9957605 +1292,7366727923050276,6882942806404175,4090183263858592,0.9995524 +1293,7331543550924002,6882942806404175,4090183263858592,0.9196226 +1294,7274368946215832,6882942806404175,4090183263858592,0.99890447 +1295,7261174806678065,6882942806404175,4090183263858592,0.9958028 +1297,7199602155446108,6882942806404175,4090183263858592,0.99502325 +1298,7357931830014324,6882942806404175,4090183263858592,0.93096435 +1299,7503067365024229,6882942806404175,4090183263858592,0.9952362 +1300,7247980667118790,6882942806404175,4090183263858592,0.9944317 +1301,7375524016073995,6882942806404175,4090183263858592,0.9993849 +1302,7291961132280353,6882942806404175,4090183263858592,0.99814427 +1303,7375524016074061,6882942806404175,4090183263858592,0.9994943 +1304,7564640016220329,6882942806404175,4090183263858592,0.9979572 +1305,7401912295171567,6882942806404175,4090183263858592,0.96937144 +1306,7573436109243972,6882942806404175,4090183263858592,0.97366333 +1307,7459086899865488,6882942806404175,4090183263858592,0.9983889 +1308,7256776760141320,6882942806404175,4090183263858592,0.979362 +1309,7564640016232827,6882942806404175,4090183263858592,0.9640571 +1310,7472281039417467,6882942806404175,4090183263858592,0.8189706 +1311,7190806062425187,6882942806404175,4090183263858592,0.9989396 +1312,7520659551076439,6882942806404175,4090183263858592,0.98327154 +1313,7384320109087109,6882942806404175,4090183263858592,0.9904358 +1314,7393116202141250,6882942806404175,4090183263858592,0.995708 +1315,7230388481069157,6882942806404175,4090183263858592,0.9993905 +1316,7252378713632948,6882942806404175,4090183263858592,0.99945265 +1317,7573436109244007,6882942806404175,4090183263858592,0.9989266 +1318,7463484946380139,6882942806404175,4090183263858592,0.99245983 +1319,7234786527574919,6882942806404175,4090183263858592,0.9989178 +1320,7507465411539489,6882942806404175,4090183263858592,0.9980064 +1321,7375524016074003,6882942806404175,4090183263858592,0.9993749 +1322,7278766992717785,6882942806404175,4090183263858592,0.9951337 +1323,7243582620598776,6882942806404175,4090183263858592,0.99732435 +1324,7300757225306754,6882942806404175,4090183263858592,0.9966364 +1325,7362329876535625,6882942806404175,4090183263858592,0.98296124 +1326,7432698620769808,6882942806404175,4090183263858592,0.99623847 +1327,7401912295166377,6882942806404175,4090183263858592,0.9986259 +1328,7199602155459100,6882942806404175,4090183263858592,0.9869178 +1329,7397514248655838,6882942806404175,4090183263858592,0.999356 +1330,7397514248655879,6882942806404175,4090183263858592,0.99903786 +1331,7564640016220243,6882942806404175,4090183263858592,0.99402446 +1332,7467882992890549,6882942806404175,4090183263858592,0.959962 +1334,7551445876687165,6882942806404175,4090183263858592,0.99049616 +1335,7406310341679859,6882942806404175,4090183263858592,0.98188525 +1336,7296359178799657,6882942806404175,4090183263858592,0.99625444 +1337,7335941597441580,6882942806404175,4090183263858592,0.99235606 +1338,7410708388176190,6882942806404175,4090183263858592,0.99944717 +1339,7186408015909140,6882942806404175,4090183263858592,0.9708902 +1340,7511863458044270,6882942806404175,4090183263858592,0.9944149 +1341,7410708388178720,6882942806404175,4090183263858592,0.9956533 +1342,7573436109242785,6882942806404175,4090183263858592,0.9932051 +1343,7410708388188345,6882942806404175,4090183263858592,0.99643916 +1344,7459086899859808,6882942806404175,4090183263858592,0.9111218 +1345,7247980667108769,6882942806404175,4090183263858592,0.99881065 +1346,7357931830015319,6882942806404175,4090183263858592,0.90693283 +1347,7243582620598756,6882942806404175,4090183263858592,0.9973284 +1348,7243582620602248,6882942806404175,4090183263858592,0.9994048 +1349,7516261504558077,6882942806404175,4090183263858592,0.88317734 +1351,7511863458044103,6882942806404175,4090183263858592,0.9934261 +1352,7415106434698525,6882942806404175,4090183263858592,0.9992244 +1353,7410708388188403,6882942806404175,4090183263858592,0.99732435 +1354,7564640016220186,6882942806404175,4090183263858592,0.99821186 +1355,7177611922879157,6882942806404175,4090183263858592,0.9944482 +1356,7573436109244106,6882942806404175,4090183263858592,0.99863607 +1357,7388718155624467,6882942806404175,4090183263858592,0.9967801 +1358,7313951364844429,6882942806404175,4090183263858592,0.9869278 +1359,7335941597433396,6882942806404175,4090183263858592,0.99571806 +1360,7393116202126668,6882942806404175,4090183263858592,0.9987826 +1361,7467882992891436,6882942806404175,4090183263858592,0.9683072 +1362,7208398248478456,6882942806404175,4090183263858592,0.9878014 +1363,7507465411539515,6882942806404175,4090183263858592,0.9985915 +1366,7511863458040115,6882942806404175,4090183263858592,0.9935865 +1367,7551445876686549,6882942806404175,4090183263858592,0.97648865 +1368,7415106434697909,6882942806404175,4090183263858592,0.9911413 +1369,7252378713624959,6882942806404175,4090183263858592,0.99660957 +1370,7199602155458908,6882942806404175,4090183263858592,0.9894581 +1371,7247980667108846,6882942806404175,4090183263858592,0.9993666 +1372,7261174806681958,6882942806404175,4090183263858592,0.9992238 +1373,7481077132433334,6882942806404175,4090183263858592,0.99893993 +1374,7344737690452538,6882942806404175,4090183263858592,0.9729637 +1375,7300757225306789,6882942806404175,4090183263858592,0.9970372 +1376,7432698620780962,6882942806404175,4090183263858592,0.9985267 +1377,7243582620598761,6882942806404175,4090183263858592,0.99796706 +1378,7472281039392949,6882942806404175,4090183263858592,0.81770307 +1379,7401912295166382,6882942806404175,4090183263858592,0.9985965 +1380,7177611922878854,6882942806404175,4090183263858592,0.9822031 +1381,7384320109091391,6882942806404175,4090183263858592,0.99450266 +1382,7393116202126670,6882942806404175,4090183263858592,0.9961796 +1383,7419504481207960,6882942806404175,4090183263858592,0.98923534 +1384,7199602155446157,6882942806404175,4090183263858592,0.99403423 +1385,7287563085745436,6882942806404175,4090183263858592,0.98800105 +1386,7393116202126654,6882942806404175,4090183263858592,0.9987581 +1387,7560241969708982,6882942806404175,4090183263858592,0.99213177 +1388,7401912295166395,6882942806404175,4090183263858592,0.99890447 +1389,7247980667108820,6882942806404175,4090183263858592,0.9989505 +1390,7401912295156795,6882942806404175,4090183263858592,0.9967096 +1391,7190806062434257,6882942806404175,4090183263858592,0.9967643 +1392,7239184574099387,6882942806404175,4090183263858592,0.9995161 +1393,7353533783504670,6882942806404175,4090183263858592,0.99149734 +1394,7476679085912961,6882942806404175,4090183263858592,0.99260336 +1395,7498669318503963,6882942806404175,4090183263858592,0.9807351 +1397,7401912295166453,6882942806404175,4090183263858592,0.99913484 +1398,7300757225306777,6882942806404175,4090183263858592,0.99628204 +1399,7573436109244128,6882942806404175,4090183263858592,0.9968702 +1400,7406310341682448,6882942806404175,4090183263858592,0.9969886 +1401,7529455644096546,6882942806404175,4090183263858592,0.9982243 +1402,7243582620599881,6882942806404175,4090183263858592,0.9423365 +1403,7459086899865492,6882942806404175,4090183263858592,0.99839765 +1404,7529455644096537,6882942806404175,4090183263858592,0.9982272 +1405,7190806062434215,6882942806404175,4090183263858592,0.9986325 +1406,7287563085772746,6882942806404175,4090183263858592,0.99881727 +1407,7410708388176243,6882942806404175,4090183263858592,0.9993849 +1408,7384320109096452,6882942806404175,4090183263858592,0.999335 +1409,7230388481064642,6882942806404175,4090183263858592,0.99775416 +1410,7393116202118706,6882942806404175,4090183263858592,0.99934727 +1411,7476679085906251,6882942806404175,4090183263858592,0.99880135 +1412,7182009969397112,6882942806404175,4090183263858592,0.9607907 +1413,7230388481064691,6882942806404175,4090183263858592,0.9960686 +1414,7388718155624476,6882942806404175,4090183263858592,0.99678 +1415,7190806062434114,6882942806404175,4090183263858592,0.9980641 +1416,7428300574238769,6882942806404175,4090183263858592,0.9945075 +1417,7393116202126672,6882942806404175,4090183263858592,0.9994992 +1418,7573436109244075,6882942806404175,4090183263858592,0.99822706 +1419,7300757225306799,6882942806404175,4090183263858592,0.99028337 +1421,7450290806816403,6882942806404175,4090183263858592,0.99827754 +1422,7393116202139793,6882942806404175,4090183263858592,0.9592872 +1423,7507465411539339,6882942806404175,4090183263858592,0.99443024 +1424,7305155271832624,6882942806404175,4090183263858592,0.9965011 +1425,7190806062433642,6882942806404175,4090183263858592,0.992761 +1426,7243582620606573,6882942806404175,4090183263858592,0.99716055 +1427,7300757225308097,6882942806404175,4090183263858592,0.9947826 +1428,7476679085912859,6882942806404175,4090183263858592,0.99262625 +1429,7445892760297554,6882942806404175,4090183263858592,0.9962463 +1430,7261174806655442,6882942806404175,4090183263858592,0.9986469 +1431,7406310341661010,6882942806404175,4090183263858592,0.9994438 +1432,7256776760138022,6882942806404175,4090183263858592,0.9992824 +1433,7410708388176208,6882942806404175,4090183263858592,0.999435 +1434,7516261504570287,6882942806404175,4090183263858592,0.9906819 +1435,7375524016071065,6882942806404175,4090183263858592,0.99643373 +1436,7234786527562272,6882942806404175,4090183263858592,0.98535943 +1437,7507465411521407,6882942806404175,4090183263858592,0.97251546 +1438,7401912295166389,6882942806404175,4090183263858592,0.99919134 +1439,7366727923050382,6882942806404175,4090183263858592,0.99941254 +1440,7406310341679870,6882942806404175,4090183263858592,0.9821775 +1441,7261174806681929,6882942806404175,4090183263858592,0.9993548 +1442,7327145504412302,6882942806404175,4090183263858592,0.99586344 +1443,7195204108948041,6882942806404175,4090183263858592,0.9983012 +1444,7472281039392860,6882942806404175,4090183263858592,0.8184947 +1445,7243582620606610,6882942806404175,4090183263858592,0.9991277 +1446,7190806062434190,6882942806404175,4090183263858592,0.9963013 +1447,7547047830177241,6882942806404175,4090183263858592,0.99686384 +1448,7362329876531335,6882942806404175,4090183263858592,0.9962612 +1449,7261174806672752,6882942806404175,4090183263858592,0.9934541 +1450,7375524016063687,6882942806404175,4090183263858592,0.99573 +1451,7173213876375240,6882942806404175,4090183263858592,0.99180084 +1452,7322747457870071,6882942806404175,4090183263858592,0.98239994 +1453,7335941597433390,6882942806404175,4090183263858592,0.994584 +1454,7256776760138050,6882942806404175,4090183263858592,0.9995771 +1455,7261174806653910,6882942806404175,4090183263858592,0.99771297 +1456,7485475178942196,6882942806404175,4090183263858592,0.9988662 +1457,7406310341661104,6882942806404175,4090183263858592,0.99944216 +1458,7393116202118694,6882942806404175,4090183263858592,0.9992048 +1459,7256776760137990,6882942806404175,4090183263858592,0.9995208 +1460,7261174806678012,6882942806404175,4090183263858592,0.9991172 +1461,7247980667108738,6882942806404175,4090183263858592,0.9995609 +1462,7261174806677974,6882942806404175,4090183263858592,0.9981706 +1463,7388718155600343,6882942806404175,4090183263858592,0.9947126 +1464,7459086899847371,6882942806404175,4090183263858592,0.95768064 +1465,7182009969390746,6882942806404175,4090183263858592,0.9976705 +1466,7419504481208414,6882942806404175,4090183263858592,0.98272645 +1467,7168815829855627,6882942806404175,4090183263858592,0.86879003 +1468,7564640016220183,6882942806404175,4090183263858592,0.99847025 +1469,7393116202132317,6882942806404175,4090183263858592,0.99354726 +1470,7186408015907385,6882942806404175,4090183263858592,0.9977672 +1471,7296359178796166,6882942806404175,4090183263858592,0.9832313 +1472,7234786527577318,6882942806404175,4090183263858592,0.98988265 +1473,7463484946386258,6882942806404175,4090183263858592,0.99756086 +1474,7415106434700102,6882942806404175,4090183263858592,0.99941254 +1475,7410708388184576,6882942806404175,4090183263858592,0.99006826 +1476,7450290806825933,6882942806404175,4090183263858592,0.99795425 +1477,7243582620602234,6882942806404175,4090183263858592,0.99598783 +1478,7208398248478513,6882942806404175,4090183263858592,0.99629694 +1479,7547047830177233,6882942806404175,4090183263858592,0.99765235 +1480,7261174806678097,6882942806404175,4090183263858592,0.9991347 +1481,7472281039396687,6882942806404175,4090183263858592,0.9245484 +1482,7401912295166387,6882942806404175,4090183263858592,0.99934727 +1483,7265572853193077,6882942806404175,4090183263858592,0.9991116 +1484,7239184574099252,6882942806404175,4090183263858592,0.9995432 +1485,7225990434559241,6882942806404175,4090183263858592,0.9692091 +1486,7397514248655870,6882942806404175,4090183263858592,0.9993548 +1487,7261174806681907,6882942806404175,4090183263858592,0.99910873 +1488,7212796294988308,6882942806404175,4090183263858592,0.9974032 +1489,7388718155625531,6882942806404175,4090183263858592,0.9942983 +1490,7401912295166460,6882942806404175,4090183263858592,0.99920636 +1491,7401912295166468,6882942806404175,4090183263858592,0.9991173 +1492,7419504481208314,6882942806404175,4090183263858592,0.9693611 +1493,7243582620599836,6882942806404175,4090183263858592,0.9946238 +1494,7410708388178812,6882942806404175,4090183263858592,0.9915138 +1495,7529455644113160,6882942806404175,4090183263858592,0.998844 +1496,7230388481064648,6882942806404175,4090183263858592,0.999074 +1497,7186408015907366,6882942806404175,4090183263858592,0.9982888 +1498,7564640016232994,6882942806404175,4090183263858592,0.966499 +1499,7410708388188450,6882942806404175,4090183263858592,0.98034614 +1501,7476679085906169,6882942806404175,4090183263858592,0.99880683 +1502,7375524016077450,6882942806404175,4090183263858592,0.9903376 +1503,7564640016220138,6882942806404175,4090183263858592,0.99266124 +1504,7401912295170767,6882942806404175,4090183263858592,0.99327856 +1505,7393116202126605,6882942806404175,4090183263858592,0.9961798 +1506,7432698620772250,6882942806404175,4090183263858592,0.9946038 +1507,7388718155620880,6882942806404175,4090183263858592,0.9915138 +1508,7195204108948061,6882942806404175,4090183263858592,0.9954372 +1509,7463484946380137,6882942806404175,4090183263858592,0.9926197 +1510,7375524016070832,6882942806404175,4090183263858592,0.9968725 +1511,7419504481209847,6882942806404175,4090183263858592,0.994368 +1512,7401912295166441,6882942806404175,4090183263858592,0.99928385 +1513,7190806062434119,6882942806404175,4090183263858592,0.9926892 +1514,7322747457870173,6882942806404175,4090183263858592,0.99762946 +1515,7243582620606725,6882942806404175,4090183263858592,0.9990526 +1516,7182009969390750,6882942806404175,4090183263858592,0.9973732 +1517,7507465411520214,6882942806404175,4090183263858592,0.99048764 +1518,7384320109110710,6882942806404175,4090183263858592,0.9785064 +1519,7564640016220193,6882942806404175,4090183263858592,0.9964695 +1520,7256776760137934,6882942806404175,4090183263858592,0.9987943 +1521,7247980667119556,6882942806404175,4090183263858592,0.9963683 +1522,7247980667108777,6882942806404175,4090183263858592,0.99824667 +1523,7313951364850817,6882942806404175,4090183263858592,0.99811447 +1524,7397514248657844,6882942806404175,4090183263858592,0.9977695 +1525,7190806062435082,6882942806404175,4090183263858592,0.9975535 +1526,7256776760137985,6882942806404175,4090183263858592,0.9994617 +1527,7274368946213654,6882942806404175,4090183263858592,0.9951415 +1528,7375524016073976,6882942806404175,4090183263858592,0.999435 +1529,7283165039233194,6882942806404175,4090183263858592,0.99852645 +1530,7349135736965568,6882942806404175,4090183263858592,0.99632037 +1531,7357931830005065,6882942806404175,4090183263858592,0.97792953 +1532,7415106434691264,6882942806404175,4090183263858592,0.997024 +1533,7476679085912971,6882942806404175,4090183263858592,0.9924724 +1534,7182009969405113,6882942806404175,4090183263858592,0.9974993 +1535,7234786527586088,6882942806404175,4090183263858592,0.99661547 +1536,7256776760162558,6882942806404175,4090183263858592,0.99857056 +1537,7190806062433657,6882942806404175,4090183263858592,0.9960782 +1538,7186408015893914,6882942806404175,4090183263858592,0.9809441 +1539,7247980667108841,6882942806404175,4090183263858592,0.99888664 +1540,7410708388193494,6882942806404175,4090183263858592,0.99368805 +1542,7401912295156734,6882942806404175,4090183263858592,0.9989266 +1543,7547047830157993,6882942806404175,4090183263858592,0.99723524 +1544,7247980667108786,6882942806404175,4090183263858592,0.99865353 +1546,7243582620599822,6882942806404175,4090183263858592,0.9800608 +1548,7357931830005076,6882942806404175,4090183263858592,0.97648877 +1549,7406310341661030,6882942806404175,4090183263858592,0.9995258 +1550,7182009969390874,6882942806404175,4090183263858592,0.9565266 +1551,7186408015914333,6882942806404175,4090183263858592,0.98419464 +1552,7322747457894114,6882942806404175,4090183263858592,0.9946344 +1553,7256776760137958,6882942806404175,4090183263858592,0.9992312 +1554,7454688853339363,6882942806404175,4090183263858592,0.98012984 +1555,7256776760137904,6882942806404175,4090183263858592,0.99905795 +1556,7507465411530642,6882942806404175,4090183263858592,0.9951444 +1558,7437096667283276,6882942806404175,4090183263858592,0.98808634 +1559,7371125969554962,6882942806404175,4090183263858592,0.9994438 +1560,7454688853347415,6882942806404175,4090183263858592,0.9957652 +1561,7261174806653917,6882942806404175,4090183263858592,0.99764615 +1562,7542649783634679,6882942806404175,4090183263858592,0.997044 +1563,7375524016073954,6882942806404175,4090183263858592,0.999508 +1564,7388718155619688,6882942806404175,4090183263858592,0.99773645 +1565,7397514248655819,6882942806404175,4090183263858592,0.9994135 +1566,7406310341682479,6882942806404175,4090183263858592,0.99764615 +1567,7296359178777904,6874146713382665,4090183263858592,0.9820857 +1568,7186408015914354,6874146713382665,4090183263858592,0.976823 +1569,7204000201979335,6891738899432775,4090183263858599,0.9989893 +1570,7384320109100659,6891738899432775,4090183263858599,0.99865544 +1572,7388718155609362,6891738899432720,4090183263858619,0.994087 +1575,7186408015906779,6891738899432720,4090183263858619,0.841166 +1577,7366727923050314,6882942806404146,4090183263858619,0.9901337 +1578,7406310341674090,6891738899431728,4090183263858621,0.97164303 +1579,7371125969549286,6891738899431728,4090183263858621,0.97640264 +1580,7349135736984824,6891738899431728,4090183263858621,0.97532654 +1581,7349135736984757,6891738899431728,4090183263858621,0.9753287 +1582,7353533783504134,6891738899431728,4090183263858621,0.9764 +1583,7406310341674142,6891738899431728,4090183263858621,0.9716448 +1590,7230388481068727,6891738899432071,4090183263858628,0.9985967 +1594,7388718155601792,6891738899432071,4090183263858628,0.9968934 +1595,7393116202119567,6891738899432071,4090183263858628,0.9950139 +1596,7525057597594435,6891738899432071,4090183263858628,0.99941623 +1598,7454688853339479,6891738899432071,4090183263858628,0.9833409 +1600,7397514248650609,6891738899432071,4090183263858628,0.99914265 +1603,7204000201960973,6891738899432071,4090183263858628,0.9284748 +1604,7204000201961007,6891738899432071,4090183263858628,0.999567 +1605,7379922062574650,6891738899431956,4090183263858628,0.952374 +1606,7397514248650736,6891738899431797,4090183263858628,0.99906904 +1607,7230388481068738,6891738899431797,4090183263858628,0.99931216 +1608,7459086899850734,6891738899431642,4090183263858687,0.997678 +1609,7296359178796106,6891738899431642,4090183263858687,0.9980704 +1610,7296359178796084,6891738899431642,4090183263858687,0.9980703 +1611,7445892760317693,6891738899431642,4090183263858687,0.9983103 +1612,7489873225479650,6891738899431642,4090183263858687,0.99664956 +1613,7503067365006093,6891738899431642,4090183263858687,0.9978314 +1614,7362329876513581,6891738899431642,4090183263858687,0.9979963 +1615,7415106434695980,6891738899431642,4090183263858687,0.9941519 +1616,7371125969555594,6891738899431642,4090183263858687,0.9976883 +1617,7520659551068995,6891738899431642,4090183263858687,0.9985331 +1618,7450290806816275,6891738899431642,4090183263858687,0.99795246 +1619,7459086899850323,6891738899431642,4090183263858687,0.9959817 +1620,7445892760317667,6891738899431642,4090183263858687,0.9983095 +1621,7371125969555042,6891738899431642,4090183263858687,0.99817884 +1622,7371125969555641,6891738899431642,4090183263858687,0.99768806 +1623,7459086899850721,6891738899431642,4090183263858687,0.99801815 +1624,7393116202117389,6891738899431642,4090183263858687,0.9981592 +1625,7384320109104960,6891738899431642,4090183263858687,0.99883837 +1626,7445892760317704,6891738899431642,4090183263858687,0.998309 +1627,7498669318509622,6891738899431642,4090183263858687,0.9979361 +1628,7371125969555025,6891738899431642,4090183263858687,0.9973508 +1629,7379922062578883,6891738899431642,4090183263858687,0.99768853 +1630,7357931830020264,6891738899431642,4090183263858687,0.9979965 +1631,7450290806816269,6891738899431642,4090183263858687,0.9979539 +1632,7459086899850344,6891738899431642,4090183263858687,0.995981 +1633,7287563085772760,6891738899431642,4090183263858687,0.99807173 +1634,7520659551076256,6891738899431642,4090183263858687,0.9955232 +1635,7269970899702608,6891738899431642,4090183263858687,0.9969374 +1636,7371125969555102,6891738899431642,4090183263858687,0.99817884 +1637,7366727923047753,6891738899431642,4090183263858687,0.9981785 +1638,7371125969555092,6891738899431642,4090183263858687,0.99817836 +1639,7401912295166325,6891738899431642,4090183263858687,0.99483216 +1640,7379922062574580,6891738899431642,4090183263858687,0.9983242 +1641,7287563085772767,6891738899431642,4090183263858687,0.9980716 +1642,7287563085772741,6891738899431642,4090183263858687,0.99807173 +1643,7195204108942527,6891738899431642,4090183263858687,0.99847716 +1644,7362329876531229,6891738899431642,4090183263858687,0.99785787 +1645,7489873225479646,6891738899431642,4090183263858687,0.9985006 +1646,7379922062574591,6891738899431642,4090183263858687,0.99832517 +1647,7265572853193163,6891738899431642,4090183263858687,0.9983525 +1648,7459086899850328,6891738899431642,4090183263858687,0.9959818 +1649,7287563085772734,6891738899431642,4090183263858687,0.9980718 +1650,7520659551069003,6891738899431642,4090183263858687,0.99853384 +1651,7445892760315962,6891738899431642,4090183263858687,0.9972191 +1652,7401912295163137,6891738899431642,4090183263858687,0.9941527 +1653,7256776760146845,6891738899431642,4090183263858687,0.99834716 +1654,7463484946359883,6891738899431642,4090183263858687,0.99801815 +1655,7503067365006095,6891738899431642,4090183263858687,0.997832 +1656,7445892760315990,6891738899431642,4090183263858687,0.9972178 +1657,7388718155605662,6891738899431642,4090183263858687,0.99817836 +1658,7503067365006103,6891738899431642,4090183263858687,0.99287146 +1659,7362329876513582,6891738899431642,4090183263858687,0.99786466 +1660,7379922062572260,6891738899431642,4090183263858687,0.99832636 +1661,7327145504406432,6891738899431642,4090183263858687,0.9953055 +1662,7327145504406356,6891738899431642,4090183263858687,0.99648535 +1663,7445892760315999,6891738899431642,4090183263858687,0.9963742 +1664,7450290806816268,6891738899431642,4090183263858687,0.99795365 +1665,7498669318509625,6891738899431642,4090183263858687,0.99793637 +1666,7384320109104958,6891738899431642,4090183263858687,0.99847203 +1667,7393116202117406,6891738899431642,4090183263858687,0.99800617 +1668,7520659551068945,6891738899431642,4090183263858687,0.99626774 +1669,7511863458044432,6891738899431642,4090183263858687,0.998218 +1670,7371125969555062,6891738899431642,4090183263858687,0.99817896 +1671,7459086899850725,6891738899431642,4090183263858687,0.99615806 +1672,7459086899850303,6891738899431642,4090183263858687,0.9959799 +1673,7520659551069001,6891738899431642,4090183263858687,0.99853396 +1674,7503067365006090,6891738899431642,4090183263858687,0.99783164 +1675,7239184574102048,6891738899431642,4090183263858687,0.9985732 +1676,7371125969555029,6891738899431642,4090183263858687,0.99817884 +1677,7371125969555686,6891738899431642,4090183263858687,0.9976883 +1678,7366727923031790,6891738899431642,4090183263858687,0.9981407 +1679,7379922062578897,6891738899431642,4090183263858687,0.99768853 +1680,7296359178796099,6891738899431642,4090183263858687,0.99807173 +1681,7357931830020270,6891738899431642,4090183263858687,0.9979995 +1682,7459086899850788,6891738899431642,4090183263858687,0.99636406 +1683,7445892760317698,6891738899431642,4090183263858687,0.99555296 +1684,7362329876513579,6891738899431642,4090183263858687,0.9978642 +1685,7445892760317679,6891738899431642,4090183263858687,0.9983103 +1686,7366727923031785,6891738899431642,4090183263858687,0.9934794 +1687,7459086899850423,6891738899431642,4090183263858687,0.995981 +1688,7498669318509629,6891738899431642,4090183263858687,0.99793506 +1689,7397514248645152,6874146713380997,4090183263858687,0.9996561 +1690,7564640016225726,6874146713380997,4090183263858687,0.9996636 +1691,7388718155600229,6874146713380997,4090183263858687,0.9996561 +1692,7340339643943651,6874146713380997,4090183263858687,0.9996669 +1693,7349135736966268,6874146713380997,4090183263858687,0.9996685 +1694,7406310341679881,6874146713380997,4090183263858687,0.99979 +1695,7520659551076441,6874146713380997,4090183263858687,0.9996635 +1696,7423902527730985,6874146713380997,4090183263858687,0.9997094 +1697,7393116202138438,6874146713380997,4090183263858687,0.99958974 +1698,7247980667127379,6874146713380997,4090183263858687,0.9995931 +1699,7393116202138456,6874146713380997,4090183263858687,0.9996413 +1700,7560241969711838,6874146713380997,4090183263858687,0.9996569 +1701,7379922062578967,6874146713380997,4090183263858687,0.99967194 +1702,7410708388178560,6874146713380997,4090183263858687,0.99963355 +1703,7164417783344886,6874146713380997,4090183263858687,0.999648 +1704,7252378713636375,6874146713380997,4090183263858687,0.9995931 +1705,7384320109091359,6874146713380997,4090183263858687,0.9996309 +1706,7397514248645135,6874146713380997,4090183263858687,0.99967337 +1707,7230388481074507,6874146713380997,4090183263858687,0.99958974 +1708,7406310341679813,6874146713380997,4090183263858687,0.9997968 +1709,7384320109091305,6874146713380997,4090183263858687,0.9996687 +1710,7401912295150994,6874146713380997,4090183263858687,0.99958783 +1711,7256776760140800,6874146713380997,4090183263858687,0.9996419 +1712,7230388481074565,6874146713380997,4090183263858687,0.99958974 +1713,7388718155600223,6874146713380997,4090183263858687,0.9995877 +1714,7234786527587799,6874146713380997,4090183263858687,0.9996562 +1715,7261174806676777,6874146713380997,4090183263858687,0.99967337 +1716,7384320109091450,6874146713380997,4090183263858687,0.999655 +1717,7261174806676787,6874146713380997,4090183263858687,0.99967337 +1718,7560241969711871,6874146713380997,4090183263858687,0.9996532 +1719,7340339643943773,6874146713380997,4090183263858687,0.9996112 +1720,7401912295151074,6874146713380997,4090183263858687,0.9996309 +1721,7362329876534168,6874146713380997,4090183263858687,0.9996561 +1722,7256776760140728,6874146713380997,4090183263858687,0.99958974 +1723,7393116202138398,6874146713380997,4090183263858687,0.99958974 +1724,7349135736966254,6874146713380997,4090183263858687,0.99965954 +1725,7234786527587895,6874146713380997,4090183263858687,0.9995931 +1726,7234786527587771,6874146713380997,4090183263858687,0.9996562 +1727,7331543550920406,6874146713380997,4090183263858687,0.9996426 +1728,7261174806676770,6874146713380997,4090183263858687,0.99967337 +1729,7393116202138692,6874146713380997,4090183263858687,0.99958974 +1730,7388718155600226,6874146713380997,4090183263858687,0.9996309 +1731,7379922062578951,6874146713380997,4090183263858687,0.9996561 +1732,7234786527587830,6874146713380997,4090183263858687,0.9995931 +1733,7340339643943796,6874146713380997,4090183263858687,0.99955755 +1734,7388718155600193,6874146713380997,4090183263858687,0.9996309 +1735,7269970899705087,6874146713380997,4090183263858687,0.9996569 +1736,7520659551076390,6874146713380997,4090183263858687,0.9996562 +1737,7520659551076460,6874146713380997,4090183263858687,0.9996636 +1738,7397514248645179,6874146713380997,4090183263858687,0.9996561 +1739,7560241969711950,6874146713380997,4090183263858687,0.9996636 +1740,7397514248645173,6874146713380997,4090183263858687,0.9996561 +1741,7234786527587937,6874146713380997,4090183263858687,0.9996562 +1742,7340339643943742,6874146713380997,4090183263858687,0.9996669 +1743,7287563085749224,6874146713380997,4090183263858687,0.9996718 +1744,7177611922878076,6874146713380997,4090183263858687,0.99967265 +1745,7261174806676802,6874146713380997,4090183263858687,0.99967194 +1746,7520659551076475,6874146713380997,4090183263858687,0.9996562 +1747,7379922062578964,6874146713380997,4090183263858687,0.9995877 +1748,7287563085749239,6874146713380997,4090183263858687,0.99967337 +1749,7340339643943801,6874146713380997,4090183263858687,0.9996669 +1750,7234786527587783,6874146713380997,4090183263858687,0.9996301 +1751,7204000201960951,6874146713380997,4090183263858687,0.99900407 +1752,7401912295151025,6874146713380997,4090183263858687,0.9995877 +1753,7177611922878098,6874146713380997,4090183263858687,0.99967265 +1754,7388718155600190,6874146713380997,4090183263858687,0.9996561 +1755,7401912295150988,6874146713380997,4090183263858687,0.9995877 +1756,7410708388178540,6874146713380997,4090183263858687,0.9996687 +1757,7256776760140818,6874146713380997,4090183263858687,0.99958974 +1758,7362329876513646,6874146713380997,4090183263858687,0.9996532 +1759,7247980667127399,6874146713380997,4090183263858687,0.9996301 +1760,7177611922878116,6874146713380997,4090183263858687,0.99967253 +1761,7520659551076395,6874146713380997,4090183263858687,0.9996301 +1762,7560241969711965,6874146713380997,4090183263858687,0.9996568 +1763,7406310341679901,6874146713380997,4090183263858687,0.99973506 +1764,7269970899705022,6874146713380997,4090183263858687,0.9996569 +1765,7393116202138715,6874146713380997,4090183263858687,0.99958974 +1766,7393116202138426,6874146713380997,4090183263858687,0.99958974 +1767,7177611922878175,6874146713380997,4090183263858687,0.99967265 +1768,7393116202141105,6874146713380997,4090183263858687,0.9996295 +1769,7256776760140820,6874146713380997,4090183263858687,0.9996419 +1770,7274368946212576,6891738899432746,4090183263858687,0.9995192 +1771,7230388481069130,6891738899432746,4090183263858687,0.9996 +1772,7331543550908294,6891738899432746,4090183263858687,0.99938655 +1773,7410708388176235,6891738899432746,4090183263858687,0.9995351 +1774,7560241969711200,6891738899432746,4090183263858687,0.9991566 +1775,7265572853193105,6891738899432746,4090183263858687,0.9995503 +1776,7419504481209713,6891738899432746,4090183263858687,0.999671 +1777,7410708388188316,6891738899432746,4090183263858687,0.99946254 +1778,7375524016073999,6891738899432746,4090183263858687,0.99957234 +1779,7379922062581673,6891738899432746,4090183263858687,0.99965036 +1780,7265572853192648,6891738899432746,4090183263858687,0.99907935 +1781,7296359178804271,6891738899432746,4090183263858687,0.9991441 +1782,7529455644106227,6891738899432746,4090183263858687,0.9993531 +1783,7379922062581721,6891738899432746,4090183263858687,0.99965465 +1784,7217194341502040,6891738899432746,4090183263858687,0.999577 +1785,7410708388176232,6891738899432746,4090183263858687,0.9995499 +1786,7349135736986052,6891738899432746,4090183263858687,0.9995303 +1787,7230388481069844,6891738899432746,4090183263858687,0.9995459 +1788,7186408015909694,6891738899432746,4090183263858687,0.9991566 +1789,7357931830010812,6891738899432746,4090183263858687,0.9994789 +1790,7401912295165065,6891738899432746,4090183263858687,0.999627 +1791,7322747457869800,6891738899432746,4090183263858687,0.99921834 +1792,7503067365010513,6891738899432746,4090183263858687,0.9996395 +1793,7401912295164957,6891738899432746,4090183263858687,0.9996489 +1794,7529455644099354,6891738899432746,4090183263858687,0.9994184 +1795,7357931830012230,6891738899432746,4090183263858687,0.9995277 +1796,7296359178804228,6891738899432746,4090183263858687,0.9994281 +1797,7388718155600737,6891738899432746,4090183263858687,0.9996779 +1798,7520659551076212,6891738899432746,4090183263858687,0.9995803 +1799,7300757225298871,6891738899432746,4090183263858687,0.99927694 +1800,7366727923049263,6891738899432746,4090183263858687,0.99913955 +1801,7357931830010815,6891738899432746,4090183263858687,0.99957734 +1802,7186408015909735,6891738899432746,4090183263858687,0.99935323 +1803,7379922062581666,6891738899432746,4090183263858687,0.99965036 +1804,7190806062425796,6891738899432746,4090183263858687,0.99930394 +1805,7410708388176238,6891738899432746,4090183263858687,0.9994336 +1806,7547047830177189,6891738899432746,4090183263858687,0.99968565 +1807,7388718155627489,6891738899432746,4090183263858687,0.99914885 +1808,7529455644099336,6891738899432746,4090183263858687,0.99941754 +1809,7393116202126636,6891738899432746,4090183263858687,0.99948573 +1810,7529455644099537,6891738899432746,4090183263858687,0.99925894 +1811,7401912295156723,6891738899432746,4090183263858687,0.99953914 +1812,7296359178804217,6891738899432746,4090183263858687,0.9989262 +1813,7529455644099509,6891738899432746,4090183263858687,0.99941826 +1814,7538251737120485,6891738899432746,4090183263858687,0.9995803 +1815,7520659551068937,6891738899432746,4090183263858687,0.99970216 +1816,7415106434695571,6891738899432746,4090183263858687,0.9992879 +1817,7379922062581687,6891738899432746,4090183263858687,0.99964726 +1818,7573436109244031,6891738899432746,4090183263858687,0.99943215 +1819,7529455644099416,6891738899432746,4090183263858687,0.99925977 +1820,7243582620606737,6891738899432746,4090183263858687,0.9995246 +1821,7463484946386302,6891738899432746,4090183263858687,0.9991098 +1822,7547047830177197,6891738899432746,4090183263858687,0.99953914 +1823,7291961132265183,6891738899432746,4090183263858687,0.99964964 +1824,7454688853351525,6891738899432746,4090183263858687,0.9993481 +1825,7393116202141673,6891738899432746,4090183263858687,0.9987029 +1826,7274368946212505,6891738899432746,4090183263858687,0.99959856 +1827,7190806062434885,6891738899432746,4090183263858687,0.9995468 +1828,7278766992727972,6891738899432746,4090183263858687,0.999134 +1829,7560241969711196,6891738899432746,4090183263858687,0.9991565 +1830,7357931830014411,6891738899432746,4090183263858687,0.99958915 +1831,7366727923049267,6891738899432746,4090183263858687,0.9991394 +1832,7371125969542408,6891738899432746,4090183263858687,0.99913955 +1833,7406310341676768,6891738899432746,4090183263858687,0.9997056 +1834,7357931830012214,6891738899432746,4090183263858687,0.99955493 +1835,7357931830015305,6891738899432746,4090183263858687,0.99960405 +1836,7269970899703789,6891738899432746,4090183263858687,0.9991346 +1837,7379922062581627,6891738899432746,4090183263858687,0.99965453 +1838,7520659551074162,6891738899432746,4090183263858687,0.9986268 +1839,7256776760138014,6891738899432746,4090183263858687,0.999548 +1840,7357931830012226,6891738899432746,4090183263858687,0.9995364 +1841,7366727923050320,6891738899432746,4090183263858687,0.9995111 +1842,7401912295164950,6891738899432746,4090183263858687,0.998307 +1843,7393116202118718,6891738899432746,4090183263858687,0.9994873 +1844,7406310341674002,6891738899432746,4090183263858687,0.9990152 +1845,7379922062581578,6891738899432746,4090183263858687,0.9996474 +1846,7322747457869806,6891738899432746,4090183263858687,0.99941325 +1847,7393116202141545,6891738899432746,4090183263858687,0.998703 +1848,7463484946386308,6891738899432746,4090183263858687,0.9991098 +1849,7379922062581680,6891738899432746,4090183263858687,0.9996474 +1850,7533853690611374,6891738899432746,4090183263858687,0.9992599 +1851,7252378713632833,6891738899432746,4090183263858687,0.9995716 +1852,7269970899703779,6891738899432746,4090183263858687,0.99913424 +1853,7388718155620433,6891738899432746,4090183263858687,0.9995499 +1854,7296359178804238,6891738899432746,4090183263858687,0.9993325 +1855,7296359178804240,6891738899432746,4090183263858687,0.999366 +1856,7247980667108762,6891738899432746,4090183263858687,0.9995278 +1857,7186408015909729,6891738899432746,4090183263858687,0.9993536 +1858,7269970899703814,6891738899432746,4090183263858687,0.99928766 +1859,7538251737120490,6891738899432746,4090183263858687,0.99960035 +1860,7353533783504039,6891738899431237,4090183263858687,0.99592716 +1861,7349135736984747,6891738899431237,4090183263858687,0.9961641 +1862,7349135736985064,6891738899431237,4090183263858687,0.9961606 +1863,7327145504409084,6891738899431237,4090183263858687,0.9951794 +1864,7353533783504121,6891738899431237,4090183263858687,0.99592173 +1865,7428300574265504,6891738899432954,4090183263858687,0.9982457 +1866,7287563085745538,6891738899430886,4090183263858687,0.99099296 +1867,7247980667127301,6891738899432912,4090183263858693,0.8345376 +1868,7182009969406471,6891738899432912,4090183263858693,0.977576 +1869,7432698620769656,6891738899432912,4090183263858693,0.9953713 +1870,7313951364851558,6891738899432912,4090183263858693,0.9938093 +1871,7204000201982675,6891738899432912,4090183263858693,0.9867749 +1872,7459086899847349,6891738899432912,4090183263858693,0.97108704 +1873,7331543550908465,6891738899432912,4090183263858693,0.99464285 +1874,7388718155601222,6891738899432845,4090183263858693,0.9972173 +1875,7204000201969329,6891738899432845,4090183263858693,0.9969669 +1876,7340339643957338,6891738899425633,4090183263858693,0.970699 +1877,7489873225479660,6891738899425633,4090183263858693,0.9806851 +1878,7313951364851571,6891738899430554,4090183263858693,0.98779106 +1879,7401912295164698,6891738899431702,4090183263858707,0.9204756 +1880,7384320109103844,6891738899430457,4103377403391695,0.9361284 +1881,7393116202119647,6891738899430457,4103377403391695,0.9932615 +1882,7393116202139236,6896136945937747,4103377403391695,0.9835174 +1883,7371125969559339,6896136945937747,4103377403391695,0.928002 +1884,7234786527561046,6896136945937747,4103377403391695,0.99389535 +1885,7401912295171636,6896136945937747,4103377403391695,0.9687418 +1886,7393116202117447,6896136945937747,4103377403391695,0.9938725 +1887,7393116202141155,6896136945937747,4103377403391695,0.9954659 +1888,7401912295163117,6896136945937747,4103377403391695,0.99431616 +1889,7393116202138479,6896136945937747,4103377403391695,0.99521506 +1890,7353533783487926,6896136945937747,4103377403391695,0.9692336 +1891,7410708388184602,6896136945937747,4103377403391695,0.9811489 +1892,7362329876513626,6896136945937747,4103377403391695,0.99306595 +1893,7256776760158758,6891738899431240,4103377403391698,0.99848396 +1894,7195204108937241,6891738899431240,4103377403391698,0.9969261 +1895,7533853690611213,6891738899431240,4103377403391698,0.9972065 +1896,7564640016221342,6891738899431240,4103377403391698,0.99657685 +1897,7177611922879020,6891738899431240,4103377403391698,0.9883731 +1898,7388718155601342,6891738899431240,4103377403391698,0.99382496 +1899,7349135736986081,6891738899431240,4103377403391698,0.99350065 +1900,7349135736986043,6891738899431240,4103377403391698,0.99496704 +1901,7278766992742712,6891738899431240,4103377403391698,0.9952749 +1902,7401912295171626,6891738899431240,4103377403391698,0.9937495 +1903,7485475178942134,6891738899431240,4103377403391698,0.9888735 +1904,7379922062572310,6891738899431556,4103377403391713,0.9985934 +1905,7384320109097162,6891738899431556,4103377403391713,0.9991447 +1906,7459086899850304,6891738899431556,4103377403391713,0.9989427 +1907,7415106434695574,6891738899431556,4103377403391713,0.985247 +1908,7371125969555742,6891738899431556,4103377403391713,0.99904114 +1909,7388718155627429,6891738899431556,4103377403391713,0.9988117 +1910,7525057597591933,6891738899431556,4103377403391713,0.9985644 +1911,7432698620780942,6891738899431556,4103377403391713,0.9982784 +1912,7393116202138334,6891738899431556,4103377403391713,0.9993339 +1913,7463484946359912,6891738899431556,4103377403391713,0.99932015 +1914,7349135736984688,6882942806404166,4103377403391721,0.992357 +1915,7498669318483662,6891738899432009,4103377403391721,0.98970723 +1916,7573436109249661,6891738899432009,4103377403391721,0.99259067 +1917,7547047830177253,6891738899432009,4103377403391721,0.9817285 +1918,7274368946202172,6891738899432009,4103377403391721,0.9776159 +1919,7340339643939147,6891738899432009,4103377403391721,0.9870107 +1920,7173213876375159,6891738899432009,4103377403391721,0.9747575 +1921,7388718155600634,6891738899432009,4103377403391721,0.98759276 +1922,7278766992743798,6891738899432009,4103377403391721,0.9920797 +1923,7489873225461663,6891738899432009,4103377403391721,0.9917762 +1924,7278766992743795,6891738899432009,4103377403391721,0.99098927 +1925,7274368946202168,6891738899432009,4103377403391721,0.97718674 +1926,7173213876375162,6891738899432009,4103377403391721,0.97851884 +1927,7388718155600626,6891738899432009,4103377403391721,0.9896953 +1928,7472281039392040,6891738899432009,4103377403391721,0.99074835 +1929,7278766992743782,6891738899432009,4103377403391721,0.9892721 +1930,7498669318483656,6891738899432009,4103377403391721,0.99097997 +1931,7459086899855577,6891738899432009,4103377403391721,0.9696322 +1932,7406310341679861,6891738899432009,4103377403391721,0.9848573 +1933,7177611922888144,6891738899432009,4103377403391721,0.9933302 +1934,7547047830177285,6891738899432009,4103377403391721,0.9871422 +1935,7327145504412185,6891738899432009,4103377403391721,0.98875904 +1936,7190806062434116,6891738899432009,4103377403391721,0.9847882 +1937,7173213876375166,6891738899432009,4103377403391721,0.9797894 +1941,7459086899850741,6891738899431434,4103377403391721,0.84888613 +1943,7353533783475417,6891738899431434,4103377403391721,0.93801177 +1945,7261174806657262,6891738899431434,4103377403391721,0.90367794 +1946,7529455644109708,6891738899431434,4103377403391721,0.97575706 +1947,7327145504406420,6891738899431434,4103377403391721,0.92068434 +1948,7516261504563588,6891738899431434,4103377403391721,0.94282013 +1949,7182009969406484,6891738899431434,4103377403391721,0.9539472 +1950,7459086899850329,6891738899431434,4103377403391721,0.96451366 +1951,7467882992876074,6891738899431434,4103377403391721,0.9197058 +1952,7353533783497438,6874146713382797,4103377403391721,0.9767045 +1953,7349135736989809,6874146713382797,4103377403391721,0.94378865 +1954,7278766992739145,6874146713382797,4103377403391721,0.98152566 +1955,7503067365011927,6874146713382797,4103377403391721,0.9920859 +1963,7410708388194278,6891738899430710,4103377403391721,0.9958631 +1964,7419504481214899,6891738899430710,4103377403391721,0.99688196 +1965,7406310341674121,6891738899430710,4103377403391721,0.9969168 +1967,7212796294985040,6891738899432942,4103377403391721,0.96538657 +1968,7252378713625140,6891738899432942,4103377403391721,0.9713936 +1969,7243582620598790,6891738899432942,4103377403391721,0.97678137 +1970,7252378713625135,6891738899432942,4103377403391721,0.9713936 +1971,7459086899850651,6891738899432942,4103377403391721,0.98398376 +1972,7252378713625133,6891738899432942,4103377403391721,0.9713936 +1973,7243582620598785,6891738899432942,4103377403391721,0.97678137 +1974,7397514248650015,6891738899431521,4103377403391721,0.9828152 +1975,7406310341674021,6891738899431521,4103377403391721,0.95071226 +1976,7415106434695403,6891738899431521,4103377403391721,0.9464041 +1977,7410708388194178,6891738899431521,4103377403391721,0.9330464 +1978,7204000201982723,6891738899431918,4103377403391721,0.9975229 +1979,7432698620769986,6891738899431918,4103377403391721,0.99603844 +1980,7432698620780895,6891738899431918,4103377403391721,0.988628 +1981,7168815829843996,6891738899431918,4103377403391721,0.9703864 +1983,7507465411521477,6874146713382780,4103377403391721,0.8305039 +1988,7401912295164847,6891738899430480,4103377403391721,0.9907855 +1989,7212796294985033,6891738899430480,4103377403391721,0.9920316 +1990,7401912295164805,6891738899430480,4103377403391721,0.97734135 +1991,7274368946207470,6891738899430480,4103377403391721,0.9917998 +1992,7212796294985036,6891738899430480,4103377403391721,0.9920089 +1993,7467882992890546,6891738899430480,4103377403391721,0.8673959 +1994,7375524016070834,6891738899430480,4103377403391721,0.9934695 +1996,7375524016071007,6874146713382686,4103377403391721,0.91406566 +1998,7388718155625393,6891738899433152,4103377403391721,0.9991648 +1999,7190806062427949,6891738899433152,4103377403391721,0.9996377 +2005,7498669318503793,6874146713382674,4103377403391722,0.8273905 +2006,7177611922878848,6874146713382674,4103377403391722,0.84956753 +2007,7463484946386169,6874146713382674,4103377403391722,0.84956753 +2008,7375524016055537,6891738899431554,4103377403391725,0.99778146 +2009,7283165039231471,6891738899432875,4103377403391728,0.8092789 +2012,7182009969405589,6891738899431685,4103377403391728,0.9498883 +2013,7274368946200947,6891738899431685,4103377403391728,0.99981004 +2014,7569038062740859,6882942806404175,4103377403391733,0.93068075 +2015,7274368946212661,6882942806404175,4103377403391733,0.88709515 +2016,7243582620606627,6882942806404175,4103377403391733,0.88734275 diff --git a/data/solr/data/log4j2.xml b/data/solr/data/log4j2.xml old mode 100644 new mode 100755 diff --git a/data/solr/log4j2.xml b/data/solr/log4j2.xml old mode 100644 new mode 100755 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 0c8a7d74..ec03fb4d 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,31 +1,31 @@ -version: '3' +version: '3.8' services: - nginx-proxy: - restart: "always" - ports: - - "80:80" - - "443:443" - labels: - - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true - volumes: - # - ./data/var/run/docker.sock:/tmp/docker.sock:ro - - ./data/opt/integreat/dev/usr/share/nginx/html:/usr/share/nginx/html - database: - restart: "always" - ports: - - "5432:5432" - datomic-transactor: - restart: "always" - environment: - - DATOMIC_PORT=4334 - - XMS=-Xms3g - - XMX=-Xmx6g - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 4334:4334 +# nginx-proxy: +# restart: "always" +# ports: +# - "80:80" +# - "443:443" +# labels: +# - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true +# volumes: +# # - ./data/var/run/docker.sock:/tmp/docker.sock:ro +# - ./data/opt/integreat/dev/usr/share/nginx/html:/usr/share/nginx/html +# database: +# restart: "always" +# ports: +# - "5432:5432" +# datomic-transactor: +# restart: "always" +# environment: +# - DATOMIC_PORT=4334 +# - XMS=-Xms3g +# - XMX=-Xmx6g +# ulimits: +# nofile: +# soft: 65536 +# hard: 65536 +# ports: +# - 4334:4334 solr: volumes: - ./data/solr:/var/solr diff --git a/docker-compose.yml b/docker-compose.yml index 4bac2800..d8413888 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,55 +1,70 @@ -version: '3' +version: '3.8' services: - nginx-proxy: - image: jwilder/nginx-proxy:alpine - labels: - - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true - volumes: - - /var/run/docker.sock:/tmp/docker.sock:ro - - ./data/certs/:/etc/nginx/certs:ro - - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d - - ./data/usr/share/nginx/html:/usr/share/nginx/html - - ./data/etc/nginx/conf.d:/etc/nginx/conf.d - letsencrypt: - image: jrcs/letsencrypt-nginx-proxy-companion:stable - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ./data/certs/:/etc/nginx/certs - - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d - - ./data/usr/share/nginx/html:/usr/share/nginx/html - app: - build: . - expose: - - 3000 - depends_on: - - database - - datomic-transactor - environment: - config: /usr/local/config/local.edn - VIRTUAL_HOST: local.app.integreatconsult.com - VIRTUAL_PORT: 3000 - database: - image: postgres:9-alpine - environment: - POSTGRES_USER: ap - POSTGRES_PASSWORD: fifteen-invoices-imported! - POSTGRES_DB: autoap - volumes: - - ./data/var/lib/postgresql/data:/var/lib/postgresql/data + # nginx-proxy: + # image: jwilder/nginx-proxy:alpine + # labels: + # - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true + # volumes: + # - /var/run/docker.sock:/tmp/docker.sock:ro + # - ./data/certs/:/etc/nginx/certs:ro + # - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d + # - ./data/usr/share/nginx/html:/usr/share/nginx/html + # - ./data/etc/nginx/conf.d:/etc/nginx/conf.d + # letsencrypt: + # image: jrcs/letsencrypt-nginx-proxy-companion:stable + # volumes: + # - /var/run/docker.sock:/var/run/docker.sock:ro + # - ./data/certs/:/etc/nginx/certs + # - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d + # - ./data/usr/share/nginx/html:/usr/share/nginx/html + # app: + # build: . + # expose: + # - 3000 + # depends_on: + # - database + # - datomic-transactor + # environment: + # config: /usr/local/config/local.edn + # VIRTUAL_HOST: local.app.integreatconsult.com + # VIRTUAL_PORT: 3000 + # database: + # image: postgres:9-alpine + # environment: + # POSTGRES_USER: ap + # POSTGRES_PASSWORD: fifteen-invoices-imported! + # POSTGRES_DB: autoap + # volumes: + # - ./data/var/lib/postgresql/data:/var/lib/postgresql/data solr: image: solr + user: solr + # network_mode: bridge ports: - - "8983:8983" - datomic-transactor: - depends_on: - - database - image: 679918342773.dkr.ecr.us-east-1.amazonaws.com/datomic:latest - environment: - - DATOMIC_HOST=datomic-transactor - - DATOMIC_PORT=4334 - - DATOMIC_SQL_HOST=database - ports: - - 4334:4334 - restart: on-failure - - + - 8983:8983 + ulimits: + nofile: + soft: "65536" + hard: "65536" + # datomic-transactor: + # depends_on: + # - database + # image: 679918342773.dkr.ecr.us-east-1.amazonaws.com/datomic:latest + # environment: + # - DATOMIC_HOST=datomic-transactor + # - DATOMIC_PORT=4334 + # - DATOMIC_SQL_HOST=database + # ports: + # - 4334:4334 + # restart: on-failure +networks: + default: + driver: bridge + attachable: false + driver_opts: + com.docker.network.bridge.default_bridge: "true" + com.docker.network.bridge.enable_icc: "true" + com.docker.network.bridge.enable_ip_masquerade: "true" + com.docker.network.bridge.host_binding_ipv4: "0.0.0.0" + com.docker.network.bridge.name: "docker0" + com.docker.network.driver.mtu: "1500" diff --git a/notes.txt b/notes.txt index 9604ab2b..af5c7d31 100644 --- a/notes.txt +++ b/notes.txt @@ -1,25 +1 @@ -1) Aligning checks -2) popup blocker -- disable X -3) Splitting accounts -4) Permissions per location -5) List of payments -6) add payment -7) add invoice - X - - - --- -Rules priority: -Match check -Match debit -Match rule (assign vendor and account) - + Memo - + Wild card matches - + Match memo and amount - + Match for specificclient - + Match for specifo - -Transfers -Splits - - +4. Maybe make dark mode persist diff --git a/package-lock.json b/package-lock.json index 4db21d7e..f0367b9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@popperjs/core": "^2.11.5", "downshift": "^6.1.3", "dropzone": "^4.3.0", + "flowbite": "^1.6.5", "minisearch": "^3.0.2", "prop-types": "^15.7.2", "react": "^17.0.1", @@ -19,16 +20,29 @@ "react-plaid-link": "^3.3.2", "react-popper": "^2.3.0", "react-prop-types": "^0.4.0", - "react-signature-canvas": "^1.0.3", - "react-signature-pad": "0.0.6", + "react-signature-canvas": "^1.0.6", "react-transition-group": "^4.4.2", - "recharts": "^1.4.2" + "recharts": "^2.5.0" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.3", "webpack": "^5.75.0", "webpack-cli": "^5.0.1" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/runtime": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", @@ -104,6 +118,44 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", @@ -113,6 +165,72 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, "node_modules/@types/eslint": { "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", @@ -399,10 +517,74 @@ "ajv": "^6.9.1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "peer": true + }, "node_modules/balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "peer": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "peer": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/browserslist": { "version": "4.16.0", @@ -433,12 +615,63 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001170", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", "dev": true }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", @@ -487,12 +720,12 @@ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -508,76 +741,137 @@ "node": ">= 8" } }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "peer": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } }, "node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "d3-color": "1" + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dependencies": { - "d3-path": "1" + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } }, "node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "d3-time": "1" + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" } }, "node_modules/decimal.js-light": { @@ -585,6 +879,20 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "peer": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "peer": true + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -707,6 +1015,11 @@ "node": ">=4.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -722,6 +1035,44 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -737,12 +1088,100 @@ "node": ">= 4.9.1" } }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flowbite": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.6.5.tgz", + "integrity": "sha512-eI4h3pIRI9d7grlYq14r0A01KUtw7189sPLLx/O2i7JyPEWpbleScfYuEc48XTeNjk1xxm/JHgZkD9kjyOWAlA==", + "dependencies": { + "@popperjs/core": "^2.9.3", + "mini-svg-data-uri": "^1.4.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -856,6 +1295,32 @@ "node": ">=8" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "peer": true + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -865,6 +1330,19 @@ "node": ">=10.13.0" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -877,6 +1355,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "peer": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -918,6 +1429,16 @@ "node": ">= 10.13.0" } }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -944,6 +1465,23 @@ "node": ">=0.10.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "peer": true + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -954,19 +1492,9 @@ } }, "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -979,17 +1507,36 @@ "loose-envify": "cli.js" } }, - "node_modules/math-expression-evaluator": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.7.tgz", - "integrity": "sha512-nrbaifCl42w37hYd6oRLvoymFK42tWB+WQTMFtksDGQMi5GvlJwnz/CsS30FFAISFLtX+A0csJ0xLiuuyyec7w==" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "peer": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", @@ -1011,11 +1558,63 @@ "node": ">= 0.6" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minisearch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-3.0.2.tgz", "integrity": "sha512-7rTrJEzovKNi5LSwiIr5aCfJNNo6Lk4O9HTVzjFTMdp+dSr6UisUnEqdwj4rBgNcAcaWW5ClpXnpgTurv8PGqA==" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -1028,6 +1627,16 @@ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1036,6 +1645,26 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -1054,6 +1683,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1069,10 +1708,188 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "peer": true + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "peer": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "peer": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, "node_modules/prop-types": { "version": "15.7.2", @@ -1093,13 +1910,26 @@ "node": ">=6" } }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true }, "node_modules/randombytes": { "version": "2.1.0", @@ -1197,17 +2027,15 @@ } }, "node_modules/react-resize-detector": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz", - "integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", + "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", "dependencies": { - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.6.0", - "resize-observer-polyfill": "^1.5.0" + "lodash": "^4.17.21" }, "peerDependencies": { - "react": "^0.14.7 || ^15.0.0 || ^16.0.0" + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-script-hook": { @@ -1220,41 +2048,31 @@ } }, "node_modules/react-signature-canvas": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.3.tgz", - "integrity": "sha512-6KBZFWLgjbnV80hh0sYW4ZKLJkojktP+de+xrnBGjB6HBK2dOoYH3rVxjtCvpMhjM/e4cqgAoQVz3lYdKCgWxw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz", + "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==", "dependencies": { "signature_pad": "^2.3.2", "trim-canvas": "^0.1.0" }, "peerDependencies": { "prop-types": "^15.5.8", - "react": "0.14 - 16", - "react-dom": "0.14 - 16" - } - }, - "node_modules/react-signature-pad": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/react-signature-pad/-/react-signature-pad-0.0.6.tgz", - "integrity": "sha1-M1VHwfUjo2uDluU2Xi9JUh5Wuc8=", - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0", - "react-dom": "^0.14.0 || ^15.0.0" + "react": "0.14 - 18", + "react-dom": "0.14 - 18" } }, "node_modules/react-smooth": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz", - "integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz", + "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==", "dependencies": { - "lodash": "~4.17.4", - "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-transition-group": "^2.5.0" + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0", - "react-dom": "^15.0.0 || ^16.0.0" + "prop-types": "^15.6.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-smooth/node_modules/dom-helpers": { @@ -1295,32 +2113,57 @@ "react-dom": ">=16.6.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "peer": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/recharts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-1.8.5.tgz", - "integrity": "sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.6.2.tgz", + "integrity": "sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig==", "dependencies": { "classnames": "^2.2.5", - "core-js": "^2.6.10", - "d3-interpolate": "^1.3.0", - "d3-scale": "^2.1.0", - "d3-shape": "^1.2.0", - "lodash": "^4.17.5", - "prop-types": "^15.6.0", - "react-resize-detector": "^2.3.0", - "react-smooth": "^1.0.5", - "recharts-scale": "^0.4.2", - "reduce-css-calc": "^1.3.0" + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-resize-detector": "^8.0.4", + "react-smooth": "^2.0.2", + "recharts-scale": "^0.4.4", + "reduce-css-calc": "^2.1.8", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=12" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0", - "react-dom": "^15.0.0 || ^16.0.0" + "prop-types": "^15.6.0", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/recharts-scale": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz", - "integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", "dependencies": { "decimal.js-light": "^2.4.1" } @@ -1338,45 +2181,26 @@ } }, "node_modules/reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", "dependencies": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" } }, - "node_modules/reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/reduce-function-call/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, "node_modules/regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -1408,6 +2232,41 @@ "node": ">=8" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1511,6 +2370,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -1521,6 +2390,39 @@ "source-map": "^0.6.0" } }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -1548,6 +2450,52 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dev": true, + "peer": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "peer": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -1609,11 +2557,54 @@ } } }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/trim-canvas": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", "integrity": "sha1-YgRX9f7PVktSHTXF/NTaWDBNbkU=" }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "peer": true + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -1629,6 +2620,34 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "peer": true + }, + "node_modules/victory-vendor": { + "version": "36.6.10", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.10.tgz", + "integrity": "sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", @@ -1799,9 +2818,33 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "peer": true + }, + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 14" + } } }, "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "peer": true + }, "@babel/runtime": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", @@ -1865,11 +2908,103 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "peer": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "peer": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "peer": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, + "@tailwindcss/forms": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "dev": true, + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, + "@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + }, + "@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, "@types/eslint": { "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", @@ -2119,10 +3254,65 @@ "dev": true, "requires": {} }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "peer": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "peer": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "peer": true + }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "peer": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "peer": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "peer": true, + "requires": { + "fill-range": "^7.0.1" + } }, "browserslist": { "version": "4.16.0", @@ -2143,12 +3333,48 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "peer": true + }, "caniuse-lite": { "version": "1.0.30001170", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", "dev": true }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "peer": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "chrome-trace-event": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", @@ -2191,10 +3417,12 @@ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "peer": true }, "cross-spawn": { "version": "7.0.3", @@ -2207,83 +3435,119 @@ "which": "^2.0.1" } }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "peer": true + }, "csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", + "requires": { + "internmap": "1 - 2" + } }, "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "requires": { - "d3-color": "1" + "d3-color": "1 - 3" } }, "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" }, "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } }, "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "requires": { - "d3-path": "1" + "d3-path": "^3.1.0" } }, "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "requires": { + "d3-array": "2 - 3" + } }, "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "requires": { - "d3-time": "1" + "d3-time": "1 - 3" } }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, "decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "peer": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "peer": true + }, "dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -2383,6 +3647,11 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -2395,6 +3664,37 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "peer": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2407,12 +3707,81 @@ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "peer": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "peer": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flowbite": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.6.5.tgz", + "integrity": "sha512-eI4h3pIRI9d7grlYq14r0A01KUtw7189sPLLx/O2i7JyPEWpbleScfYuEc48XTeNjk1xxm/JHgZkD9kjyOWAlA==", + "requires": { + "@popperjs/core": "^2.9.3", + "mini-svg-data-uri": "^1.4.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "peer": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "peer": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -2498,12 +3867,45 @@ } } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "peer": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "peer": true + }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "peer": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -2513,6 +3915,30 @@ "has": "^1.0.3" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "peer": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "peer": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "peer": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2545,6 +3971,13 @@ "supports-color": "^8.0.0" } }, + "jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "peer": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2568,6 +4001,20 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "peer": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "peer": true + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2575,19 +4022,9 @@ "dev": true }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "loose-envify": { "version": "1.4.0", @@ -2597,17 +4034,30 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "math-expression-evaluator": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.7.tgz", - "integrity": "sha512-nrbaifCl42w37hYd6oRLvoymFK42tWB+WQTMFtksDGQMi5GvlJwnz/CsS30FFAISFLtX+A0csJ0xLiuuyyec7w==" - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "peer": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", @@ -2623,11 +4073,45 @@ "mime-db": "1.44.0" } }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minisearch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-3.0.2.tgz", "integrity": "sha512-7rTrJEzovKNi5LSwiIr5aCfJNNo6Lk4O9HTVzjFTMdp+dSr6UisUnEqdwj4rBgNcAcaWW5ClpXnpgTurv8PGqA==" }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "peer": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "peer": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -2640,11 +4124,35 @@ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "peer": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "peer": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "peer": true, + "requires": { + "wrappy": "1" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -2657,6 +4165,13 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "peer": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2669,10 +4184,113 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "peer": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "peer": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "peer": true + }, + "postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "peer": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "peer": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "peer": true + } + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "peer": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "peer": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "peer": true, + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "peer": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, "prop-types": { "version": "15.7.2", @@ -2690,13 +4308,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "peer": true }, "randombytes": { "version": "2.1.0", @@ -2778,14 +4395,11 @@ } }, "react-resize-detector": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz", - "integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", + "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", "requires": { - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.6.0", - "resize-observer-polyfill": "^1.5.0" + "lodash": "^4.17.21" } }, "react-script-hook": { @@ -2795,29 +4409,21 @@ "requires": {} }, "react-signature-canvas": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.3.tgz", - "integrity": "sha512-6KBZFWLgjbnV80hh0sYW4ZKLJkojktP+de+xrnBGjB6HBK2dOoYH3rVxjtCvpMhjM/e4cqgAoQVz3lYdKCgWxw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz", + "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==", "requires": { "signature_pad": "^2.3.2", "trim-canvas": "^0.1.0" } }, - "react-signature-pad": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/react-signature-pad/-/react-signature-pad-0.0.6.tgz", - "integrity": "sha1-M1VHwfUjo2uDluU2Xi9JUh5Wuc8=", - "requires": {} - }, "react-smooth": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz", - "integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz", + "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==", "requires": { - "lodash": "~4.17.4", - "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-transition-group": "^2.5.0" + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" }, "dependencies": { "dom-helpers": { @@ -2852,28 +4458,46 @@ "prop-types": "^15.6.2" } }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "peer": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "peer": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "recharts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-1.8.5.tgz", - "integrity": "sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.6.2.tgz", + "integrity": "sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig==", "requires": { "classnames": "^2.2.5", - "core-js": "^2.6.10", - "d3-interpolate": "^1.3.0", - "d3-scale": "^2.1.0", - "d3-shape": "^1.2.0", - "lodash": "^4.17.5", - "prop-types": "^15.6.0", - "react-resize-detector": "^2.3.0", - "react-smooth": "^1.0.5", - "recharts-scale": "^0.4.2", - "reduce-css-calc": "^1.3.0" + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-resize-detector": "^8.0.4", + "react-smooth": "^2.0.2", + "recharts-scale": "^0.4.4", + "reduce-css-calc": "^2.1.8", + "victory-vendor": "^36.6.8" } }, "recharts-scale": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz", - "integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", "requires": { "decimal.js-light": "^2.4.1" } @@ -2888,28 +4512,12 @@ } }, "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - } - }, - "reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", - "requires": { - "balanced-match": "^1.0.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - } + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" } }, "regenerator-runtime": { @@ -2917,18 +4525,13 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -2948,6 +4551,23 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "peer": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "peer": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3018,6 +4638,13 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "peer": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -3028,6 +4655,31 @@ "source-map": "^0.6.0" } }, + "sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "peer": true + } + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3043,6 +4695,47 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dev": true, + "peer": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "peer": true + } + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -3074,11 +4767,48 @@ "terser": "^5.14.1" } }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "peer": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "peer": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "peer": true, + "requires": { + "is-number": "^7.0.0" + } + }, "trim-canvas": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", "integrity": "sha1-YgRX9f7PVktSHTXF/NTaWDBNbkU=" }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "peer": true + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -3094,6 +4824,34 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "peer": true + }, + "victory-vendor": { + "version": "36.6.10", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.10.tgz", + "integrity": "sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==", + "requires": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", @@ -3209,6 +4967,20 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "peer": true + }, + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "peer": true } } } diff --git a/package.json b/package.json index 5b8cd708..8c4c0249 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@popperjs/core": "^2.11.5", "downshift": "^6.1.3", "dropzone": "^4.3.0", + "flowbite": "^1.6.5", "minisearch": "^3.0.2", "prop-types": "^15.7.2", "react": "^17.0.1", @@ -17,12 +18,12 @@ "react-plaid-link": "^3.3.2", "react-popper": "^2.3.0", "react-prop-types": "^0.4.0", - "react-signature-canvas": "^1.0.3", - "react-signature-pad": "0.0.6", + "react-signature-canvas": "^1.0.6", "react-transition-group": "^4.4.2", - "recharts": "^1.4.2" + "recharts": "^2.5.0" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.3", "webpack": "^5.75.0", "webpack-cli": "^5.0.1" }, diff --git a/project.clj b/project.clj index 39dbe9cb..a2926425 100644 --- a/project.clj +++ b/project.clj @@ -145,7 +145,6 @@ [javax.servlet/servlet-api "2.5"]] :plugins [[lein-pdo "0.1.1"]] :jvm-opts ["-Dconfig=config/dev.edn" "-Dlogback.configurationFile=logback.xml" "-Xms4G" "-Xmx20G" ]} - :uberjar {:java-cmd "/usr/lib/jvm/java-11-openjdk/bin/java" diff --git a/resources/input.css b/resources/input.css new file mode 100644 index 00000000..8653d69d --- /dev/null +++ b/resources/input.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.htmx-added .fade-in { + opacity: 0.0 !important; +} + +.htmx-added.fade-in { + opacity: 0.0 !important; +} +.fade-in { + opacity: 1.0; +} + +.htmx-added .slide-up { + @apply translate-y-5 !important; +} +.hidden .slide-up { + @apply translate-y-5 !important; +} +.slide-up { + @apply translate-y-0; +} + +.live-added { + animation: pulse-green 300ms 2; + animation-direction: alternate; + animation-timing-function: ease-in-out; +} + +.dark .live-added { + animation: pulse-dark-green 300ms 2 !important; + animation-direction: alternate; + animation-timing-function: ease-in-out; +} +/* +.live-added { + @apply bg-white; +} +*/ + +@keyframes pulse-green { + 0% { @apply bg-white; } + 100% { @apply bg-green-300 dark:bg-red-700;} +} + +@keyframes pulse-dark-green { + 0% { @apply dark:bg-gray-700; } + 100% { @apply bg-green-700;} +} + + +.htmx-request .htmx-indicator, .htmx-request.htmx-indicator { + display: inherit !important; +} +.htmx-indicator { + display: none; +} + +.htmx-request .htmx-indicator-hidden { + display: none !important; +} + +.htmx-indicator-hidden { + display: inherit; +} + +.htmx-swapping .fade-out { + opacity: 0.0 !important; +} +.fade-out { + opacity: 1.0; +} + +.min-h-content { + min-height: calc(100vh - 4em); +} diff --git a/resources/public/favicon.png b/resources/public/favicon.png new file mode 100644 index 00000000..ebd29da8 Binary files /dev/null and b/resources/public/favicon.png differ diff --git a/resources/public/img/accounting-invoice-mail.svg b/resources/public/img/accounting-invoice-mail.svg new file mode 100644 index 00000000..dd87da97 --- /dev/null +++ b/resources/public/img/accounting-invoice-mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/public/img/cas b/resources/public/img/cas new file mode 100644 index 00000000..310d5c04 --- /dev/null +++ b/resources/public/img/cas @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/public/img/cash-payment-sign-2.svg b/resources/public/img/cash-payment-sign-2.svg new file mode 100644 index 00000000..310d5c04 --- /dev/null +++ b/resources/public/img/cash-payment-sign-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/public/img/loading-circle.svg b/resources/public/img/loading-circle.svg new file mode 100755 index 00000000..ec87a9bb --- /dev/null +++ b/resources/public/img/loading-circle.svg @@ -0,0 +1 @@ +loading-circle diff --git a/resources/public/img/logo-big2.png b/resources/public/img/logo-big2.png new file mode 100644 index 00000000..8f1aa592 Binary files /dev/null and b/resources/public/img/logo-big2.png differ diff --git a/resources/public/js/flowbite.min.js b/resources/public/js/flowbite.min.js new file mode 100644 index 00000000..1151790d --- /dev/null +++ b/resources/public/js/flowbite.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Flowbite",[],e):"object"==typeof exports?exports.Flowbite=e():t.Flowbite=e()}(self,(function(){return function(){"use strict";var t={647:function(t,e,i){i.r(e)},853:function(t,e,i){i.r(e),i.d(e,{afterMain:function(){return E},afterRead:function(){return _},afterWrite:function(){return x},applyStyles:function(){return S},arrow:function(){return Z},auto:function(){return a},basePlacements:function(){return c},beforeMain:function(){return b},beforeRead:function(){return m},beforeWrite:function(){return L},bottom:function(){return o},clippingParents:function(){return u},computeStyles:function(){return it},createPopper:function(){return St},createPopperBase:function(){return Ct},createPopperLite:function(){return It},detectOverflow:function(){return yt},end:function(){return d},eventListeners:function(){return ot},flip:function(){return _t},hide:function(){return Et},left:function(){return s},main:function(){return w},modifierPhases:function(){return k},offset:function(){return Lt},placements:function(){return v},popper:function(){return f},popperGenerator:function(){return Pt},popperOffsets:function(){return Ot},preventOverflow:function(){return xt},read:function(){return y},reference:function(){return h},right:function(){return r},start:function(){return l},top:function(){return n},variationPlacements:function(){return g},viewport:function(){return p},write:function(){return O}});var n="top",o="bottom",r="right",s="left",a="auto",c=[n,o,r,s],l="start",d="end",u="clippingParents",p="viewport",f="popper",h="reference",g=c.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+d])}),[]),v=[].concat(c,[a]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+d])}),[]),m="beforeRead",y="read",_="afterRead",b="beforeMain",w="main",E="afterMain",L="beforeWrite",O="write",x="afterWrite",k=[m,y,_,b,w,E,L,O,x];function A(t){return t?(t.nodeName||"").toLowerCase():null}function T(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function j(t){return t instanceof T(t).Element||t instanceof Element}function P(t){return t instanceof T(t).HTMLElement||t instanceof HTMLElement}function C(t){return"undefined"!=typeof ShadowRoot&&(t instanceof T(t).ShadowRoot||t instanceof ShadowRoot)}var S={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},o=e.elements[t];P(o)&&A(o)&&(Object.assign(o.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?o.removeAttribute(t):o.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],o=e.attributes[t]||{},r=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});P(n)&&A(n)&&(Object.assign(n.style,r),Object.keys(o).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var D=Math.max,M=Math.min,q=Math.round;function H(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function B(){return!/^((?!chrome|android).)*safari/i.test(H())}function V(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),o=1,r=1;e&&P(t)&&(o=t.offsetWidth>0&&q(n.width)/t.offsetWidth||1,r=t.offsetHeight>0&&q(n.height)/t.offsetHeight||1);var s=(j(t)?T(t):window).visualViewport,a=!B()&&i,c=(n.left+(a&&s?s.offsetLeft:0))/o,l=(n.top+(a&&s?s.offsetTop:0))/r,d=n.width/o,u=n.height/r;return{width:d,height:u,top:l,right:c+d,bottom:l+u,left:c,x:c,y:l}}function W(t){var e=V(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function z(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&C(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function R(t){return T(t).getComputedStyle(t)}function F(t){return["table","td","th"].indexOf(A(t))>=0}function N(t){return((j(t)?t.ownerDocument:t.document)||window.document).documentElement}function K(t){return"html"===A(t)?t:t.assignedSlot||t.parentNode||(C(t)?t.host:null)||N(t)}function U(t){return P(t)&&"fixed"!==R(t).position?t.offsetParent:null}function X(t){for(var e=T(t),i=U(t);i&&F(i)&&"static"===R(i).position;)i=U(i);return i&&("html"===A(i)||"body"===A(i)&&"static"===R(i).position)?e:i||function(t){var e=/firefox/i.test(H());if(/Trident/i.test(H())&&P(t)&&"fixed"===R(t).position)return null;var i=K(t);for(C(i)&&(i=i.host);P(i)&&["html","body"].indexOf(A(i))<0;){var n=R(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Y(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function G(t,e,i){return D(t,M(e,i))}function J(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Q(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Z={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,l=t.options,d=i.elements.arrow,u=i.modifiersData.popperOffsets,p=I(i.placement),f=Y(p),h=[s,r].indexOf(p)>=0?"height":"width";if(d&&u){var g=function(t,e){return J("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Q(t,c))}(l.padding,i),v=W(d),m="y"===f?n:s,y="y"===f?o:r,_=i.rects.reference[h]+i.rects.reference[f]-u[f]-i.rects.popper[h],b=u[f]-i.rects.reference[f],w=X(d),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,L=_/2-b/2,O=g[m],x=E-v[h]-g[y],k=E/2-v[h]/2+L,A=G(O,k,x),T=f;i.modifiersData[a]=((e={})[T]=A,e.centerOffset=A-k,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&z(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function $(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,c=t.placement,l=t.variation,u=t.offsets,p=t.position,f=t.gpuAcceleration,h=t.adaptive,g=t.roundOffsets,v=t.isFixed,m=u.x,y=void 0===m?0:m,_=u.y,b=void 0===_?0:_,w="function"==typeof g?g({x:y,y:b}):{x:y,y:b};y=w.x,b=w.y;var E=u.hasOwnProperty("x"),L=u.hasOwnProperty("y"),O=s,x=n,k=window;if(h){var A=X(i),j="clientHeight",P="clientWidth";if(A===T(i)&&"static"!==R(A=N(i)).position&&"absolute"===p&&(j="scrollHeight",P="scrollWidth"),c===n||(c===s||c===r)&&l===d)x=o,b-=(v&&A===k&&k.visualViewport?k.visualViewport.height:A[j])-a.height,b*=f?1:-1;if(c===s||(c===n||c===o)&&l===d)O=r,y-=(v&&A===k&&k.visualViewport?k.visualViewport.width:A[P])-a.width,y*=f?1:-1}var C,S=Object.assign({position:p},h&&tt),I=!0===g?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:q(e*n)/n||0,y:q(i*n)/n||0}}({x:y,y:b}):{x:y,y:b};return y=I.x,b=I.y,f?Object.assign({},S,((C={})[x]=L?"0":"",C[O]=E?"0":"",C.transform=(k.devicePixelRatio||1)<=1?"translate("+y+"px, "+b+"px)":"translate3d("+y+"px, "+b+"px, 0)",C)):Object.assign({},S,((e={})[x]=L?b+"px":"",e[O]=E?y+"px":"",e.transform="",e))}var it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,o=void 0===n||n,r=i.adaptive,s=void 0===r||r,a=i.roundOffsets,c=void 0===a||a,l={placement:I(e.placement),variation:$(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},l,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:c})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},l,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},nt={passive:!0};var ot={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,o=n.scroll,r=void 0===o||o,s=n.resize,a=void 0===s||s,c=T(e.elements.popper),l=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&l.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&c.addEventListener("resize",i.update,nt),function(){r&&l.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&c.removeEventListener("resize",i.update,nt)}},data:{}},rt={left:"right",right:"left",bottom:"top",top:"bottom"};function st(t){return t.replace(/left|right|bottom|top/g,(function(t){return rt[t]}))}var at={start:"end",end:"start"};function ct(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function lt(t){var e=T(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function dt(t){return V(N(t)).left+lt(t).scrollLeft}function ut(t){var e=R(t),i=e.overflow,n=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+o+n)}function pt(t){return["html","body","#document"].indexOf(A(t))>=0?t.ownerDocument.body:P(t)&&ut(t)?t:pt(K(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=pt(t),o=n===(null==(i=t.ownerDocument)?void 0:i.body),r=T(n),s=o?[r].concat(r.visualViewport||[],ut(n)?n:[]):n,a=e.concat(s);return o?a:a.concat(ft(K(s)))}function ht(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function gt(t,e,i){return e===p?ht(function(t,e){var i=T(t),n=N(t),o=i.visualViewport,r=n.clientWidth,s=n.clientHeight,a=0,c=0;if(o){r=o.width,s=o.height;var l=B();(l||!l&&"fixed"===e)&&(a=o.offsetLeft,c=o.offsetTop)}return{width:r,height:s,x:a+dt(t),y:c}}(t,i)):j(e)?function(t,e){var i=V(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ht(function(t){var e,i=N(t),n=lt(t),o=null==(e=t.ownerDocument)?void 0:e.body,r=D(i.scrollWidth,i.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=D(i.scrollHeight,i.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-n.scrollLeft+dt(t),c=-n.scrollTop;return"rtl"===R(o||i).direction&&(a+=D(i.clientWidth,o?o.clientWidth:0)-r),{width:r,height:s,x:a,y:c}}(N(t)))}function vt(t,e,i,n){var o="clippingParents"===e?function(t){var e=ft(K(t)),i=["absolute","fixed"].indexOf(R(t).position)>=0&&P(t)?X(t):t;return j(i)?e.filter((function(t){return j(t)&&z(t,i)&&"body"!==A(t)})):[]}(t):[].concat(e),r=[].concat(o,[i]),s=r[0],a=r.reduce((function(e,i){var o=gt(t,i,n);return e.top=D(o.top,e.top),e.right=M(o.right,e.right),e.bottom=M(o.bottom,e.bottom),e.left=D(o.left,e.left),e}),gt(t,s,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function mt(t){var e,i=t.reference,a=t.element,c=t.placement,u=c?I(c):null,p=c?$(c):null,f=i.x+i.width/2-a.width/2,h=i.y+i.height/2-a.height/2;switch(u){case n:e={x:f,y:i.y-a.height};break;case o:e={x:f,y:i.y+i.height};break;case r:e={x:i.x+i.width,y:h};break;case s:e={x:i.x-a.width,y:h};break;default:e={x:i.x,y:i.y}}var g=u?Y(u):null;if(null!=g){var v="y"===g?"height":"width";switch(p){case l:e[g]=e[g]-(i[v]/2-a[v]/2);break;case d:e[g]=e[g]+(i[v]/2-a[v]/2)}}return e}function yt(t,e){void 0===e&&(e={});var i=e,s=i.placement,a=void 0===s?t.placement:s,l=i.strategy,d=void 0===l?t.strategy:l,g=i.boundary,v=void 0===g?u:g,m=i.rootBoundary,y=void 0===m?p:m,_=i.elementContext,b=void 0===_?f:_,w=i.altBoundary,E=void 0!==w&&w,L=i.padding,O=void 0===L?0:L,x=J("number"!=typeof O?O:Q(O,c)),k=b===f?h:f,A=t.rects.popper,T=t.elements[E?k:b],P=vt(j(T)?T:T.contextElement||N(t.elements.popper),v,y,d),C=V(t.elements.reference),S=mt({reference:C,element:A,strategy:"absolute",placement:a}),I=ht(Object.assign({},A,S)),D=b===f?I:C,M={top:P.top-D.top+x.top,bottom:D.bottom-P.bottom+x.bottom,left:P.left-D.left+x.left,right:D.right-P.right+x.right},q=t.modifiersData.offset;if(b===f&&q){var H=q[a];Object.keys(M).forEach((function(t){var e=[r,o].indexOf(t)>=0?1:-1,i=[n,o].indexOf(t)>=0?"y":"x";M[t]+=H[i]*e}))}return M}var _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,d=t.name;if(!e.modifiersData[d]._skip){for(var u=i.mainAxis,p=void 0===u||u,f=i.altAxis,h=void 0===f||f,m=i.fallbackPlacements,y=i.padding,_=i.boundary,b=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,L=void 0===E||E,O=i.allowedAutoPlacements,x=e.options.placement,k=I(x),A=m||(k===x||!L?[st(x)]:function(t){if(I(t)===a)return[];var e=st(t);return[ct(t),e,ct(e)]}(x)),T=[x].concat(A).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,o=i.boundary,r=i.rootBoundary,s=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,d=void 0===l?v:l,u=$(n),p=u?a?g:g.filter((function(t){return $(t)===u})):c,f=p.filter((function(t){return d.indexOf(t)>=0}));0===f.length&&(f=p);var h=f.reduce((function(e,i){return e[i]=yt(t,{placement:i,boundary:o,rootBoundary:r,padding:s})[I(i)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}(e,{placement:i,boundary:_,rootBoundary:b,padding:y,flipVariations:L,allowedAutoPlacements:O}):i)}),[]),j=e.rects.reference,P=e.rects.popper,C=new Map,S=!0,D=T[0],M=0;M=0,W=V?"width":"height",z=yt(e,{placement:q,boundary:_,rootBoundary:b,altBoundary:w,padding:y}),R=V?B?r:s:B?o:n;j[W]>P[W]&&(R=st(R));var F=st(R),N=[];if(p&&N.push(z[H]<=0),h&&N.push(z[R]<=0,z[F]<=0),N.every((function(t){return t}))){D=q,S=!1;break}C.set(q,N)}if(S)for(var K=function(t){var e=T.find((function(e){var i=C.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return D=e,"break"},U=L?3:1;U>0;U--){if("break"===K(U))break}e.placement!==D&&(e.modifiersData[d]._skip=!0,e.placement=D,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function wt(t){return[n,r,o,s].some((function(e){return t[e]>=0}))}var Et={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=yt(e,{elementContext:"reference"}),a=yt(e,{altBoundary:!0}),c=bt(s,n),l=bt(a,o,r),d=wt(c),u=wt(l);e.modifiersData[i]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:d,hasPopperEscaped:u},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":u})}};var Lt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,o=t.name,a=i.offset,c=void 0===a?[0,0]:a,l=v.reduce((function(t,i){return t[i]=function(t,e,i){var o=I(t),a=[s,n].indexOf(o)>=0?-1:1,c="function"==typeof i?i(Object.assign({},e,{placement:t})):i,l=c[0],d=c[1];return l=l||0,d=(d||0)*a,[s,r].indexOf(o)>=0?{x:d,y:l}:{x:l,y:d}}(i,e.rects,c),t}),{}),d=l[e.placement],u=d.x,p=d.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=p),e.modifiersData[o]=l}};var Ot={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var xt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,c=i.mainAxis,d=void 0===c||c,u=i.altAxis,p=void 0!==u&&u,f=i.boundary,h=i.rootBoundary,g=i.altBoundary,v=i.padding,m=i.tether,y=void 0===m||m,_=i.tetherOffset,b=void 0===_?0:_,w=yt(e,{boundary:f,rootBoundary:h,padding:v,altBoundary:g}),E=I(e.placement),L=$(e.placement),O=!L,x=Y(E),k="x"===x?"y":"x",A=e.modifiersData.popperOffsets,T=e.rects.reference,j=e.rects.popper,P="function"==typeof b?b(Object.assign({},e.rects,{placement:e.placement})):b,C="number"==typeof P?{mainAxis:P,altAxis:P}:Object.assign({mainAxis:0,altAxis:0},P),S=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,q={x:0,y:0};if(A){if(d){var H,B="y"===x?n:s,V="y"===x?o:r,z="y"===x?"height":"width",R=A[x],F=R+w[B],N=R-w[V],K=y?-j[z]/2:0,U=L===l?T[z]:j[z],J=L===l?-j[z]:-T[z],Q=e.elements.arrow,Z=y&&Q?W(Q):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[B],it=tt[V],nt=G(0,T[z],Z[z]),ot=O?T[z]/2-K-nt-et-C.mainAxis:U-nt-et-C.mainAxis,rt=O?-T[z]/2+K+nt+it+C.mainAxis:J+nt+it+C.mainAxis,st=e.elements.arrow&&X(e.elements.arrow),at=st?"y"===x?st.clientTop||0:st.clientLeft||0:0,ct=null!=(H=null==S?void 0:S[x])?H:0,lt=R+rt-ct,dt=G(y?M(F,R+ot-ct-at):F,R,y?D(N,lt):N);A[x]=dt,q[x]=dt-R}if(p){var ut,pt="x"===x?n:s,ft="x"===x?o:r,ht=A[k],gt="y"===k?"height":"width",vt=ht+w[pt],mt=ht-w[ft],_t=-1!==[n,s].indexOf(E),bt=null!=(ut=null==S?void 0:S[k])?ut:0,wt=_t?vt:ht-T[gt]-j[gt]-bt+C.altAxis,Et=_t?ht+T[gt]+j[gt]-bt-C.altAxis:mt,Lt=y&&_t?function(t,e,i){var n=G(t,e,i);return n>i?i:n}(wt,ht,Et):G(y?wt:vt,ht,y?Et:mt);A[k]=Lt,q[k]=Lt-ht}e.modifiersData[a]=q}},requiresIfExists:["offset"]};function kt(t,e,i){void 0===i&&(i=!1);var n,o,r=P(e),s=P(e)&&function(t){var e=t.getBoundingClientRect(),i=q(e.width)/t.offsetWidth||1,n=q(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=N(e),c=V(t,s,i),l={scrollLeft:0,scrollTop:0},d={x:0,y:0};return(r||!r&&!i)&&(("body"!==A(e)||ut(a))&&(l=(n=e)!==T(n)&&P(n)?{scrollLeft:(o=n).scrollLeft,scrollTop:o.scrollTop}:lt(n)),P(e)?((d=V(e,!0)).x+=e.clientLeft,d.y+=e.clientTop):a&&(d.x=dt(a))),{x:c.left+l.scrollLeft-d.x,y:c.top+l.scrollTop-d.y,width:c.width,height:c.height}}function At(t){var e=new Map,i=new Set,n=[];function o(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&o(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||o(t)})),n}var Tt={placement:"bottom",modifiers:[],strategy:"absolute"};function jt(){for(var t=arguments.length,e=new Array(t),i=0;i element.disabled = true); + if (elt.classList.contains('hx-disable')) { + elt.disabled = true;} + + } else if(name == 'htmx:afterRequest') { + result.forEach(element => element.disabled = false); + if (elt.classList.contains('hx-disable')) elt.disabled = false; + } + */ + } +}) diff --git a/resources/public/output.css b/resources/public/output.css new file mode 100644 index 00000000..251d5b1f --- /dev/null +++ b/resources/public/output.css @@ -0,0 +1,2953 @@ +/* +! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #E5E7EB; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Calibri, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9CA3AF; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9CA3AF; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6B7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #007dbb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #007dbb; +} + +input::-moz-placeholder, textarea::-moz-placeholder { + color: #6B7280; + opacity: 1; +} + +input::placeholder,textarea::placeholder { + color: #6B7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-date-and-time-value { + min-height: 1.5em; +} + +select:not([size]) { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type='checkbox'],[type='radio'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #007dbb; + background-color: #fff; + border-color: #6B7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type='checkbox'] { + border-radius: 0px; +} + +[type='radio'] { + border-radius: 100%; +} + +[type='checkbox']:focus,[type='radio']:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #007dbb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); +} + +[type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); +} + +[type='checkbox']:indeterminate { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='file'] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type='file']:focus { + outline: 1px auto inherit; +} + +input[type=file]::file-selector-button { + color: white; + background: #1F2937; + border: 0; + font-weight: 500; + font-size: 0.875rem; + cursor: pointer; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + padding-left: 2rem; + padding-right: 1rem; + -webkit-margin-start: -1rem; + margin-inline-start: -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +input[type=file]::file-selector-button:hover { + background: #374151; +} + +.dark input[type=file]::file-selector-button { + color: white; + background: #4B5563; +} + +.dark input[type=file]::file-selector-button:hover { + background: #6B7280; +} + +input[type="range"]::-webkit-slider-thumb { + height: 1.25rem; + width: 1.25rem; + background: #007dbb; + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; +} + +input[type="range"]:disabled::-webkit-slider-thumb { + background: #9CA3AF; +} + +.dark input[type="range"]:disabled::-webkit-slider-thumb { + background: #6B7280; +} + +input[type="range"]:focus::-webkit-slider-thumb { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1px; + --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity)); +} + +input[type="range"]::-moz-range-thumb { + height: 1.25rem; + width: 1.25rem; + background: #007dbb; + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; +} + +input[type="range"]:disabled::-moz-range-thumb { + background: #9CA3AF; +} + +.dark input[type="range"]:disabled::-moz-range-thumb { + background: #6B7280; +} + +input[type="range"]::-moz-range-progress { + background: #009cea; +} + +input[type="range"]::-ms-fill-lower { + background: #009cea; +} + +.toggle-bg:after { + content: ""; + position: absolute; + top: 0.125rem; + left: 0.125rem; + background: white; + border-color: #D1D5DB; + border-width: 1px; + border-radius: 9999px; + height: 1.25rem; + width: 1.25rem; + transition-property: background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter; + transition-duration: .15s; + box-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); +} + +input:checked + .toggle-bg:after { + transform: translateX(100%);; + border-color: white; +} + +input:checked + .toggle-bg { + background: #007dbb; + border-color: #007dbb; +} + +.tooltip-arrow,.tooltip-arrow:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +.tooltip-arrow { + visibility: hidden; +} + +.tooltip-arrow:before { + content: ""; + visibility: visible; + transform: rotate(45deg); +} + +[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before { + border-style: solid; + border-color: #e5e7eb; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before { + border-top-width: 1px; + border-right-width: 1px; +} + +.tooltip[data-popper-placement^='top'] > .tooltip-arrow { + bottom: -4px; +} + +.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow { + top: -4px; +} + +.tooltip[data-popper-placement^='left'] > .tooltip-arrow { + right: -4px; +} + +.tooltip[data-popper-placement^='right'] > .tooltip-arrow { + left: -4px; +} + +.tooltip.invisible > .tooltip-arrow:before { + visibility: hidden; +} + +[data-popper-arrow],[data-popper-arrow]:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +[data-popper-arrow] { + visibility: hidden; +} + +[data-popper-arrow]:before { + content: ""; + visibility: visible; + transform: rotate(45deg); +} + +[data-popper-arrow]:after { + content: ""; + visibility: visible; + transform: rotate(45deg); + position: absolute; + width: 9px; + height: 9px; + background: inherit; +} + +[role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: #e5e7eb; +} + +.dark [role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: #4b5563; +} + +[role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: #e5e7eb; +} + +.dark [role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: #4b5563; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] { + bottom: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] { + top: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] { + right: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] { + left: -5px; +} + +[role="tooltip"].invisible > [data-popper-arrow]:before { + visibility: hidden; +} + +[role="tooltip"].invisible > [data-popper-arrow]:after { + visibility: hidden; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(0 156 234 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(0 156 234 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.visible { + visibility: visible; +} + +.invisible { + visibility: hidden; +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.inset-0 { + inset: 0px; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.-right-2 { + right: -0.5rem; +} + +.-top-2 { + top: -0.5rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-\[60px\] { + bottom: 60px; +} + +.left-0 { + left: 0px; +} + +.right-0 { + right: 0px; +} + +.right-2 { + right: 0.5rem; +} + +.top-0 { + top: 0px; +} + +.top-2 { + top: 0.5rem; +} + +.top-5 { + top: 1.25rem; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-30 { + z-index: 30; +} + +.z-40 { + z-index: 40; +} + +.z-50 { + z-index: 50; +} + +.col-span-1 { + grid-column: span 1 / span 1; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.col-span-3 { + grid-column: span 3 / span 3; +} + +.col-span-6 { + grid-column: span 6 / span 6; +} + +.m-4 { + margin: 1rem; +} + +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-0 { + margin-top: 0px; + margin-bottom: 0px; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.-mb-1 { + margin-bottom: -0.25rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.mr-10 { + margin-right: 2.5rem; +} + +.mr-16 { + margin-right: 4rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mr-3 { + margin-right: 0.75rem; +} + +.mt-0 { + margin-top: 0px; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.h-10 { + height: 2.5rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-3\.5 { + height: 0.875rem; +} + +.h-4 { + height: 1rem; +} + +.h-48 { + height: 12rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-96 { + height: 24rem; +} + +.h-\[calc\(100\%-1rem\)\] { + height: calc(100% - 1rem); +} + +.h-full { + height: 100%; +} + +.h-screen { + height: 100vh; +} + +.max-h-96 { + max-height: 24rem; +} + +.max-h-full { + max-height: 100%; +} + +.w-1\/2 { + width: 50%; +} + +.w-3 { + width: 0.75rem; +} + +.w-3\.5 { + width: 0.875rem; +} + +.w-4 { + width: 1rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-64 { + width: 16rem; +} + +.w-8 { + width: 2rem; +} + +.w-full { + width: 100%; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-screen-2xl { + max-width: 1536px; +} + +.max-w-screen-lg { + max-width: 1024px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-none { + flex: none; +} + +.flex-shrink { + flex-shrink: 1; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.-translate-x-full { + --tw-translate-x: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-full { + --tw-translate-y: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-full { + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-full { + --tw-translate-y: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform-none { + transform: none; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} + +.cursor-default { + cursor: default; +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-pointer { + cursor: pointer; +} + +.resize { + resize: both; +} + +.list-none { + list-style-type: none; +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.flex-row-reverse { + flex-direction: row-reverse; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.content-start { + align-content: flex-start; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-stretch { + align-items: stretch; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-items-start { + justify-items: start; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-8 { + gap: 2rem; +} + +.-space-x-px > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(-1px * var(--tw-space-x-reverse)); + margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-divide-opacity)); +} + +.justify-self-start { + justify-self: start; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-l-lg { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; +} + +.rounded-r-lg { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; +} + +.rounded-t { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.border { + border-width: 1px; +} + +.border-0 { + border-width: 0px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-blue-600 { + --tw-border-opacity: 1; + border-color: rgb(0 125 187 / var(--tw-border-opacity)); +} + +.border-blue-700 { + --tw-border-opacity: 1; + border-color: rgb(0 94 140 / var(--tw-border-opacity)); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-primary-300 { + --tw-border-opacity: 1; + border-color: rgb(175 211 130 / var(--tw-border-opacity)); +} + +.border-red-300 { + --tw-border-opacity: 1; + border-color: rgb(255 104 104 / var(--tw-border-opacity)); +} + +.border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity)); +} + +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(204 235 251 / var(--tw-bg-opacity)); +} + +.bg-blue-300 { + --tw-bg-opacity: 1; + background-color: rgb(102 196 242 / var(--tw-bg-opacity)); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(0 156 234 / var(--tw-bg-opacity)); +} + +.bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(0 94 140 / var(--tw-bg-opacity)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(228 240 213 / var(--tw-bg-opacity)); +} + +.bg-green-500 { + --tw-bg-opacity: 1; + background-color: rgb(121 181 46 / var(--tw-bg-opacity)); +} + +.bg-primary-50 { + --tw-bg-opacity: 1; + background-color: rgb(242 248 234 / var(--tw-bg-opacity)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 205 205 / var(--tw-bg-opacity)); +} + +.bg-red-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 230 230 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-white\/50 { + background-color: rgb(255 255 255 / 0.5); +} + +.bg-yellow-100 { + --tw-bg-opacity: 1; + background-color: rgb(253 246 178 / var(--tw-bg-opacity)); +} + +.bg-green-200 { + --tw-bg-opacity: 1; + background-color: rgb(201 225 171 / var(--tw-bg-opacity)); +} + +.bg-blue-200 { + --tw-bg-opacity: 1; + background-color: rgb(153 215 247 / var(--tw-bg-opacity)); +} + +.bg-red-200 { + --tw-bg-opacity: 1; + background-color: rgb(255 154 154 / var(--tw-bg-opacity)); +} + +.bg-opacity-50 { + --tw-bg-opacity: 0.5; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-2\.5 { + padding: 0.625rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pl-10 { + padding-left: 2.5rem; +} + +.pl-11 { + padding-left: 2.75rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-3 { + padding-left: 0.75rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pr-2\.5 { + padding-right: 0.625rem; +} + +.pt-16 { + padding-top: 4rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-5 { + padding-top: 1.25rem; +} + +.pt-8 { + padding-top: 2rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.italic { + font-style: italic; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-9 { + line-height: 2.25rem; +} + +.leading-tight { + line-height: 1.25; +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(0 125 187 / var(--tw-text-opacity)); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(0 62 94 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-green-800 { + --tw-text-opacity: 1; + color: rgb(48 72 18 / var(--tw-text-opacity)); +} + +.text-primary-600 { + --tw-text-opacity: 1; + color: rgb(97 145 37 / var(--tw-text-opacity)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(204 2 2 / var(--tw-text-opacity)); +} + +.text-red-800 { + --tw-text-opacity: 1; + color: rgb(102 1 1 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(114 59 19 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-100 { + opacity: 1; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-100 { + transition-duration: 100ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.duration-500 { + transition-duration: 500ms; +} + +.duration-75 { + transition-duration: 75ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.htmx-added .fade-in { + opacity: 0.0 !important; +} + +.htmx-added.fade-in { + opacity: 0.0 !important; +} + +.fade-in { + opacity: 1.0; +} + +.htmx-added .slide-up { + --tw-translate-y: 1.25rem !important; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important; +} + +.hidden .slide-up { + --tw-translate-y: 1.25rem !important; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important; +} + +.slide-up { + --tw-translate-y: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.live-added { + animation: pulse-green 300ms 2; + animation-direction: alternate; + animation-timing-function: ease-in-out; +} + +.dark .live-added { + animation: pulse-dark-green 300ms 2 !important; + animation-direction: alternate; + animation-timing-function: ease-in-out; +} + +/* +.live-added { + @apply bg-white; +} +*/ + +@keyframes pulse-green { + 0% { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + } + + 100% { + --tw-bg-opacity: 1; + background-color: rgb(175 211 130 / var(--tw-bg-opacity)); + } + + :is(.dark 100%) { + --tw-bg-opacity: 1; + background-color: rgb(153 2 2 / var(--tw-bg-opacity)); + } +} + +@keyframes pulse-dark-green { + :is(.dark 0%) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); + } + + 100% { + --tw-bg-opacity: 1; + background-color: rgb(73 109 28 / var(--tw-bg-opacity)); + } +} + +.htmx-request .htmx-indicator, .htmx-request.htmx-indicator { + display: inherit !important; +} + +.htmx-indicator { + display: none; +} + +.htmx-request .htmx-indicator-hidden { + display: none !important; +} + +.htmx-indicator-hidden { + display: inherit; +} + +.htmx-swapping .fade-out { + opacity: 0.0 !important; +} + +.fade-out { + opacity: 1.0; +} + +.min-h-content { + min-height: calc(100vh - 4em); +} + +.hover\:scale-105:hover { + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:scale-110:hover { + --tw-scale-x: 1.1; + --tw-scale-y: 1.1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:border-gray-300:hover { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.hover\:bg-blue-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(0 125 187 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(0 62 94 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(228 240 213 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(97 145 37 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(73 109 28 / var(--tw-bg-opacity)); +} + +.hover\:bg-primary-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(228 240 213 / var(--tw-bg-opacity)); +} + +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(175 211 130 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(102 196 242 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 104 104 / var(--tw-bg-opacity)); +} + +.hover\:text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(0 125 187 / var(--tw-text-opacity)); +} + +.hover\:text-gray-600:hover { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.hover\:text-gray-700:hover { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.hover\:text-gray-800:hover { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.hover\:text-gray-900:hover { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.hover\:text-primary-700:hover { + --tw-text-opacity: 1; + color: rgb(73 109 28 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.focus\:border-blue-500:focus { + --tw-border-opacity: 1; + border-color: rgb(0 156 234 / var(--tw-border-opacity)); +} + +.focus\:border-primary-500:focus { + --tw-border-opacity: 1; + border-color: rgb(121 181 46 / var(--tw-border-opacity)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-4:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-blue-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(102 196 242 / var(--tw-ring-opacity)); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 156 234 / var(--tw-ring-opacity)); +} + +.focus\:ring-gray-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); +} + +.focus\:ring-gray-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} + +.focus\:ring-green-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(175 211 130 / var(--tw-ring-opacity)); +} + +.focus\:ring-primary-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(121 181 46 / var(--tw-ring-opacity)); +} + +.focus\:ring-green-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(201 225 171 / var(--tw-ring-opacity)); +} + +.focus\:ring-blue-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(153 215 247 / var(--tw-ring-opacity)); +} + +.focus\:ring-red-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 154 154 / var(--tw-ring-opacity)); +} + +.group:hover .group-hover\:scale-110 { + --tw-scale-x: 1.1; + --tw-scale-y: 1.1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.group:hover .group-hover\:text-blue-500 { + --tw-text-opacity: 1; + color: rgb(0 156 234 / var(--tw-text-opacity)); +} + +.group:hover .group-hover\:text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:block) { + display: block; +} + +:is(.dark .dark\:hidden) { + display: none; +} + +:is(.dark .dark\:divide-gray-600) > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-divide-opacity)); +} + +:is(.dark .dark\:border-blue-500) { + --tw-border-opacity: 1; + border-color: rgb(0 156 234 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-gray-500) { + --tw-border-opacity: 1; + border-color: rgb(107 114 128 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-gray-600) { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-gray-700) { + --tw-border-opacity: 1; + border-color: rgb(55 65 81 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-gray-900) { + --tw-border-opacity: 1; + border-color: rgb(17 24 39 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:border-transparent) { + border-color: transparent; +} + +:is(.dark .dark\:bg-blue-600) { + --tw-bg-opacity: 1; + background-color: rgb(0 125 187 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-blue-900) { + --tw-bg-opacity: 1; + background-color: rgb(0 31 47 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-gray-600) { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-gray-700) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-gray-800) { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-gray-800\/50) { + background-color: rgb(31 41 55 / 0.5); +} + +:is(.dark .dark\:bg-gray-900) { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-green-600) { + --tw-bg-opacity: 1; + background-color: rgb(97 145 37 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-green-900) { + --tw-bg-opacity: 1; + background-color: rgb(24 36 9 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-red-900) { + --tw-bg-opacity: 1; + background-color: rgb(51 1 1 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-yellow-900) { + --tw-bg-opacity: 1; + background-color: rgb(99 49 18 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-green-500) { + --tw-bg-opacity: 1; + background-color: rgb(121 181 46 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-green-700) { + --tw-bg-opacity: 1; + background-color: rgb(73 109 28 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-blue-700) { + --tw-bg-opacity: 1; + background-color: rgb(0 94 140 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-red-700) { + --tw-bg-opacity: 1; + background-color: rgb(153 2 2 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-opacity-80) { + --tw-bg-opacity: 0.8; +} + +:is(.dark .dark\:text-blue-300) { + --tw-text-opacity: 1; + color: rgb(102 196 242 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-blue-500) { + --tw-text-opacity: 1; + color: rgb(0 156 234 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-100) { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-200) { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-300) { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-400) { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-50) { + --tw-text-opacity: 1; + color: rgb(249 250 251 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-gray-500) { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-green-300) { + --tw-text-opacity: 1; + color: rgb(175 211 130 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-red-300) { + --tw-text-opacity: 1; + color: rgb(255 104 104 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-red-400) { + --tw-text-opacity: 1; + color: rgb(255 53 53 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-white) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:text-yellow-300) { + --tw-text-opacity: 1; + color: rgb(250 202 21 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:placeholder-gray-400)::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +:is(.dark .dark\:placeholder-gray-400)::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +:is(.dark .dark\:ring-offset-gray-800) { + --tw-ring-offset-color: #1F2937; +} + +:is(.dark .dark\:hover\:bg-blue-700:hover) { + --tw-bg-opacity: 1; + background-color: rgb(0 94 140 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-gray-600:hover) { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-gray-700:hover) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-gray-800:hover) { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-green-600:hover) { + --tw-bg-opacity: 1; + background-color: rgb(97 145 37 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-green-700:hover) { + --tw-bg-opacity: 1; + background-color: rgb(73 109 28 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-blue-600:hover) { + --tw-bg-opacity: 1; + background-color: rgb(0 125 187 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:bg-red-600:hover) { + --tw-bg-opacity: 1; + background-color: rgb(204 2 2 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:hover\:text-blue-500:hover) { + --tw-text-opacity: 1; + color: rgb(0 156 234 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:hover\:text-gray-100:hover) { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:hover\:text-gray-300:hover) { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:hover\:text-white:hover) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +:is(.dark .dark\:focus\:border-blue-500:focus) { + --tw-border-opacity: 1; + border-color: rgb(0 156 234 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:focus\:border-primary-500:focus) { + --tw-border-opacity: 1; + border-color: rgb(121 181 46 / var(--tw-border-opacity)); +} + +:is(.dark .dark\:focus\:ring-blue-500:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 156 234 / var(--tw-ring-opacity)); +} + +:is(.dark .dark\:focus\:ring-blue-800:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 62 94 / var(--tw-ring-opacity)); +} + +:is(.dark .dark\:focus\:ring-gray-600:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); +} + +:is(.dark .dark\:focus\:ring-green-800:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(48 72 18 / var(--tw-ring-opacity)); +} + +:is(.dark .dark\:focus\:ring-primary-500:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(121 181 46 / var(--tw-ring-opacity)); +} + +:is(.dark .dark\:focus\:ring-primary-600:focus) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(97 145 37 / var(--tw-ring-opacity)); +} + +:is(.dark .group:hover .dark\:group-hover\:text-white) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +@media (min-width: 640px) { + .sm\:block { + display: block; + } + + .sm\:rounded-lg { + border-radius: 0.5rem; + } + + .sm\:p-6 { + padding: 1.5rem; + } + + .sm\:py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } +} + +@media (min-width: 768px) { + .md\:inset-0 { + inset: 0px; + } + + .md\:ml-2 { + margin-left: 0.5rem; + } + + .md\:mr-24 { + margin-right: 6rem; + } + + .md\:table-cell { + display: table-cell; + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:items-center { + align-items: center; + } + + .md\:space-x-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.75rem * var(--tw-space-x-reverse)); + margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); + } + + .md\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } +} + +@media (min-width: 1024px) { + .lg\:block { + display: block; + } + + .lg\:flex { + display: flex; + } + + .lg\:table-cell { + display: table-cell; + } + + .lg\:hidden { + display: none; + } + + .lg\:w-96 { + width: 24rem; + } + + .lg\:translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .lg\:flex-row { + flex-direction: row; + } + + .lg\:items-center { + align-items: center; + } + + .lg\:justify-end { + justify-content: flex-end; + } + + .lg\:justify-between { + justify-content: space-between; + } + + .lg\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } + + .lg\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + + .lg\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + + .lg\:pl-3 { + padding-left: 0.75rem; + } + + .lg\:pl-64 { + padding-left: 16rem; + } +} diff --git a/scratch-sessions/build_ml.clj b/scratch-sessions/build_ml.clj index e74fdc1e..ad27fbc2 100644 --- a/scratch-sessions/build_ml.clj +++ b/scratch-sessions/build_ml.clj @@ -5,7 +5,7 @@ ;; You can also press C-u C-j to evaluate the expression and pretty-print its result. (ns build-ml - (:require [datomic.client.api :as dc] + (:require [datomic.api :as dc] [clojure.java.io :as io] [clojure.data.csv :as csv] [auto-ap.datomic :refer [conn]])) diff --git a/scratch-sessions/ingest_ml.clj b/scratch-sessions/ingest_ml.clj index 07001b8a..126d228b 100644 --- a/scratch-sessions/ingest_ml.clj +++ b/scratch-sessions/ingest_ml.clj @@ -41,7 +41,7 @@ (drop 1) (map (fn [[a n]] [(Long/parseLong a) (numeric-code->account (Long/parseLong n))]))) - (slurp-csv "/home/notid/dev/transaction-training/input/accounts.csv")) + (slurp-csv "/mnt/data/dev2/ml-test/input/accounts.csv")) vendor-name->vendor (into {} (dc/q '[:find ?vn ?v :in $ :where [?v :vendor/name ?vn]] @@ -51,18 +51,18 @@ (drop 1) (map (fn [[a n]] [(Long/parseLong a) (vendor-name->vendor (Long/parseLong n))]))) - (slurp-csv "/home/notid/dev/transaction-training/input/vendors.csv"))] - inference-vendor->vendor - #_(with-open [reader (io/reader "/home/notid/dev/transaction-training/inference-outcome.csv")] + (slurp-csv "/mnt/data/dev2/ml-test/input/vendors.csv"))] + #_inference-vendor->vendor + (with-open [reader (io/reader "/mnt/data/dev2/ml-test/inference-outcome.csv")] (->> (csv/read-csv reader) (into [] (comp (drop 1) (map (fn [[_ transaction best-vendor best-account account-confidence]] {:db/id (Long/parseLong transaction) - :transaction/recommended-account (Long/parseLong best-account) + :transaction/recommended-account (inference-account->account best-account) :transaction/account-confidence (Double/parseDouble account-confidence) - :transaction/recommended-vendor (Long/parseLong best-vendor)})))))))) + :transaction/recommended-vendor (inference-vendor->vendor best-vendor)})))))))) (defn apply-inference [inference] (doseq [p (->> inference (partition-all 100))] diff --git a/scratch-sessions/pnl-export.repl b/scratch-sessions/pnl-export.repl new file mode 100644 index 00000000..ca27b7a8 --- /dev/null +++ b/scratch-sessions/pnl-export.repl @@ -0,0 +1,83 @@ +;; This buffer is for Clojure experiments and evaluation. + +;; Press C-j to evaluate the last expression. + +;; You can also press C-u C-j to evaluate the expression and pretty-print its result. +(dc/pull (dc/db conn) [:db/id] [:client/code "NGAK"]) + +(user/init-repl) + +(require '[auto-ap.datomic :refer [pull-attr pull-many]]) + +(csv/write-csv *out* + (let [clients (pull-many (dc/db conn) '[:db/id :client/code :client/locations] [[:client/code "NGAK"] [:client/code "NGOP"] #_#_[:client/code "NGRV"] [:client/code "NGE1"]]) + account->numeric-code (into {} (seq (dc/q '[:find ?i ?n + :in $ [?a ...] + :where [?i ?a ?n]] + (dc/db conn) [:account/numeric-code :bank-account/numeric-code]))) + account->name (let [lookup (into {} (seq (dc/q '[:find ?i ?n + :in $ + :where [?i :account/name ?n]] + (dc/db conn))))] + (fn [x] + (or (lookup x) "Bank Account"))) + account->location (into {} (seq (dc/q '[:find ?i ?l + :in $ + :where [?i :account/location ?l]] + (dc/db conn)))) + used-accounts (into #{} (for [c clients + d (dc/index-range (dc/db conn) + :journal-entry-line/client+account+location+date + [(:db/id c)] + [(inc (:db/id c))]) + :let [[_ account] (:v d)]] + account))] + (for [client clients + :let [all-entries (->> (dc/index-pull (dc/db conn) + {:index :avet + :selector [:db/id :journal-entry-line/running-balance :journal-entry-line/client+account+location+date] + :start [:journal-entry-line/client+account+location+date [(:db/id client)]] + :reverse false + :limit 1}) + (take-while (fn [curr] + (= (first (:journal-entry-line/client+account+location+date curr)) + (:db/id client))))) + account-lookup (->> all-entries + (reduce + (fn [acc curr] + (let [[client account location date] (:journal-entry-line/client+account+location+date curr) + numeric-code (account->numeric-code account)] + (assoc acc (format "%d-%d-%s-%s" client numeric-code location (atime/unparse-local (clj-time.coerce/to-date-time date) atime/iso-date)) (:journal-entry-line/running-balance curr)))) + (sorted-map)))] + a (sort-by account->numeric-code used-accounts) + :let [numeric-code (account->numeric-code a)] + l (or (account->location a) (:client/locations client)) + delta (range -60 0) + :let [date (t/plus (c/to-date-time #inst "2023-06-12T08:00:00") (t/days delta)) + date-str (atime/unparse-local date atime/iso-date)] + :when (and numeric-code (>= numeric-code 40000))] + (conj [(:client/code client) l numeric-code (account->name a) date-str] (with-precision 2 + (double (.setScale (bigdec (or + (some->> (subseq account-lookup >= (format "%d-%d-%s-%s" (:db/id client) numeric-code l "2000-01-01") <= (format "%d-%d-%s-%s" (:db/id client) numeric-code l date-str)) + last + last) + 0.0)) + 2 java.math.RoundingMode/HALF_UP)))))) + ) + +(dc/q '[:find (count ?x) + :where [?x :journal-entry-line/dirty true]] + (dc/db conn)) + +(let [clients (map first + (dc/q '[:find (pull ?c [:client/code :db/id]) + :where [?c :client/code]] + (dc/db conn)))] + (doseq [[c i] (map vector clients (range))] + (let [db (dc/db conn) + accounts-needing-rebuild (auto-ap.ledger/accounts-needing-rebuild db (:db/id c))] + (when (seq accounts-needing-rebuild) + (println "C" c "needs" (count accounts-needing-rebuild) "built") + #_(refresh-running-balance-accounts accounts-needing-rebuild clients c i db) + #_(mu/log ::client-completed))))) +, diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index 71c585b6..f2a18fa5 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -578,12 +578,14 @@ (defn add-sorter-fields [q sort-map args] (reduce - (fn [q {:keys [sort-key]}] + (fn [q {:keys [sort-key] :as z}] + (prn z) + (println (class sort-key)) (merge-query q {:query {:find [(symbol (str "?sort-" sort-key))] :where (sort-map sort-key - (println "Warning, trying to sort by unsupported field" sort-key))}})) + (println "Warning, trying to sort by unsupported field" sort-key, "sort map" (pr-str sort-map)))}})) q (:sort args))) @@ -620,9 +622,13 @@ (range length)))] (sort comparator results ))) -(defn apply-pagination [args results] - (log/info (take 4 results)) +(defn apply-pagination-raw [args results] + {:entries (->> results + (drop (:start args 0)) + (take (:count args (or (:per-page args) default-pagination-size)))) + :count (count results)}) +(defn apply-pagination [args results] {:ids (->> results (drop (:start args 0)) (take (:count args (or (:per-page args) default-pagination-size))) diff --git a/src/clj/auto_ap/datomic/reports.clj b/src/clj/auto_ap/datomic/reports.clj index 843e2026..66ce0cf2 100644 --- a/src/clj/auto_ap/datomic/reports.clj +++ b/src/clj/auto_ap/datomic/reports.clj @@ -12,6 +12,8 @@ [clj-time.coerce :as c] [datomic.api :as dc])) +(def default-read '[:db/id :report/client :report/created :report/url :report/name :report/creator]) + (defn raw-graphql-ids [db args] (let [query (cond-> {:query {:find [] :in ['$ ] @@ -43,8 +45,7 @@ (apply-pagination args)))) (defn graphql-results [ids db args] - (let [results (->> (pull-many db '[:db/id :report/client :report/created :report/url :report/name :report/creator] - ids) + (let [results (->> (pull-many db default-read ids) (map #(update % :report/created c/from-date)) (group-by :db/id))] (->> ids @@ -63,8 +64,3 @@ [(->> (graphql-results ids-to-retrieve db args)) matching-count])) - - - - - diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index 54643aa9..da43b0df 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -30,7 +30,8 @@ [ring.util.response :as response] [unilog.context :as lc] [clj-time.coerce :as coerce] - [clj-time.core :as time])) + [clj-time.core :as time] + [cemerick.url :as url])) (when (:aws-access-key-id env) (defcredential (:aws-access-key-id env) (:aws-secret-access-key env) (:aws-region env))) @@ -161,9 +162,17 @@ (let [end-time (time/plus (time/now) (time/days 14))] (assoc response :session (assoc session ::idle-timeout (coerce/to-date end-time))))))))))) +(defn wrap-hx-current-url-params + [handler ] + (fn [request] + (let [query-params (some-> (get-in request [:headers "hx-current-url"]) (url/url ) :query) + request (assoc request :hx-query-params query-params)] + (handler request)))) + #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} (def app (-> route-handler + (wrap-hx-current-url-params) (wrap-guess-route) (wrap-authorization auth-backend ) diff --git a/src/clj/auto_ap/parse/excel.clj b/src/clj/auto_ap/parse/excel.clj index 1f3b21f7..c296ccc2 100644 --- a/src/clj/auto_ap/parse/excel.clj +++ b/src/clj/auto_ap/parse/excel.clj @@ -44,12 +44,14 @@ extract)])) (defn extract-sheet-details [bucket object] - (-> (lambda/invoke {:function-name "xls-extractor" :payload - (json/write-str + (doto + (-> (lambda/invoke {:function-name "xls-extractor" :payload + (json/write-str {"s3_url" object "s3_bucket" bucket})}) - :payload - slurp - json/read-str)) + :payload + slurp + json/read-str) + println)) (defn parse-file [file _] diff --git a/src/clj/auto_ap/routes/auth.clj b/src/clj/auto_ap/routes/auth.clj index 45f07582..d6e4e2b9 100644 --- a/src/clj/auto_ap/routes/auth.clj +++ b/src/clj/auto_ap/routes/auth.clj @@ -20,18 +20,18 @@ (:jwt-secret env) {:alg :hs512})) -(defn oauth [{{:strs [code]} :query-params {:strs [host]} :headers}] +(defn oauth [{{:strs [code state]} :query-params {:strs [host]} :headers :as request}] (try (let [auth (-> "https://accounts.google.com/o/oauth2/token" - (http/post - {:form-params {"client_id" google-client-id - "client_secret" google-client-secret - "code" code - "redirect_uri" (str (:scheme env) "://" host "/api/oauth") - "grant_type" "authorization_code"} - :as :json}) + (http/post + {:form-params {"client_id" google-client-id + "client_secret" google-client-secret + "code" code + "redirect_uri" (str (:scheme env) "://" host "/api/oauth") + "grant_type" "authorization_code"} + :as :json}) :body) - + token (:access_token auth) profile (-> (http/get "https://www.googleapis.com/oauth2/v1/userinfo" {:headers {"Authorization" (str "Bearer " token)} :as :json}) @@ -45,6 +45,7 @@ :user/name (:name profile)}) auth {:user (:name profile) :exp (time/plus (time/now) (time/days 30)) + :db/id (:db/id user) :user/clients (map (fn [c] (select-keys c [:client/code :db/id :client/locations])) (:user/clients user)) @@ -53,19 +54,18 @@ _ (mu/log ::logged-in-as :auth auth)] ;; TODO - these namespaces are not being transmitted/deserialized properly - + (if (and token user) (let [jwt (jwt/sign auth (:jwt-secret env) {:alg :hs512})] - {:status 301 - :headers {"Location" (str "/?jwt=" jwt)} + :headers {"Location" (str (or (not-empty state) "/") "?jwt=" jwt)} :session {:identity (dissoc auth :exp)}}) {:status 401 :body "Couldn't authenticate"})) (catch Exception e - (log/warn e ) + (log/warn e) {:status 401 :body (str "Couldn't authenticate " (.toString e))}))) diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj index 441f2e2a..994bbe4a 100644 --- a/src/clj/auto_ap/routes/exports.clj +++ b/src/clj/auto_ap/routes/exports.clj @@ -267,8 +267,9 @@ )) (into [["Vendor Name" "Address" "City" "State" "Zip" "Terms" "Account" "Account Code"]]))] {:body - (into (list) - data)}))) + (into [] + data) + :headers {"content-disposition" "attachment; filename=\"vendors.csv\""}}))) (defn export-ledger [{:keys [identity query-params]}] (let [start-date (or (some-> (query-params "start-date") @@ -426,7 +427,7 @@ "expected-deposit/" {#"export/?" {:get :export-expected-deposits}} "clients/" {#"export/?" {:get :export-clients}} "vendors/" {#"export/?" {:get :export-vendors} - "/company" {#"export/?" {:get :export-company-vendors}}} + "company/" {#"export" {:get :export-company-vendors}}} "ledger/" {#"export/?" {:get :export-ledger}} "accounts/" {#"export/?" {:get :export-accounts}} "transactions/" {#"export/?" {:get :export-transactions} diff --git a/src/clj/auto_ap/routes/ezcater_xls.clj b/src/clj/auto_ap/routes/ezcater_xls.clj index 41052f6d..a9fdb31a 100644 --- a/src/clj/auto_ap/routes/ezcater_xls.clj +++ b/src/clj/auto_ap/routes/ezcater_xls.clj @@ -18,7 +18,8 @@ [com.brunobonacci.mulog :as mu] [datomic.api :as dc] [hiccup2.core :as hiccup] - [amazonica.aws.s3 :as s3])) + [amazonica.aws.s3 :as s3] + [auto-ap.ssr.components :as com])) (defn fmt-amount [a] (with-precision 2 @@ -27,19 +28,14 @@ (.setScale 2 java.math.RoundingMode/HALF_UP) (double)))) - - - (defn rows->maps [rows] (let [[headers & rows] rows] (for [r rows] (into {} (map vector headers r))))) - - - (defn map->sales-order [r clients] + (println r) (let [order-number (get r "Order Number") event-date (get r "Event Date") store-name (get r "Store Name") @@ -135,30 +131,29 @@ (stream->sales-orders s))) (defn page* [] - [:div - [:h1.title "EZCater XLS Import"] - [:div.card.block {:style {:width "500px"}} - [:div.card-content - "Please go to " - [:a {:href "https://www.ezcater.com/ez_manage/reports/new" :target "_blank"} "EZCater's report page"] - " to generate a new report. Then drop it below."]] - [:div#page-notification.notification.block {:style {:display "none"}}] - [:div.card.block - [:div.card-content - [:form {:action (bidi/path-for ssr-routes/only-routes - :admin-ezcater-xls) - :method "POST" - :class "dropzone" - :id "ezcater"}]]] - [:script - (hiccup/raw - " + [:div.mt-4 + (com/card {} + [:div.px-4.py-3.space-y-4.flex.flex-col + [:h1.text-2xl.mb-3.font-bold "EZCater XLS Import"] + [:p.text-sm.italic + "Please go to " + (com/link {:href "https://www.ezcater.com/ez_manage/reports/new" :target "_blank"} "EZCater's report page") + " to generate a new report. Then drop it below."] + [:div#page-notification.notification.block {:style {:display "none"}}] + [:form.bg-blue-300 {:action (bidi/path-for ssr-routes/only-routes + :admin-ezcater-xls) + :method "POST" + :class "dropzone" + :id "ezcater"}] + [:script + (hiccup/raw + " Dropzone.options.ezcater = { success: function (file, response) { document.getElementById(\"page-notification\").innerHTML = response; document.getElementById(\"page-notification\").style[\"display\"] = \"block\"; } - }")]]) + }")]])]) (defn upload-xls [{:keys [identity] :as request}] @@ -194,8 +189,23 @@ (if (= :post request-method) (upload-xls request) (base-page - request - (page*) - - (admin-side-bar matched-route)))) + request + (com/page {:nav (com/admin-aside-nav) + :active-client (:client (:session request)) + :identity (:identity request) + :app-params {:hx-get (bidi/path-for ssr-routes/only-routes + :admin-ezcater-xls) + :hx-trigger "clientSelected from:body" + :hx-select "#app-contents" + :hx-swap "outerHTML swap:300ms"}} + (com/breadcrumbs {} + [:a {:href (bidi/path-for ssr-routes/only-routes + :admin)} + "Admin"] + [:a {:href (bidi/path-for ssr-routes/only-routes + :admin-ezcater-xls)} + "EZCater XLS Import"]) + (page*)) + + "EZCater upload"))) diff --git a/src/clj/auto_ap/routes/utils.clj b/src/clj/auto_ap/routes/utils.clj index ee803775..f8747c9d 100644 --- a/src/clj/auto_ap/routes/utils.clj +++ b/src/clj/auto_ap/routes/utils.clj @@ -8,30 +8,33 @@ (defn wrap-secure [handler] (fn [request] (cond (authenticated? request) - (handler request) + (handler request) + (get (:headers request) "hx-request") + {:status 401 + :headers {"hx-redirect" (str "/login?" + (url/map->query {"redirect-to" (:uri request)}))}} - (get (:headers request) "hx-request") - {:status 401 - :headers {"hx-redirect" "/login"}} - - :else - {:status 302 - :headers {"Location" "/login" }}))) + :else + {:status 302 + :headers {"Location" (str "/login?" + (url/map->query {"redirect-to" (:uri request)}))}}))) (defn wrap-admin [handler] (fn [request] (if (is-admin? (:identity request)) (handler request) - (do + (do (alog/warn ::unauthenticated) {:status 302 - :headers {"Location" "/login"}})))) + :headers {"Location" (str "/login?" + (url/map->query {"redirect-to" (:uri request)}))}})))) (defn wrap-client-redirect-unauthenticated [handler] (fn [request] (let [response (handler request)] (if (= 401 (get response :status)) - (-> response - (assoc-in [:headers "hx-redirect"] "/login/")) + (-> response + (assoc-in [:headers "hx-redirect"] (str "/login?" + (url/map->query {"redirect-to" (:uri request)})))) response)))) diff --git a/src/clj/auto_ap/solr.clj b/src/clj/auto_ap/solr.clj index b1d3dcc8..18b535f2 100644 --- a/src/clj/auto_ap/solr.clj +++ b/src/clj/auto_ap/solr.clj @@ -206,3 +206,34 @@ (index-documents impl index [i]))) +(defrecord InMemSolrClient [data-set-atom] + SolrClient + (index-documents [this index xs] + (swap! data-set-atom + (fn [data-set] + (reduce + (fn [data-set x] + (let [thing (datomic->solr x)] + (update data-set index conj [(str/join " " (vals x)) thing]))) + data-set + xs))) + nil) + + (index-documents-raw [this index xs] + (swap! data-set-atom + (fn [data-set] + (reduce + (fn [data-set x] + (update data-set index conj [(str/join " " (vals x)) x])) + data-set + xs)))) + + (query [this index q] + (filter + (fn [[x e]] + (str/includes? x (get q "query"))) + (get @data-set-atom index))) + (delete [this index] + (swap! data-set-atom dissoc index))) + + diff --git a/src/clj/auto_ap/ssr/admin.clj b/src/clj/auto_ap/ssr/admin.clj deleted file mode 100644 index 0aad7c9d..00000000 --- a/src/clj/auto_ap/ssr/admin.clj +++ /dev/null @@ -1,200 +0,0 @@ -(ns auto-ap.ssr.admin - (:require - [auto-ap.datomic :refer [conn]] - [auto-ap.logging :as alog] - [auto-ap.shared-views.admin.side-bar :refer [admin-side-bar]] - [auto-ap.ssr.ui :refer [base-page]] - [auto-ap.ssr.utils :refer [html-response]] - [auto-ap.time :as atime] - [clj-time.coerce :as coerce] - [clojure.string :as str] - [datomic.api :as dc] - [hiccup2.core :as hiccup])) - -(defn tx-rows->changes [history] - (->> history - (group-by (fn [[a _ t]] - [a t])) - (map (fn [[[a t] changes]] - (let [changes (-> (reduce - (fn [acc [_ v _ added]] - (if added - (assoc acc :added v) - (assoc acc :removed v))) - {} - changes))] - [t a changes]))))) - -(def error-script - (hiccup/raw "on htmx:responseError from me set event.detail.target's innerHTML to event.detail.xhr.responseText end")) - -(defn format-value [v] - (cond (inst? v) - (-> v - coerce/to-date-time - atime/localize - (atime/unparse atime/normal-date)) - - (nil? v) - [:em "(none)"] - - (and (integer? v) - (> v 1000000)) - [:span - [:a {:hx-get (str "/admin/history/" v) - :hx-swap "innerHTML" - :hx-push-url "true" - :hx-target "#history-table"} - v] - " [" [:a - {:hx-get (str "/admin/history/inspect/" v) - :hx-swap "innerHTML" - :hx-target "#inspector" - :hx-trigger "click" - "_" error-script} - "snapshot"] "]"] - - - :else - (pr-str v))) - -(defn page-template [& {:keys [table entity-id]}] - [:div - [:div.columns - [:div.column.is-4 - [:form {"hx-target" "#history-table" - "hx-post" "/admin/history/search" - "hx-swap" "innerHTML" - "_" (hiccup/raw "on htmx:beforeRequest toggle @disabled on me then toggle .is-loading on <#dig/> end - on htmx:afterRequest toggle @disabled on me then toggle .is-loading on <#dig /> end") - } - [:div.field.is-grouped - [:p.control {} - [:input.input {:type "text" :name "entity-id" :placeholder "Entity id" :value entity-id}]] - [:p.control - [:button#dig.button.is-primary {} - "Dig"]]]]]] - [:div#history-table - table]]) - -(defn table [entity-id best-guess-entity history] - [:div [:h1.title "History for " - (str/capitalize best-guess-entity) - " " - entity-id] - [:div.columns - [:div.column.is-9 - [:table.table.compact.grid {:style "width: 100%"} - [:thead - [:tr - [:td {:style "width: 14em"} "Date"] - [:td {:style "width: 14em"} "User"] - [:td {:style "width: 18em"} "Field"] - [:td "From"] - [:td "To"]]] - [:tbody - (for [[tx a c] history] - [:tr - [:td [:div [:div (some-> (:db/txInstant tx) - coerce/to-date-time - atime/localize - (atime/unparse atime/standard-time)) - ] - [:div.tag (:db/id tx)]]] - [:td (str (:audit/user tx))] - [:td (namespace a) ": " (name a)] - - [:td - [:div.tag.is-danger.is-light - [:span - (format-value (:removed c))]]] - [:td - [:div.tag.is-primary.is-light - [:span - (format-value (:added c))]]]])] - ]] - [:div.column.is-3 - [:div#inspector]]]]) - -(defn history-search [{:keys [form-params params] :as request}] - (try - (let [entity-id (Long/parseLong (or (some-> (:entity-id form-params) not-empty) - (:entity-id params) - (get params "entity-id") - (get form-params "entity-id"))) - history (->> - (dc/q '[:find ?a2 ?v (pull ?tx [:db/txInstant :audit/user :db/id]) ?ad - :in $ $$ ?i - :where - [$$ ?i ?a ?v ?tx ?ad] - [$ ?a :db/ident ?a2]] - (dc/db conn) - (dc/history (dc/db conn)) - entity-id ) - tx-rows->changes - (sort-by (comp :db/id first)) - vec) - best-guess-entity (or (->> history - (group-by - (comp - namespace - second) - ) - (map (fn [[k v]] - [k v])) - (sort-by second) - last - first) - "?")] - - (if (get (:headers request) "hx-request") - (html-response - (table entity-id best-guess-entity history)) - (base-page request (page-template :table (table entity-id best-guess-entity history) - :entity-id entity-id) - (admin-side-bar :admin-history)))) - (catch NumberFormatException _ - (html-response - [:div.notification.is-danger.is-light - "Cannot parse the entity-id " (or (:entity-id form-params) - (:entity-id params)) - - ". It should be a number."])))) - -(defn inspect [{{:keys [entity-id]} :params :as request}] - (alog/info ::inspect - :request request) - (try - (let [entity-id (Long/parseLong entity-id) - data (dc/pull (dc/db conn) - '[*] - entity-id)] - - (html-response - [:div.box {:style {:position "sticky" - :display "inline-block" - :vertical-align "top" - :overflow-y "auto" - :max-height "100vh" - :top "0px" - :bottom "0px"}} - [:div {:style {:display "inline-block"}} - [:h1.title "Snapshot of " - entity-id] - [:ul - (for [[k v] data] - [:li [:strong k] ":" (format-value v)] - )]]])) - (catch NumberFormatException _ - (html-response - [:div.notification.is-danger.is-light - "Cannot parse the entity-id " entity-id ". It should be a number."])))) - -(defn history [{:keys [matched-route] :as request}] - (base-page request - (page-template ) - (admin-side-bar matched-route))) - - - - diff --git a/src/clj/auto_ap/ssr/admin/history.clj b/src/clj/auto_ap/ssr/admin/history.clj new file mode 100644 index 00000000..f1796a6f --- /dev/null +++ b/src/clj/auto_ap/ssr/admin/history.clj @@ -0,0 +1,190 @@ +(ns auto-ap.ssr.admin.history + (:require + [auto-ap.datomic :refer [conn]] + [auto-ap.logging :as alog] + [auto-ap.ssr.ui :refer [base-page]] + [auto-ap.ssr.utils :refer [html-response]] + [auto-ap.time :as atime] + [clj-time.coerce :as coerce] + [clojure.string :as str] + [datomic.api :as dc] + [auto-ap.ssr.components :as com] + [auto-ap.ssr-routes :as ssr-routes] + [bidi.bidi :as bidi])) + +(defn tx-rows->changes [history] + (->> history + (group-by (fn [[a _ t]] + [a t])) + (map (fn [[[a t] changes]] + (let [changes (-> (reduce + (fn [acc [_ v _ added]] + (if added + (assoc acc :added v) + (assoc acc :removed v))) + {} + changes))] + [t a changes]))))) + +(defn format-value [v] + (cond (inst? v) + (-> v + coerce/to-date-time + atime/localize + (atime/unparse atime/normal-date)) + + (nil? v) + [:em "(none)"] + + (and (integer? v) + (> v 1000000)) + [:span + (com/link + {:href "#" + :hx-get (str "/admin/history/" v) + :hx-swap "innerHTML" + :hx-push-url "true" + :hx-select "#history-table" + :hx-target "#history-table"} + v) + " [" + (com/link + {:href "#" + :hx-get (str "/admin/history/inspect/" v) + :hx-swap "innerHTML" + :hx-target "#inspector" + :hx-trigger "click"} + "snapshot") "]"] + + :else + (pr-str v))) + + +(defn inspect [{{:keys [entity-id]} :params :as request}] + (alog/info ::inspect + :request request) + (try + (let [entity-id (Long/parseLong entity-id) + data (dc/pull (dc/db conn) + '[*] + entity-id)] + + (html-response + [:section.py-3.sm:py-5.max-w-lg + (com/card {:class "p-2"} + [:div {:style {:display "inline-block"}} + [:h1.title "Snapshot of " + entity-id] + [:ul + (for [[k v] data] + [:li [:strong k] ":" (format-value v)])]])])) + (catch NumberFormatException _ + (html-response + [:div.notification.is-danger.is-light + "Cannot parse the entity-id " entity-id ". It should be a number."])))) + +(defn result-table [{:keys [entity-id]}] + (try + (let [history (->> + (dc/q '[:find ?a2 ?v (pull ?tx [:db/txInstant :audit/user :db/id]) ?ad + :in $ $$ ?i + :where + [$$ ?i ?a ?v ?tx ?ad] + [$ ?a :db/ident ?a2]] + (dc/db conn) + (dc/history (dc/db conn)) + entity-id) + tx-rows->changes + (sort-by (comp :db/id first)) + vec) + best-guess-entity (or (->> history + (group-by + (comp + namespace + second)) + (map (fn [[k v]] + [k v])) + (sort-by second) + last + first) + "?")] + (com/data-grid-card {:id "history-table" + :title (format "History for %s: %d" (str/capitalize best-guess-entity) entity-id) + :route :history-table + :paginate? false + :total (count history) + :subtitle nil + :action-buttons nil + :rows (for [[tx a c] history] + (com/data-grid-row + {} + (com/data-grid-cell {} [:div [:div (some-> (:db/txInstant tx) + coerce/to-date-time + atime/localize + (atime/unparse atime/standard-time))] + [:div.tag (:db/id tx)]]) + (com/data-grid-cell {} (str (:audit/user tx))) + (com/data-grid-cell {} (namespace a) ": " (name a)) + + (com/data-grid-cell {} + (com/pill {:color :red} + (format-value (:removed c)))) + (com/data-grid-cell {} + [:div.tag.is-primary.is-light + [:span + (format-value (:added c))]]))) + :headers + [(com/data-grid-header {} + "Date") + (com/data-grid-header {} + "User") + (com/data-grid-header {} + "Field") + (com/data-grid-header {} + "From") + (com/data-grid-header {} + "To")]})) + (catch NumberFormatException e + (throw e)))) + +(defn search-box [{:keys [entity-id]}] + [:div.mt-4 + [:form.flex.gap-2 {"hx-target" "#history-table" + "hx-get" (bidi/path-for ssr-routes/only-routes + :admin-history) + "hx-select" "#history-table" + "hx-swap" "innerHTML" + "hx-ext" "debug" + "hx-push-url" "true"} + (com/text-input {:name "entity-id" :placeholder "Entity Id" :value entity-id + :style {:width "300px"}}) + (com/button {:color :primary} + "DIG")]]) + +(defn page [{:keys [matched-route route-params query-params] :as request}] + (let [entity-id (or (some-> query-params (get "entity-id") Long/parseLong) + (some-> route-params (get :entity-id) Long/parseLong))] + (base-page request + (com/page {:nav (com/admin-aside-nav) + :active-client (:client (:session request)) + :identity (:identity request) + :app-params {:hx-get (bidi/path-for ssr-routes/only-routes + :admin-history) + :hx-trigger "clientSelected from:body" + :hx-select "#app-contents" + :hx-swap "outerHTML swap:300ms"}} + (com/breadcrumbs {} + [:a {:href (bidi/path-for ssr-routes/only-routes + :admin)} + "Admin"] + [:a {:href (bidi/path-for ssr-routes/only-routes + :admin-history)} + "History"]) + (search-box {:entity-id entity-id}) + [:div.flex.gap-4.flex-col.lg:flex-row + (if entity-id + (result-table {:entity-id entity-id}) + [:div#history-table]) + [:div#inspector] + ]) + "History"))) diff --git a/src/clj/auto_ap/ssr/company.clj b/src/clj/auto_ap/ssr/company.clj new file mode 100644 index 00000000..d3b657ab --- /dev/null +++ b/src/clj/auto_ap/ssr/company.clj @@ -0,0 +1,67 @@ +(ns auto-ap.ssr.company + (:require + [auto-ap.datomic :refer [conn]] + [auto-ap.datomic.clients :refer [full-read]] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.svg :as svg] + [auto-ap.ssr.ui :refer [base-page]] + [cemerick.url :as url] + [config.core :refer [env]] + [datomic.api :as dc] + [auto-ap.ssr-routes :as ssr-routes] + [bidi.bidi :as bidi])) + +(defn please-select-client-screen* [] + [:div.grid.grid-cols-3 + (com/content-card {} + [:div.col-span-1.p-4 {:class "p-4 sm:p-6"} + [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"} + "Please select a company"] + ])]) + +(defn main-content* [{:keys [client]}] + (if-not client + (please-select-client-screen*) + (let [client (dc/pull (dc/db conn) full-read (:db/id client))] + [:div.grid.grid-cols-3.gap-4 + (com/content-card {} + [:div.col-span-1.p-4 {:class "p-4 sm:p-6"} + [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"} + (:client/name client)] + (when-let [address (-> client :client/address)] + [:div.flex.flex-col.gap-1.text-lg.dark:text-white.text-gray-700 + [:p (-> address :address/street1)] + [:p (-> address :address/street2)] + [:p (-> address :address/city) " " + (-> address :address/state) ", " + (-> address :address/zip)]])] + ) + (com/content-card {} + [:div.col-span-1.p-4 {:class "p-4 sm:p-6"} + [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"} + "Downloads"] + [:a {:href (str (assoc (url/url (str (:base-url env) "/api/vendors/company/export")) + :query {"client" (:client/code client)}))} + (com/button {:color :primary} + "Download vendor list" + (com/button-icon {} svg/download))]])]))) + +(defn page [{:keys [identity matched-route] :as request}] + (base-page + request + (com/page {:nav (com/company-aside-nav) + :active-client (:client (:session request)) + :identity (:identity request) + :app-params { + :hx-get (bidi/path-for ssr-routes/only-routes + :company) + :hx-trigger "clientSelected from:body" + :hx-select "#app-contents" + :hx-swap "outerHTML swap:300ms"}} + (com/breadcrumbs {} + [:a {:href (bidi/path-for ssr-routes/only-routes + :company)} + "My Company"]) + (main-content* {:client (:client (:session request))})) + "My Company")) + diff --git a/src/clj/auto_ap/ssr/company/company_1099.clj b/src/clj/auto_ap/ssr/company/company_1099.clj index 85ba0041..f254666d 100644 --- a/src/clj/auto_ap/ssr/company/company_1099.clj +++ b/src/clj/auto_ap/ssr/company/company_1099.clj @@ -1,367 +1,325 @@ (ns auto-ap.ssr.company.company-1099 (:require - [auto-ap.datomic :refer [conn remove-nils]] - [auto-ap.graphql.utils :refer [is-admin?]] - [iol-ion.query :refer [can-see-client?]] - [auto-ap.shared-views.company.sidebar :refer [company-side-bar]] + [auto-ap.datomic :refer [apply-pagination-raw conn remove-nils]] + [auto-ap.graphql.utils :refer [assert-can-see-client is-admin?]] [auto-ap.ssr-routes :as ssr-routes] - [auto-ap.ssr.ui :refer [base-page]] - [auto-ap.ssr.utils :refer [html-response]] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.grid-page-helper :as helper] + [auto-ap.ssr.svg :as svg] + [auto-ap.ssr.utils :refer [form-data->map html-response path->name]] [bidi.bidi :as bidi] + [cemerick.url :as url] [clojure.string :as str] [datomic.api :as dc] - [hiccup2.core :as hiccup])) + [iol-ion.query :refer [can-see-client?]])) +(def vendor-read '[:db/id + :vendor/name + {:vendor/legal-entity-1099-type [:db/ident]} + {:vendor/legal-entity-tin-type [:db/ident]} + {:vendor/address [:address/street1 + :address/city + :address/state + :address/zip]} + :vendor/legal-entity-tin + :vendor/legal-entity-name + :vendor/legal-entity-first-name + :vendor/legal-entity-middle-name + :vendor/legal-entity-last-name]) +(defn sum-for-client-vendor [client-id vendor-id] + (ffirst (dc/q '[:find + (sum ?a) + :with ?d + :in $ ?c ?v + :where + [?p :payment/client ?c] + [?p :payment/date ?d ] + [(>= ?d #inst "2022-01-01T08:00")] + [(< ?d #inst "2023-01-01T08:00")] + [?p :payment/type :payment-type/check] + [?p :payment/amount ?a] + [?p :payment/vendor ?v]] + (dc/db conn) + client-id + vendor-id))) -(defn get-1099-companies [user session] +(defn get-1099-companies [user {:keys [client-id] :as args}] (let [clients (->> (dc/q '[:find ?c - :in $ ?user - :where [?c :client/code] - [(iol-ion.query/can-see-client? ?user ?c)]] - (dc/db conn) user) + :in $ ?user + :where [?c :client/code] + [(iol-ion.query/can-see-client? ?user ?c)]] + (dc/db conn) user) (map first) set) results (cond - (and (some-> session :client :db/id) - (can-see-client? user - (some-> session :client :db/id))) + (and client-id + (can-see-client? user client-id)) (dc/q '[:find - (pull ?c [:client/code :db/id]) - (pull ?v [:db/id - :vendor/name - {:vendor/legal-entity-1099-type [:db/ident]} - {:vendor/legal-entity-tin-type [:db/ident]} - {:vendor/address [:address/street1 - :address/city - :address/state - :address/zip]} - :vendor/legal-entity-tin - :vendor/legal-entity-name - :vendor/legal-entity-first-name - :vendor/legal-entity-middle-name - :vendor/legal-entity-last-name]) - (sum ?a) - :with ?d - :in $ ?c - :where - [?p :payment/client ?c] - [?p :payment/date ?d ] - [(>= ?d #inst "2022-01-01T08:00")] - [(< ?d #inst "2023-01-01T08:00")] - [?p :payment/type :payment-type/check] - - [?p :payment/amount ?a] - [?p :payment/vendor ?v]] - (dc/db conn) - (some-> session :client :db/id)) + (pull ?c [:client/code :db/id]) + (pull ?v vendor-read) + (sum ?a) + :with ?d + :in $ ?c vendor-read + :where + [?p :payment/client ?c] + [?p :payment/date ?d ] + [(>= ?d #inst "2022-01-01T08:00")] + [(< ?d #inst "2023-01-01T08:00")] + [?p :payment/type :payment-type/check] + [?p :payment/amount ?a] + [?p :payment/vendor ?v]] + (dc/db conn) + client-id + vendor-read) (is-admin? user) (dc/q '[:find - (pull ?c [:client/code :db/id]) - (pull ?v [:db/id - :vendor/name - {:vendor/legal-entity-1099-type [:db/ident]} - {:vendor/legal-entity-tin-type [:db/ident]} - {:vendor/address [:address/street1 - :address/city - :address/state - :address/zip]} - :vendor/legal-entity-tin - :vendor/legal-entity-name - :vendor/legal-entity-first-name - :vendor/legal-entity-middle-name - :vendor/legal-entity-last-name]) - (sum ?a) - :with ?d - :in $ - :where - [?p :payment/date ?d ] - [(>= ?d #inst "2022-01-01T08:00")] - [(< ?d #inst "2023-01-01T08:00")] - [?p :payment/type :payment-type/check] - [?p :payment/client ?c] - [?p :payment/amount ?a] - [?p :payment/vendor ?v]] - (dc/db conn)) + (pull ?c [:client/code :db/id]) + (pull ?v vendor-read) + (sum ?a) + :with ?d + :in $ vendor-read + :where + [?p :payment/date ?d ] + [(>= ?d #inst "2022-01-01T08:00")] + [(< ?d #inst "2023-01-01T08:00")] + [?p :payment/type :payment-type/check] + [?p :payment/client ?c] + [?p :payment/amount ?a] + [?p :payment/vendor ?v]] + (dc/db conn) + vendor-read) :else (dc/q '[:find - (pull ?c [:client/code :db/id]) - (pull ?v [:db/id - :vendor/name - {:vendor/legal-entity-1099-type [:db/ident]} - {:vendor/legal-entity-tin-type [:db/ident]} - {:vendor/address [:address/street1 - :address/city - :address/state - :address/zip]} - :vendor/legal-entity-tin - :vendor/legal-entity-name - :vendor/legal-entity-first-name - :vendor/legal-entity-middle-name - :vendor/legal-entity-last-name]) - (sum ?a) - :with ?d - :in $ [?c ...] - :where - [?p :payment/client ?c] - [?p :payment/date ?d ] - [(>= ?d #inst "2022-01-01T08:00")] - [(< ?d #inst "2023-01-01T08:00")] - [?p :payment/type :payment-type/check] - - [?p :payment/amount ?a] - [?p :payment/vendor ?v]] - (dc/db conn) - clients))] - (->> results - (filter (fn [[_ _ a]] - (>= (or a 0.0) 600.0))) - (take 200) - (sort-by (fn [[client _ amount]] - [(:client/code client ) amount]))))) + (pull ?c [:client/code :db/id]) + (pull ?v vendor-read) + (sum ?a) + :with ?d + :in $ [?c ...] vendor-read + :where + [?p :payment/client ?c] + [?p :payment/date ?d ] + [(>= ?d #inst "2022-01-01T08:00")] + [(< ?d #inst "2023-01-01T08:00")] + [?p :payment/type :payment-type/check] + [?p :payment/amount ?a] + [?p :payment/vendor ?v]] + (dc/db conn) + clients + vendor-read)) + all (->> results + (filter (fn [[_ _ a]] + (>= (or a 0.0) 600.0))) + (sort-by (fn [[client _ amount]] + [(:client/code client ) amount])) + (into [])) + paginated (apply-pagination-raw args all)] + [(:entries paginated) (:count paginated)])) -(defn dialog [header content footer] - [:div.modal.is-active - [:div.modal-background {"_" (hiccup/raw "on click remove <#modal-holder div/>")}] - [:div.modal-card - [:div.modal-card-head - header] - [:div.modal-card-body - content] - [:div.modal-card-foot - footer]] - [:button.modal-close.is-large {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]]) +(def grid-page {:id "vendor-table" + :nav (com/company-aside-nav) + :id-fn (comp :db/id second) + :fetch-page (fn [user args] + (get-1099-companies user args) + #_(r/get-graphql (into args {:id user}))) + :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes + :company)} + "My Company"] -(defn table [{:keys [identity session]} & {:keys [flash-id]}] - [:div#vendor-table {:hx-get (bidi/path-for ssr-routes/only-routes - :company-1099-vendor-table - :request-method :get) - :hx-trigger "clientSelected from:body" - "_" (hiccup/raw "on htmx:beforeRequest remove in me") - :hx-swap "outerHTML swap:300ms"} - [:table.table.grid.compact.is-fullwidth - [:thead - [:tr - [:th {:style {:width "5em"}}"Client"] - [:th "Vendor Name"] - [:th "Name"] - [:th {:style {:width "9em"}} "1099 Type"] - [:th {:style {:width "8em"}} "TIN"] - [:th "Address"] - [:th "Amount Paid"] - [:th {:style {:width "10em"}}] - ]] - [:tbody - (for [[client vendor amount] (get-1099-companies identity session)] - [:tr (when (= flash-id - (:db/id vendor)) - {:class "live-added"}) - [:td (:client/code client)] - [:td (:vendor/name vendor)] - [:td (or (-> vendor :vendor/legal-entity-name not-empty) - (str (-> vendor :vendor/legal-entity-first-name) " " - (-> vendor :vendor/legal-entity-middle-name) " " - (-> vendor :vendor/legal-entity-last-name)))] - [:td (some-> vendor :vendor/legal-entity-1099-type :db/ident name)] " " - [:td - (some-> vendor :vendor/legal-entity-tin-type :db/ident name) " " - (-> vendor :vendor/legal-entity-tin)] - [:td - (-> vendor :vendor/address :address/street1) " " - (-> vendor :vendor/address :address/street2) " " - (-> vendor :vendor/address :address/city) " " - (-> vendor :vendor/address :address/state) " " - (-> vendor :vendor/address :address/zip) - [:td "$" (Math/round amount)] - [:td - [:button.button {:hx-get (bidi/path-for ssr-routes/only-routes - :company-1099-vendor-dialog - :vendor-id (:db/id vendor)) - :hx-target "#modal-holder" - :hx-swap "innerHTML"} - [:span.icon [:i.fa.fa-pencil ]]]]]])]] - [:div.container.htmx-indicator - [:div.column.is-4.is-offset-4.has-text-centered - [:div.loader.is-loading.is-active.big.is-centered]]]]) + [:a {:href (bidi/path-for ssr-routes/only-routes + :company-1099)} + "1099 Vendor Info"]] + :title "1099 Vendors" + :entity-name "Vendors" + :route :company-1099-vendor-table + :action-buttons (fn [user] + nil) + :row-buttons (fn [user e] + [(com/icon-button {:hx-get (str (bidi/path-for ssr-routes/only-routes + :company-1099-vendor-dialog + :vendor-id (:db/id (second e))) + "?" + (url/map->query {:client-id (:db/id (first e))})) + :hx-ext "debug" + :hx-target "#modal-holder" + :hx-swap "outerHTML"} + svg/pencil)]) + :headers [{:key "Client" + :name "Client" + :sort-key "client" + :render (comp :client/code first)} + {:key "vendor-name" + :name "Vendor Name" + :sort-key "vendor" + :render (fn [[_ vendor]] + [:div.flex.whitespace-nowrap.items-center.gap-4 + [:div [:div (:vendor/name vendor)] + [:div.text-sm.text-gray-400 + (or (-> vendor :vendor/legal-entity-name not-empty) + (str (-> vendor :vendor/legal-entity-first-name) " " + (-> vendor :vendor/legal-entity-middle-name) " " + (-> vendor :vendor/legal-entity-last-name)))]] + (when-let [t99-type (some-> vendor :vendor/legal-entity-1099-type :db/ident name)] + (com/pill + {:class "text-xs font-medium" + :color :primary} + (str/capitalize t99-type)) + )])} + {:key "tin" + :name "TIN" + :sort-key "tin" + :show-starting "md" + :render (fn [[_ vendor]] + [:div.flex.gap-4 + (when-let [tin (-> vendor :vendor/legal-entity-tin)] + [:span {:class "text-xs font-medium py-0.5 "} + tin]) + (when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)] + (com/pill {:class "text-xs font-medium" + :color :yellow} + (name tin-type)))] + )} + {:key "address" + :name "Address" + :sort-key "address" + :show-starting "lg" + :render (fn [[_ vendor]] + (if (-> vendor :vendor/address :address/street1) + [:div + [:div (-> vendor :vendor/address :address/street1)] " " + [:div + (-> vendor :vendor/address :address/street2)] " " + [:div + (-> vendor :vendor/address :address/city) " " + (-> vendor :vendor/address :address/state) "," + (-> vendor :vendor/address :address/zip)]] + [:p.text-sm.italic.text-gray-400 "No address"]))} + {:key "paid" + :name "Paid" + :sort-key "paid" + :render (fn [[_ _ paid]] + (com/pill {:class "text-xs font-medium" + :color :primary} + "Paid $" (Math/round paid)))}]}) -(defn form-data->map [form-data] - (reduce-kv - (fn [acc k v] - (cond (and (string? v) - (empty? v)) - acc - :else - (assoc-in acc (->> (str/split k #"_") - (mapv #(apply keyword (str/split % #"/")))) - v))) - {} - form-data)) -(defn path->name [k] - (cond (keyword? k) - (str (namespace k) "/" (name k)) +(def table* (partial helper/table* grid-page)) +(def row* (partial helper/row* grid-page)) - (seq k) - (str/join "_" (map path->name k)) - :else k)) - -(defn vendor-save [{:keys [form-params identity route-params] :as request}] - @(dc/transact conn [(remove-nils - (-> (form-data->map form-params) - (assoc :db/id (Long/parseLong (:vendor-id route-params))) - (update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type"))) - (update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))]) - (html-response - (table request :flash-id (Long/parseLong (:vendor-id route-params))))) +(defn vendor-save [{:keys [form-params identity route-params query-params] :as request}] + (let [client-id (Long/parseLong (get query-params "client-id")) + vendor-id (Long/parseLong (:vendor-id route-params))] + (assert-can-see-client identity client-id) + @(dc/transact conn [(remove-nils + (-> (form-data->map form-params) + (assoc :db/id (Long/parseLong (:vendor-id route-params))) + (update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type"))) + (update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))]) + (html-response + (row* identity [(dc/pull (dc/db conn) [:db/id :client/code] client-id) + (dc/pull (dc/db conn) vendor-read vendor-id) + (sum-for-client-vendor client-id vendor-id) + ] {:flash? true}) + :headers {"hx-trigger" "closeModal"}))) (defn vendor-dialog [request] (let [vendor (dc/pull (dc/db conn) '[* {:vendor/legal-entity-1099-type [:db/ident] - :vendor/legal-entity-tin-type [:db/ident]}] (Long/parseLong (:vendor-id (:params request))))] ;; TODO perms + :vendor/legal-entity-tin-type [:db/ident]}] (Long/parseLong (:vendor-id (:params request))))] ;; TODO perms (html-response - [:form {:hx-post (bidi/path-for ssr-routes/only-routes - :company-1099-vendor-save - :request-method :post - :vendor-id (Long/parseLong (:vendor-id (:params request)))) - :hx-target "#vendor-table" - :hx-swap "outerHTML swap:0.2s" - "_" (hiccup/raw "on htmx:afterRequest transition <#modal-holder .modal-background, #modal-holder .modal-card />'s opacity from 1.0 to 0 over 100ms then remove <#modal-holder */> ")} - (dialog - [:h4.is-4.title "Vendor 1099 Info"] - [:div - [:h3.is-3.title (:vendor/name vendor)] - - [:h4.is-4.title "Address"] - [:hr] - [:div.field - [:p.help "Street1"] - [:div.control - [:input.input.is-expanded {:type "text" - :autofocus true - :name (path->name [:vendor/address :address/street1]) - :placeholder "1700 Pennsylvania Ave" - :value (-> vendor :vendor/address :address/street1)}]]] - [:div.field - [:p.help "Street 2"] - [:div.control - [:input.input.is-expanded {:type "text" - :name (path->name [:vendor/address :address/street2]) - :placeholder "SUite 400" - :value (-> vendor :vendor/address :address/street2)}]]] - [:div.level - [:div.level-left - [:div.level-item - [:div.field - [:p.help "City"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "Cupertino" - :name (path->name [:vendor/address :address/city]) - :value (-> vendor :vendor/address :address/city)}]]]] - [:div.level-item - [:div.field - [:p.help "State"] - [:div.control - [:input.input.is-expanded {:type "text" - :style {:width "3em"} - :placeholder "CA" - :name (path->name [:vendor/address :address/state]) - :value (-> vendor :vendor/address :address/state)}]]]] - [:div.level-item - [:div.field - [:p.help "Zip"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "95014" - :name (path->name [:vendor/address :address/zip]) - :value (-> vendor :vendor/address :address/zip)}]]]]]] - [:h4.is-4.title "Legal Entity"] - [:hr] - [:div.field - [:p.help "Legal Entity Name"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "Good Restaurant LLC" - :name (path->name [:vendor/legal-entity-name]) - :value (-> vendor :vendor/legal-entity-name)}]]] - "OR" - [:div.level - [:div.level-left - [:div.level-item - [:div.field - [:p.help "First Name"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "Josh" - :name (path->name [:vendor/legal-entity-first-name]) - :value (-> vendor :vendor/legal-entity-first-name)}]]]] - [:div.level-item - [:div.field - [:p.help "Middle Name"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "Caleb" - :name (path->name [:vendor/legal-entity-middle-name]) - :value (-> vendor :vendor/legal-entity-middle-name)}]]]] - [:div.level-item - [:div.field - [:p.help "Last Name"] - [:div.control - [:input.input.is-expanded {:type "text" - :placeholder "Smith" - :name (path->name [:vendor/legal-entity-last-name]) - :value (-> vendor :vendor/legal-entity-last-name)}]]]]]] - - [:div.level - [:div.level-left - [:div.level-item - [:div.field - [:p.help "TIN"] - [:div.control - [:input.input {:type "text" - :name (path->name [:vendor/legal-entity-tin]) - :placeholder "SSN or EIN" - :size "12" - :value (-> vendor :vendor/legal-entity-tin)}]]]] - [:div.level-item - [:div.field - [:p.help "TIN Type"] - [:div.control - [:div.select - [:select {:name (path->name [:vendor/legal-entity-tin-type])} - [:option {:value ""} ""] - [:option {:value "ein" :selected (= (-> vendor :vendor/legal-entity-tin-type :db/ident) :legal-entity-tin-type/ein)} "EIN"] - [:option {:value "ssn" :selected (= (-> vendor :vendor/legal-entity-tin-type :db/ident) :legal-entity-tin-type/ssn)} "SSN"]]]]]] - [:div.level-item - [:div.field - [:p.help "1099 Type"] - [:div.control - [:div.select - [:select {:name (path->name [:vendor/legal-entity-1099-type])} - [:option {:value ""} ""] - [:option {:value "none" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/none)} "None"] - [:option {:value "misc" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/misc)} "Misc"] - [:option {:value "landlord" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/landlord)} "Landlord"]]]]]]]]] - [:button.button.is-primary.htmx-indicator "Save"])]))) - -(defn vendor-table [request] - (html-response (table request))) - -(defn page [{:keys [identity matched-route] :as request}] - (base-page - request - [:div - [:div#vendor-table {:hx-get (bidi/path-for ssr-routes/only-routes - :company-1099-vendor-table - :request-method :get) - :hx-trigger "load, clientSelected from:body" - :hx-swap "outerHTML swap:400ms"} - [:div.container.htmx-indicator - [:div.column.is-4.is-offset-4.has-text-centered - [:div.loader.is-loading.is-active.big.is-centered]]]]] - [:div - (company-side-bar matched-route)])) + (com/modal + {} + [:form {:hx-post (str (bidi/path-for ssr-routes/only-routes + :company-1099-vendor-save + :request-method :post + :vendor-id (Long/parseLong (:vendor-id (:params request)))) + "?" + (url/map->query {:client-id (:client-id (:params request))})) + :hx-target (format "#vendor-table tr[data-id=\"%d\"]" (:db/id vendor)) + :hx-swap "outerHTML swap:300ms"} + [:fieldset {:class "hx-disable"} + (com/modal-card + {} + [:div.flex [:div.p-2 "Vendor 1099 Info"] [:p.ml-2.rounded.bg-gray-200.p-2.dark:bg-gray-600 (:vendor/name vendor)]] + [:div.space-y-6 + [:div.grid.grid-cols-6.gap-4 + + [:h4.text-xl.border-b.col-span-6 "Address"] + [:div.col-span-6 + (com/field {:label "Street 1"} + (com/text-input {:name (path->name [:vendor/address :address/street1]) + :value (-> vendor :vendor/address :address/street1) + :placeholder "1700 Pennsylvania Ave" + :autofocus true}))] + [:div.col-span-6 + (com/field {:label "Street 2"} + (com/text-input {:name (path->name [:vendor/address :address/street2]) + :value (-> vendor :vendor/address :address/street2) + :placeholder "Suite 200"}))] + [:div.col-span-3 + (com/field {:label "City"} + (com/text-input {:name (path->name [:vendor/address :address/city]) + :value (-> vendor :vendor/address :address/city) + :placeholder "Cupertino"}))] + [:div.col-span-1 + (com/field {:label "State"} + (com/text-input {:name (path->name [:vendor/address :address/state]) + :value (-> vendor :vendor/address :address/state) + :placeholder "CA"}))] + [:div.col-span-2 + (com/field {:label "Zip"} + (com/text-input {:name (path->name [:vendor/address :address/zip]) + :value (-> vendor :vendor/address :address/zip) + :placeholder "98102"}))] + [:h4.text-xl.border-b.col-span-6 "Legal Entity"] + [:div.col-span-6 + (com/field {:label "Legal Entity Name"} + (com/text-input {:name (path->name [:vendor/legal-entity-name]) + :value (-> vendor :vendor/legal-entity-name) + :placeholder "Good Restaurant LLC"}))] + [:div.col-span-6.text-center " - OR -"] + [:div.col-span-2 + (com/field {:label "First Name"} + (com/text-input {:name (path->name [:vendor/legal-entity-first-name]) + :value (-> vendor :vendor/legal-entity-first-name) + :placeholder "John"}))] + [:div.col-span-2 + (com/field {:label "Middle Name"} + (com/text-input {:name (path->name [:vendor/legal-entity-middle-name]) + :value (-> vendor :vendor/legal-entity-middle-name) + :placeholder "C."}))] + [:div.col-span-2 + (com/field {:label "Last Name"} + (com/text-input {:name (path->name [:vendor/legal-entity-last-name]) + :value (-> vendor :vendor/legal-entity-last-name) + :placeholder "Riley"}))] + [:div.col-span-2 + (com/field {:label "TIN"} + (com/text-input {:name (path->name [:vendor/legal-entity-tin]) + :value (-> vendor :vendor/legal-entity-tin) + :placeholder "John"}))] + [:div.col-span-2 + (com/field {:label "TIN Type"} + (com/select {:name (path->name [:vendor/legal-entity-tin-type]) + :allow-blank? true + :value (some-> vendor :vendor/legal-entity-tin-type :db/ident name) + :options [["ein" "EIN"] + ["ssn" "SSN"]]}))] + [:div.col-span-2 + (com/field {:label "1099 Type"} + (com/select {:name (path->name [:vendor/legal-entity-1099-type]) + :allow-blank? true + :value (some-> vendor :vendor/legal-entity-1099-type :db/ident name) + :options [["none" "None"] + ["misc" "Misc"] + ["landlord" "Landlord"]]}))] + [:div.col-span-6 + (com/button {:color :primary} + "Save")]]] + [:div])]])))) +(def vendor-table (partial helper/table grid-page)) +(def page (partial helper/page grid-page)) diff --git a/src/clj/auto_ap/ssr/company/reports.clj b/src/clj/auto_ap/ssr/company/reports.clj new file mode 100644 index 00000000..1562dfd9 --- /dev/null +++ b/src/clj/auto_ap/ssr/company/reports.clj @@ -0,0 +1,83 @@ +(ns auto-ap.ssr.company.reports + (:require + [amazonica.aws.s3 :as s3] + [auto-ap.datomic :refer [conn]] + [auto-ap.datomic.reports :as r] + [auto-ap.graphql.utils :refer [assert-can-see-client is-admin?]] + [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.grid-page-helper :as helper] + [auto-ap.ssr.svg :as svg] + [auto-ap.ssr.utils :refer [html-response]] + [auto-ap.time :as atime] + [bidi.bidi :as bidi] + [config.core :refer [env]] + [datomic.api :as dc])) + +(def grid-page {:id "report-table" + :nav (com/company-aside-nav) + :id-fn :db/id + :fetch-page (fn [user args] + (r/get-graphql (into args {:id user}))) + :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes + :company)} + "My Company"] + + [:a {:href (bidi/path-for ssr-routes/only-routes + :company-reports)} + "Reports"]] + :title "Reports" + :entity-name "Reports" + :route :company-reports-table + :action-buttons (fn [user] + nil) + :row-buttons (fn [user e] + (com/a-icon-button {:href (:report/url e)} + svg/download)[ + (when (is-admin? user) + (com/icon-button {:hx-delete (str (bidi/path-for ssr-routes/only-routes + :company-reports-delete + :request-method :delete)) + :hx-target "closest tr"} + svg/trash))]) + :headers [{:key "name" + :name "Name" + :sort-key "name" + :render :report/name} + {:key "created-by" + :name "Created by" + :sort-key "creator" + :render (fn [report] + (when (:report/creator report) + (com/pill {:color :primary } + (:report/creator report))))} + {:key "created" + :name "Created" + :sort-key "created" + :render #(atime/unparse-local (:report/created %) + atime/normal-date)}]}) + +(def row* (partial helper/row* grid-page)) +(def table* (partial helper/table* grid-page)) +(def table (partial helper/table grid-page)) +(def page (partial helper/page grid-page)) + +(defn delete-report [{:keys [form-params identity]}] + + (let [[id-to-delete key] (first (dc/q '[:find ?i ?k + :in $ ?i + :where [?i :report/key ?k]] + (dc/db conn) + (some-> (get form-params "id") not-empty Long/parseLong))) + report (dc/pull (dc/db conn) r/default-read id-to-delete)] + (assert-can-see-client identity (:report/client report)) + (when id-to-delete + (s3/delete-object :bucket-name (:data-bucket env) + :key key) + @(dc/transact conn [[:db/retractEntity id-to-delete]])) + (html-response + (row* identity + report + {:flash? true + :delete-after-settle? true})))) + diff --git a/src/clj/auto_ap/ssr/company/yodlee.clj b/src/clj/auto_ap/ssr/company/yodlee.clj new file mode 100644 index 00000000..10cfb061 --- /dev/null +++ b/src/clj/auto_ap/ssr/company/yodlee.clj @@ -0,0 +1,123 @@ +(ns auto-ap.ssr.company.yodlee + (:require + [auto-ap.datomic :refer [conn]] + [auto-ap.datomic.yodlee2 :as yodlee2] + [auto-ap.graphql.utils :refer [is-admin?]] + [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.svg :as svg] + [auto-ap.ssr.ui :refer [base-page]] + [auto-ap.ssr.grid-page-helper :as helper] + [auto-ap.ssr.utils :refer [html-response]] + [auto-ap.time :as atime] + [auto-ap.yodlee.core2 :as yodlee] + [bidi.bidi :as bidi] + [config.core :refer [env]] + [datomic.api :as dc] + [hiccup2.core :as hiccup])) + +(def default-read '[:db/id + :yodlee-provider-account/last-updated + :yodlee-provider-account/status + :yodlee-provider-account/id + :yodlee-provider-account/detailed-status + {:yodlee-provider-account/accounts [:yodlee-account/name :yodlee-account/number] + :yodlee-provider-account/client [:client/code]}]) + + + +(defn fastlink-dialog [{:keys [session]}] + (html-response + (com/modal + {} + (com/modal-card + {} + [:div.flex [:div.p-2 "Yodlee Fastlink"] ] + [:div + [:div#fa-spot] + [:script {:lang "text/javascript"} + (hiccup/raw + (format " +fastlink.open({fastLinkURL: '%s', + accessToken: '%s', + params: {'configName': 'Aggregation'}}, + 'fa-spot'); + +" (:yodlee2-fastlink env) (yodlee/get-access-token (:client/code (:client session)))))] + ] + [:div])))) + +(def grid-page {:id "yodlee-table" + :nav (com/company-aside-nav) + :id-fn :db/id + :fetch-page (fn [user args] + (yodlee2/get-graphql (assoc args :id user))) + :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes + :company)} + "My Company"] + + [:a {:href (bidi/path-for ssr-routes/only-routes + :company-yodlee)} + "Yodlee"]] + :title "Yodlee Accounts" + :entity-name "Yodlee accounts" + :route :company-yodlee-table + :action-buttons (fn [user] + [(com/button {:color :primary + :on-click "openFastlink()" + :hx-get (bidi/path-for ssr-routes/only-routes + :company-yodlee-fastlink-dialog) + :hx-target "#modal-holder"} + (com/button-icon {} svg/refresh) + "Link new account")]) + :row-buttons (fn [user e] + [(when (is-admin? user) + (com/icon-button {:hx-put (bidi/path-for ssr-routes/only-routes + :company-yodlee-provider-account-refresh) + :hx-target "closest tr"} + svg/refresh))]) + :headers [{:key "provider-account" + :name "Provider Account" + :sort-key "provider-account" + :render :yodlee-provider-account/id} + {:key "status" + :name "Status" + :sort-key "status" + :render #(when-let [status (:yodlee-provider-account/status %)] + (com/pill {:color (if (not= status "SUCCESS") + :yellow + :primary) } + status))} + {:key "detailed-status" + :name "Detailed Status" + :sort-key "detailed-status" + :render #(when-let [status (:yodlee-provider-account/detailed-status %)] + status)} + + {:key "last-updated" + :name "Last Updated" + :sort-key "last-updated" + :render #(atime/unparse-local (:yodlee-provider-account/last-updated %) + atime/normal-date)} + {:key "accounts" + :name "Accounts" + :show-starting "md" + :render (fn [e] + [:ul + (for [a (:yodlee-provider-account/accounts e)] + [:li (:yodlee-account/name a) " - " (:yodlee-account/number a)])])}]}) + +(def page (partial helper/page grid-page)) +(def table (partial helper/table grid-page)) + +;; TODO delete-after-settle +(defn refresh-provider-account [{:keys [form-params identity]}] + (let [provider-account (dc/pull (dc/db conn) default-read (some-> (get form-params "id") not-empty Long/parseLong))] + (yodlee/refresh-provider-account (:client/code (:yodlee-provider-account/client provider-account)) + (:yodlee-provider-account/id provider-account)) + (html-response + (helper/row* + grid-page + identity + provider-account + {:flash? true})))) diff --git a/src/clj/auto_ap/ssr/company_dropdown.clj b/src/clj/auto_ap/ssr/company_dropdown.clj index 4f73a8ea..5b3a31a7 100644 --- a/src/clj/auto_ap/ssr/company_dropdown.clj +++ b/src/clj/auto_ap/ssr/company_dropdown.clj @@ -1,116 +1,142 @@ (ns auto-ap.ssr.company-dropdown (:require - [auto-ap.datomic :refer [conn]] - [auto-ap.graphql.utils :refer [assert-can-see-client]] - [iol-ion.query :refer [can-see-client?]] + [auto-ap.datomic :refer [conn pull-many]] + [auto-ap.graphql.utils :refer [assert-can-see-client cleanse-query]] + [auto-ap.solr :as solr] [auto-ap.ssr-routes :as ssr-routes] - [auto-ap.ssr.components.navbar-dropdown :refer [navbar-dropdown]] + [auto-ap.ssr.svg :as svg] [auto-ap.ssr.utils :refer [html-response]] [bidi.bidi :as bidi] [datomic.api :as dc] - [hiccup2.core :as hiccup])) + [hiccup2.core :as hiccup] + [iol-ion.query :refer [can-see-client?]])) -(defn dropdown-contents [{:keys [identity]}] - (let [options (->> (dc/q '[:find ?c ?n - :in $ ?user - :where [?c :client/name ?n] - [(iol-ion.query/can-see-client? ?user ?c)]] - (dc/db conn) - identity) - (map (fn [[k v]] - {"key" k - "value" v})))] - (html-response - [:div.navbar-dropdown {:style {:width "20em"}} - [:a.navbar-item {:hx-put (bidi/path-for ssr-routes/only-routes - :active-client - :request-method :put) - :hx-target "#company-dropdown" - :hx-swap "outerHTML" - :hx-trigger "click"} - "All"] - [:hr.navbar-divider] - [:input#company-search.input.navbar-item {:placeholder "Company name" - :name "search-text" - :autoFocus true} ] - [:input#company-search-value {:type "hidden" - :autocomplete "off" - :name "search-client" - :hx-put (bidi/path-for ssr-routes/only-routes - :active-client - :request-method :put) - :hx-target "#company-dropdown" - :hx-swap "outerHTML" - :hx-trigger "change"} ] - [:script - (hiccup/raw - (str " -var z = new autoComplete({ - selector:\"#company-search\", - placeholder: \"Company Name....\", - data: { - keys: [\"value\"], - src: " (cheshire.core/encode - options) +(defn dropdown-search-results* [{:keys [options]}] + [:ul + (for [{:keys [id name]} options] + [:li + [:div {:class "flex items-center pl-2 rounded hover:bg-green-100 dark:hover:bg-green-600"} - " - }, - resultItem: { - highlight:true, - class: \"autocomplete-suggestion\", - selected: \"highlighted\" + [:a {:href "#" :class "w-full py-2 ml-2 text-sm font-medium text-gray-900 rounded dark:text-gray-300" + "_" (hiccup/raw "on click set value of <#company-search-value/> to @data-value then send selected to #company-dropdown") + :data-value id} + name]]])]) - }, - resultsList: { - tabSelect: true - }, - submit: true -}); -z.input.addEventListener(\"selection\", function (event) { - z.input.blur(); - z.input.value = event.detail.selection.value.value; -document.getElementById(\"company-search-value\").value= event.detail.selection.value.key; -document.getElementById(\"company-search-value\").dispatchEvent(new Event('change')); -}); -"))]]))) +(defn get-clients [identity query] + (if-let [query (not-empty (cleanse-query query))] + (let [search-query (str "name:(" query ")")] -(defn dropdown [request] + (for [n (pull-many (dc/db conn) [:client/name :db/id] + (for [{:keys [id name]} (solr/query solr/impl "clients" {"query" search-query + "fields" "id, name"}) + :let [client-id (Long/parseLong id)] + :when (can-see-client? identity client-id)] + client-id))] + {:id (:db/id n) + :name (:client/name n)})) + [])) - (let [client (get-in request [:session :client])] +(defn dropdown-search-results [{:keys [identity] :as request}] + (html-response + (dropdown-search-results* {:options (get-clients identity (get (:query-params request) "search-text")) + :client (:client (:session request))}))) - (navbar-dropdown - "company-dropdown" - [:span - (if client - (str "Company: " (:client/name client)) - "Company") - [:script - (hiccup/raw - "localStorage.setItem(\"last-client-id\", \""(:db/id client)"\")")]] - [:div {:hx-get - (bidi/path-for ssr-routes/only-routes - :company-dropdown-contents) - :hx-swap "outerHTML" - :hx-trigger "intersect delay:150ms" - :hx-target "closest .navbar-dropdown" - :style {:width "20em" - :height "80px"} - } - [:div.loader.is-loading.is-active.is-centered]]))) +(defn dropdown [{:keys [client]}] + [:div#company-dropdown + {:hx-put (bidi/path-for ssr-routes/only-routes + :active-client + :request-method :put) + :hx-target "#company-dropdown" + :hx-include "#company-search-value" + :hx-swap "outerHTML" + :hx-trigger "selected"} + [:script + (hiccup/raw + "localStorage.setItem(\"last-client-id\", \""(:db/id client)"\")")] + [:div + [:button#company-dropdown-button { :class "text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2.5 text-center inline-flex items-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800" + :type "button"} + (if client + (:client/name client) + "All Companies") + [:div.w-4.h-4.ml-2 + svg/drop-down]] + [:div#company-dropdown-list.hidden {"_" (hiccup/raw "init call initCompanyDropdown()") + } + [:div {:class "z-10 bg-white rounded-lg shadow w-64 dark:bg-gray-700 slide-up duration-500 transition-all"} + [:div {:class "p-3"} + [:label {:for "input-group-search", :class "sr-only"} "Search"] + [:div {:class "relative"} + [:div {:class "absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none"} + [:div.w-5.h-5.text-gray-500.dark:text-gray-400 + svg/search]] + [:input#company-search {:placeholder "Company name" + :name "search-text" + :class "block w-full p-2 pl-10 text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + :autoFocus true + :tab-index -1 + :hx-trigger "keyup changed delay:500ms, search" + :hx-get (bidi/path-for ssr-routes/only-routes + :company-dropdown-search-results) + :hx-target "#company-search-results" + :hx-swap "innerHTML"} ]] + [:input#company-search-value {:type "hidden" + :name "search-client"}]] + [:div.divide-y.divide-gray-100 + [:div#company-search-results {:class "h-48 px-3 pb-3 overflow-y-auto text-sm text-gray-700 dark:text-gray-200"}] + [:div {:class "flex items-center pl-2 rounded hover:bg-green-100 dark:hover:bg-green-600"} + + [:button {:class "w-full py-2 ml-2 text-sm font-medium text-gray-900 rounded dark:text-gray-300" + :hx-put (bidi/path-for ssr-routes/only-routes + :active-client + :request-method :put) + :hx-target "#company-dropdown" + :hx-swap "outerHTML" + :hx-trigger "click"} + "All"]]] + ]] + [:script {:lang "text/javascript"} + (hiccup/raw + " +function initCompanyDropdown() { + var $dropdownTargetEl = document.getElementById('company-dropdown-list'); + + // set the element that trigger the dropdown menu on click + var $dropdownTriggerEl = document.getElementById('company-dropdown-button'); + + var dropdownOptions = { + placement: 'bottom', + triggerType: 'click', + offsetSkidding: 0, + offsetDistance: 10, + delay: 300, + onHide: () => { + }, + onShow: () => { + document.getElementById('company-search').focus() + }, + onToggle: () => { + } + }; + var companyDrowdown = new Dropdown($dropdownTargetEl, $dropdownTriggerEl, dropdownOptions); +} +")]]]) (defn active-client [{:keys [identity params] :as request}] (let [client-id (some-> (or (:search-client params) (get params "search-client")) not-empty Long/parseLong)] + (println (format "HERE CLIENT ID '%s'" client-id)) (when client-id (assert-can-see-client identity client-id)) (let [new-session (assoc (:session request) :client (when client-id (dc/pull (dc/db conn) [:db/id :client/name :client/code] client-id)))] - (assoc - (html-response - (dropdown (assoc request :session new-session))) - :session - new-session - :headers - {"hx-trigger" "clientSelected"})))) + (assoc + (html-response + (dropdown {:client (:client new-session) + :identity identity})) + :session + new-session + :headers + {"hx-trigger" "clientSelected"})))) diff --git a/src/clj/auto_ap/ssr/components.clj b/src/clj/auto_ap/ssr/components.clj new file mode 100644 index 00000000..0225dfe9 --- /dev/null +++ b/src/clj/auto_ap/ssr/components.clj @@ -0,0 +1,56 @@ +(ns auto-ap.ssr.components + (:require [auto-ap.ssr.components.breadcrumbs :as breadcrumbs] + [auto-ap.ssr.components.buttons :as buttons] + [auto-ap.ssr.components.dialog :as dialog] + [auto-ap.ssr.components.inputs :as inputs] + [auto-ap.ssr.components.aside :as aside] + [auto-ap.ssr.components.card :as card] + [auto-ap.ssr.components.navbar :as navbar] + [auto-ap.ssr.components.page :as page] + [auto-ap.ssr.components.data-grid :as data-grid] + [auto-ap.ssr.components.tags :as tags] + [auto-ap.ssr.components.paginator :as paginator])) + + +(def breadcrumbs breadcrumbs/breadcrumbs-) +(def button buttons/button-) +(def button-icon buttons/button-icon-) +(def icon-button buttons/icon-button-) +(def a-icon-button buttons/a-icon-button-) +(def modal dialog/modal-) +(def modal-card dialog/modal-card-) + +(def text-input inputs/text-input-) +(def select inputs/select-) +(def field inputs/field-) + +(def left-aside aside/left-aside-) +(def company-aside-nav aside/company-aside-nav-) +(def admin-aside-nav aside/admin-aside-nav-) +(def main-aside-nav aside/main-aside-nav-) +(def content-card card/content-card-) +(def card card/card-) + +(def navbar navbar/navbar-) + +(def page page/page-) + +(def pill tags/pill-) + +(def data-grid data-grid/data-grid-) +(def data-grid-header data-grid/header-) +(def data-grid-sort-header data-grid/sort-header-) +(def data-grid-row data-grid/row-) +(def data-grid-cell data-grid/cell-) +(def data-grid-right-stack-cell data-grid/right-stack-cell-) + +(defn link [params & children] + (into [:a (update params :class str " font-medium text-blue-600 dark:text-blue-500 hover:underline ")] + children)) + + + + +(def paginator paginator/paginator-) +(def data-grid-card data-grid/data-grid-card-) + diff --git a/src/clj/auto_ap/ssr/components/aside.clj b/src/clj/auto_ap/ssr/components/aside.clj new file mode 100644 index 00000000..5a885d99 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/aside.clj @@ -0,0 +1,326 @@ +(ns auto-ap.ssr.components.aside + (:require [auto-ap.ssr.svg :as svg] + [hiccup2.core :as hiccup] + [bidi.bidi :as bidi] + [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.client-routes :as client-routes])) + +(defn menu-button- [params & children] + [:div + [:a (-> params + (dissoc :icon) + (assoc :type "button") + (update :class str " cursor-pointer flex items-center p-2 w-full text-sm text-gray-600 rounded-lg transition duration-75 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700") + (assoc :hx-indicator "find .htmx-indicator") + (assoc :hx-select "#app-contents") + (assoc :hx-target "#app-contents") + (assoc :hx-swap "outerHTML")) + + (when (:icon params) + [:span {:class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 group-hover:text-blue-500 dark:text-gray-400 group-hover:scale-110 dark:group-hover:text-white mr-3"} + (:icon params)]) + + (into [:span {:class "flex-1 text-left whitespace-nowrap text-gray-600 dark:text-white"}] children) + (when (:data-collapse-toggle params) + [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:fill-rule "evenodd", :d "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", :clip-rule "evenodd"}]]) + [:div.htmx-indicator.flex.items-center + (svg/spinner-primary {:class "inline w-4 h-4 text-white"})]]]) + +(defn sub-menu- [params & children] + [:ul {:id (:id params) :class "hidden py-2 space-y-2"} + (for [c children] + [:li + (update-in c [1 1 :class ] str " flex items-center p-2 pl-11 w-full text-base font-normal text-gray-900 rounded-lg transition duration-75 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700")])]) + +(defn left-aside- [{:keys [nav page-specific]} & children] + [:aside {:id "left-nav", :class "fixed top-0 left-0 pt-16 z-20 w-64 h-screen transition-transform -translate-x-full lg:translate-x-0", :aria-labelledby "left-nav" :aria-hidden "true" + "_" (hiccup/raw "init call initSidebarToggle()")} + + [:div {:class "overflow-y-auto py-5 px-3 h-full bg-gray-50 border-r border-gray-200 dark:bg-gray-800 dark:border-gray-700"} + nav + + [:ul {:class "pt-5 mt-5 space-y-2 border-t border-gray-200 dark:border-gray-700"} + #_[:li + [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"} + [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"}] + [:path {:fill-rule "evenodd", :d "M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z", :clip-rule "evenodd"}]] + [:span {:class "ml-3"} "Docs"]]] + #_[:li + [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"} + [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M7 3a1 1 0 000 2h6a1 1 0 100-2H7zM4 7a1 1 0 011-1h10a1 1 0 110 2H5a1 1 0 01-1-1zM2 11a2 2 0 012-2h12a2 2 0 012 2v4a2 2 0 01-2 2H4a2 2 0 01-2-2v-4z"}]] + [:span {:class "ml-3"} "Components"]]] + #_[:li + [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"} + [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:fill-rule "evenodd", :d "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-2 0c0 .993-.241 1.929-.668 2.754l-1.524-1.525a3.997 3.997 0 00.078-2.183l1.562-1.562C15.802 8.249 16 9.1 16 10zm-5.165 3.913l1.58 1.58A5.98 5.98 0 0110 16a5.976 5.976 0 01-2.516-.552l1.562-1.562a4.006 4.006 0 001.789.027zm-4.677-2.796a4.002 4.002 0 01-.041-2.08l-.08.08-1.53-1.533A5.98 5.98 0 004 10c0 .954.223 1.856.619 2.657l1.54-1.54zm1.088-6.45A5.974 5.974 0 0110 4c.954 0 1.856.223 2.657.619l-1.54 1.54a4.002 4.002 0 00-2.346.033L7.246 4.668zM12 10a2 2 0 11-4 0 2 2 0 014 0z", :clip-rule "evenodd"}]] + [:span {:class "ml-3"} "Help"]]]] + page-specific] + #_[:div {:class "hidden absolute bottom-0 left-0 justify-center p-4 space-x-4 w-full lg:flex bg-white dark:bg-gray-800 z-20 border-r border-gray-200 dark:border-gray-700"} + [:a {:href "#", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-600"} + [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M5 4a1 1 0 00-2 0v7.268a2 2 0 000 3.464V16a1 1 0 102 0v-1.268a2 2 0 000-3.464V4zM11 4a1 1 0 10-2 0v1.268a2 2 0 000 3.464V16a1 1 0 102 0V8.732a2 2 0 000-3.464V4zM16 3a1 1 0 011 1v7.268a2 2 0 010 3.464V16a1 1 0 11-2 0v-1.268a2 2 0 010-3.464V4a1 1 0 011-1z"}]]] + [:a {:href "#", :data-tooltip-target "tooltip-settings", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:text-gray-400 dark:hover:text-white hover:text-gray-900 hover:bg-gray-100 dark:hover:bg-gray-600"} + [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:fill-rule "evenodd", :d "M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z", :clip-rule "evenodd"}]]] + [:div {:id "tooltip-settings", :role "tooltip", :class "inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-gray-900 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip"} "Settings page"] + [:button {:type "button", :data-dropdown-toggle "language-dropdown", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:hover:text-white dark:text-gray-400 hover:text-gray-900 hover:bg-gray-100 dark:hover:bg-gray-600"} + [:svg {:aria-hidden "true", :class "h-5 w-5 rounded-full mt-0.5", :xmlns "http://www.w3.org/2000/svg", :xmlns:xlink "http://www.w3.org/1999/xlink", :viewbox "0 0 3900 3900"} + [:path {:fill "#b22234", :d "M0 0h7410v3900H0z"}] + [:path {:d "M0 450h7410m0 600H0m0 600h7410m0 600H0m0 600h7410m0 600H0", :stroke "#fff", :stroke-width "300"}] + [:path {:fill "#3c3b6e", :d "M0 0h2964v2100H0z"}] + [:g {:fill "#fff"} + [:g {:id "d"} + [:g {:id "c"} + [:g {:id "e"} + [:g {:id "b"} + [:path {:id "a", :d "M247 90l70.534 217.082-184.66-134.164h228.253L176.466 307.082z"}] + [:use {:xlink:href "#a", :y "420"}] + [:use {:xlink:href "#a", :y "840"}] + [:use {:xlink:href "#a", :y "1260"}]] + [:use {:xlink:href "#a", :y "1680"}]] + [:use {:xlink:href "#b", :x "247", :y "210"}]] + [:use {:xlink:href "#c", :x "494"}]] + [:use {:xlink:href "#d", :x "988"}] + [:use {:xlink:href "#c", :x "1976"}] + [:use {:xlink:href "#e", :x "2470"}]]]] + [:div {:class "hidden z-50 my-4 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700", :id "language-dropdown"} + [:ul {:class "py-1", :role "none"} + [:li + [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:text-white dark:text-gray-300 dark:hover:bg-gray-600", :role "menuitem"} + [:div {:class "inline-flex items-center"} + [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-us", :viewbox "0 0 512 512"} + [:g {:fill-rule "evenodd"} + [:g {:stroke-width "1pt"} + [:path {:fill "#bd3d44", :d "M0 0h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z", :transform "scale(3.9385)"}] + [:path {:fill "#fff", :d "M0 10h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z", :transform "scale(3.9385)"}]] + [:path {:fill "#192f5d", :d "M0 0h98.8v70H0z", :transform "scale(3.9385)"}] + [:path {:fill "#fff", :d "M8.2 3l1 2.8H12L9.7 7.5l.9 2.7-2.4-1.7L6 10.2l.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7L74 8.5l-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 7.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 24.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 21.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 38.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 35.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 52.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 49.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 66.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 63.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9z", :transform "scale(3.9385)"}]]] " \n English (US)"]]] + [:li + [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-600", :role "menuitem"} + [:div {:class "inline-flex items-center"} + [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-de", :viewbox "0 0 512 512"} + [:path {:fill "#ffce00", :d "M0 341.3h512V512H0z"}] + [:path {:d "M0 0h512v170.7H0z"}] + [:path {:fill "#d00", :d "M0 170.7h512v170.6H0z"}]]]]] + [:li + [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-600", :role "menuitem"} + [:div {:class "inline-flex items-center"} + [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-it", :viewbox "0 0 512 512"} + [:g {:fill-rule "evenodd", :stroke-width "1pt"} + [:path {:fill "#fff", :d "M0 0h512v512H0z"}] + [:path {:fill "#009246", :d "M0 0h170.7v512H0z"}] + [:path {:fill "#ce2b37", :d "M341.3 0H512v512H341.3z"}]]]]]] + [:li + [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:text-white dark:text-gray-300 dark:hover:bg-gray-600", :role "menuitem"} + [:div {:class "inline-flex items-center"} + [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :xmlns:xlink "http://www.w3.org/1999/xlink", :id "flag-icon-css-cn", :viewbox "0 0 512 512"} + [:defs + [:path {:id "a", :fill "#ffde00", :d "M1-.3L-.7.8 0-1 .6.8-1-.3z"}]] + [:path {:fill "#de2910", :d "M0 0h512v512H0z"}] + [:use {:width "30", :height "20", :transform "matrix(76.8 0 0 76.8 128 128)", :xlink:href "#a"}] + [:use {:width "30", :height "20", :transform "rotate(-121 142.6 -47) scale(25.5827)", :xlink:href "#a"}] + [:use {:width "30", :height "20", :transform "rotate(-98.1 198 -82) scale(25.6)", :xlink:href "#a"}] + [:use {:width "30", :height "20", :transform "rotate(-74 272.4 -114) scale(25.6137)", :xlink:href "#a"}] + [:use {:width "30", :height "20", :transform "matrix(16 -19.968 19.968 16 256 230.4)", :xlink:href "#a"}]] "中文 (繁體)"]]]]]] + [:script {:lang "text/javascript"} + (hiccup/raw " + function initSidebarToggle() { + var $targetEl = document.getElementById('left-nav'); + + var $triggerEl = document.getElementById('left-nav-toggle'); + + var options = { + onCollapse: () => { + document.getElementById('main-content').classList.remove('lg:pl-64') + }, + onExpand: () => { + document.getElementById('main-content').classList.add('lg:pl-64') + }, + onToggle: () => { + } + }; + + var collapse = new Collapse($targetEl, $triggerEl, options); + } +")]]) + +(defn main-aside-nav- [] + [:ul {:class "space-y-2"} + + [:li + (menu-button- {:icon svg/pie + :href "/"} + "Dashboard")] + [:li + (menu-button- {:aria-controls "dropdown-invoices", + :data-collapse-toggle "dropdown-invoices" + :icon svg/accounting-invoice-mail} + "Invoices") + (sub-menu- {:id "dropdown-invoices"} + (menu-button- {:href (bidi/path-for client-routes/routes + :invoices)} + "All") + (menu-button- {:href (bidi/path-for client-routes/routes + :paid-invoices)} + "Paid") + (menu-button- {:href (bidi/path-for client-routes/routes + :unpaid-invoices)} + "Unpaid") + (menu-button- {:href (bidi/path-for client-routes/routes + :voided-invoices)} + "Voided"))] + [:li + (menu-button- {:aria-controls "dropdown-sales", + :data-collapse-toggle "dropdown-sales" + :icon svg/receipt-register-1} + "Sales") + (sub-menu- {:id "dropdown-sales"} + (menu-button- {:href (bidi/path-for client-routes/routes + :sales-orders)} "Sales") + (menu-button- {:href (bidi/path-for client-routes/routes + :expected-deposits)} "Expected Deposits") + #_(menu-button- {:href "Sales"} "Cash Shifts") + #_(menu-button- {:href "Sales"} "Tenders"))] + [:li + (menu-button- {:aria-controls "dropdown-payments" + :data-collapse-toggle "dropdown-payments" + :icon svg/payments} + "Payments") + (sub-menu- {:id "dropdown-payments"} + (menu-button- {:href (bidi/path-for client-routes/routes + :payments)} "All") + (menu-button- {:href (bidi/path-for client-routes/routes + :payments)} "Pending") + (menu-button- {:href (bidi/path-for client-routes/routes + :payments)} "Cleared") + (menu-button- {:href (bidi/path-for client-routes/routes + :payments)} "Voided"))] + + [:li + (menu-button- {:aria-controls "dropdown-transactions" + :data-collapse-toggle "dropdown-transactions" + :icon svg/bank} + "Transactions") + + (sub-menu- {:id "dropdown-transactions"} + (menu-button- {:href (bidi/path-for client-routes/routes + :transactions)} "All") + (menu-button- {:href (bidi/path-for client-routes/routes + :unapproved-transactions)} "Unapproved") + (menu-button- {:href (bidi/path-for client-routes/routes + :requires-feedback-transactions)} "Client Review") + (menu-button- {:href (bidi/path-for client-routes/routes + :approved-transactions)} "Approved") + (menu-button- {:href (bidi/path-for ssr-routes/only-routes + :transaction-insights)} "Insights"))] + [:li + (menu-button- {:aria-controls "dropdown-ledger" + :data-collapse-toggle "dropdown-ledger" + :icon svg/receipt} + "Ledger") + (sub-menu- {:id "dropdown-ledger"} + (menu-button- {:href (bidi/path-for client-routes/routes + :ledger)} "Register") + (menu-button- {:href (bidi/path-for client-routes/routes + :profit-and-loss)} "Profit & Loss") + (menu-button- {:href (bidi/path-for client-routes/routes + :profit-and-loss-detail)} "Profit & Loss Detail") + (menu-button- {:href (bidi/path-for client-routes/routes + :cash-flows)} "Cash Flows") + (menu-button- {:href (bidi/path-for client-routes/routes + :balance-sheet)} "Balance Sheet") + (menu-button- {:href (bidi/path-for client-routes/routes + :external-import-ledger)} "External Ledger Import"))]]) + + +(defn company-aside-nav- [] + [:ul {:class "space-y-2" :hx-boost "true"} + [:li + (menu-button- {:icon svg/vendors + :href (bidi/path-for ssr-routes/only-routes + :company)} + "My Company")] + + [:li + (menu-button- {:icon svg/report + :href (bidi/path-for ssr-routes/only-routes + :company-reports)} + "Reports")] + [:li + (menu-button- {:icon svg/bank + :href (bidi/path-for ssr-routes/only-routes + :company-yodlee)} + "Yodlee Link")] + [:li + (menu-button- {:icon svg/government-building + :href (bidi/path-for ssr-routes/only-routes + :company-1099)} + "1099 Vendor Info" + )]]) + +(defn admin-aside-nav- [] + [:ul {:class "space-y-2"} + [:li + (menu-button- {:icon svg/dashboard + :href (bidi/path-for client-routes/routes + :admin)} + "Dashboard")] + + [:li + (menu-button- {:icon svg/restaurant + :href (bidi/path-for client-routes/routes + :admin-clients)} + "Clients")] + [:li + (menu-button- {:icon svg/vendors + :href (bidi/path-for client-routes/routes + :admin-vendors)} + "Vendors")] + [:li + (menu-button- {:icon svg/user + :href (bidi/path-for client-routes/routes + :admin-users)} + "Users")] + [:li + (menu-button- {:icon svg/accounts + :href (bidi/path-for client-routes/routes + :admin-accounts)} + "Accounts")] + + [:li + (menu-button- {:icon svg/cog + :href (bidi/path-for client-routes/routes + :admin-rules)} + "Rules")] + + [:li + (menu-button- {:icon svg/question + :href (bidi/path-for ssr-routes/only-routes + :admin-history) + :hx-boost "true"} + "History")] + + [:li + (menu-button- {:icon svg/rabbit + :href (bidi/path-for client-routes/routes + :admin-jobs)} + "Background Jobs")] + [:li + (menu-button- {:aria-controls "dropdown-import" + :data-collapse-toggle "dropdown-import" + :icon svg/arrow-in} + "Import") + + (sub-menu- {:id "dropdown-import"} + (menu-button- {:href (bidi/path-for client-routes/routes + :admin-excel-import)} "Excel Invoices") + (menu-button- {:href (bidi/path-for client-routes/routes + :admin-import-batches)} "Import Batches") + (menu-button- {:href (bidi/path-for ssr-routes/only-routes + :admin-ezcater-xls) + :hx-boost "true"} "EZCater XLS Import"))]]) + + diff --git a/src/clj/auto_ap/ssr/components/breadcrumbs.clj b/src/clj/auto_ap/ssr/components/breadcrumbs.clj new file mode 100644 index 00000000..3cbaf6aa --- /dev/null +++ b/src/clj/auto_ap/ssr/components/breadcrumbs.clj @@ -0,0 +1,22 @@ +(ns auto-ap.ssr.components.breadcrumbs + (:require [auto-ap.ssr.svg :as svg])) + +(defn breadcrumbs- [params & steps] + [:div {:class "inline-flex px-5 py-3 text-gray-700 border border-gray-200 rounded-lg bg-white dark:bg-gray-800 dark:border-gray-700"} + [:ul {:class "inline-flex items-center space-x-1 md:space-x-3"} + [:li {:class "inline-flex items-center"} + [:a {:href "#", :class "inline-flex w-4 h-4 mr-2 items-center text-sm font-medium text-gray-700 hover:text-blue-600 dark:text-gray-400 dark:hover:text-white"} + [:div.w-4.h-4 svg/home]]] + (for [p steps] + [:li + [:div {:class "flex items-center"} + + [:div {:class "w-6 h-6 text-gray-400",} + svg/breadcrumb-component] + + (update-in p [1 :class] str " ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 dark:text-gray-400 dark:hover:text-white")]]) + #_[:li {:aria-current "page"} + [:div {:class "flex items-center"} + [:svg {:aria-hidden "true", :class "w-6 h-6 text-gray-400", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:fill-rule "evenodd", :d "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", :clip-rule "evenodd"}]] + [:span {:class "ml-1 text-sm font-medium text-gray-500 md:ml-2 dark:text-gray-400"} "Flowbite"]]]]]) diff --git a/src/clj/auto_ap/ssr/components/buttons.clj b/src/clj/auto_ap/ssr/components/buttons.clj new file mode 100644 index 00000000..4a7f9762 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/buttons.clj @@ -0,0 +1,46 @@ +(ns auto-ap.ssr.components.buttons + (:require [auto-ap.ssr.svg :as svg])) + +(defn button-icon- [_ i] + [:div.h-4.w-4 i]) + +(defn button- [params & children] + [:button (update params + :class #(cond-> % + true (str " text-white focus:ring-4 font-bold rounded-lg text-sm px-5 py-2.5 text-center mr-2 inline-flex items-center hover:scale-105 transition duration-100 justify-center") + (= :secondary (:color params)) (str " bg-blue-500 hover:bg-blue-600 focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700") + (= :primary (:color params)) (str " bg-green-500 hover:bg-green-600 focus:ring-green-300 dark:bg-green-600 dark:hover:bg-green-700 "))) + [:div.htmx-indicator.flex.items-center + (svg/spinner {:class "inline w-4 h-4 text-white"}) + [:div.ml-3 "Loading..."]] + (into [:div.htmx-indicator-hidden.inline-flex.gap-2.items-center.justify-center ] children)]) + +(defn icon-button- [params & children] + (into + [:button + + (update params :class + #(cond-> % + true (str " inline-flex items-center justify-center items-center p-3 text-sm font-medium border border-gray-300 dark:border-gray-700 text-center rounded-lg ") + (= :secondary (:color params)) (str " bg-blue-500 hover:bg-blue-600 focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700") + (= :primary (:color params)) (str " bg-green-500 hover:bg-green-600 focus:ring-green-300 dark:bg-green-600 dark:hover:bg-green-700 ") + (= :primary-light (:color params)) (str " bg-green-200 hover:bg-green-300 focus:ring-green-200 dark:bg-green-700 dark:hover:bg-green-600 text-gray-800 dark:text-gray-200") + (= :secondary-light (:color params)) (str " bg-blue-200 hover:bg-blue-300 focus:ring-blue-200 dark:bg-blue-700 dark:hover:bg-blue-600 text-gray-800 dark:text-gray-200") + (= :danger-light (:color params)) (str " bg-red-200 hover:bg-red-300 focus:ring-red-200 dark:bg-red-700 dark:hover:bg-red-600 text-gray-800 dark:text-gray-200") + (nil? (:color params)) + (str " bg-white dark:bg-gray-600 border-gray-300 dark:border-gray-700 text-gray-500 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-100"))) + [:div.htmx-indicator.flex.items-center + (svg/spinner {:class "inline w-4 h-4 text-white"})] + [:div.htmx-indicator-hidden.inline-flex.gap-2.items-center.justify-center (into [:div.h-4.w-4] children)]])) + +(defn a-icon-button- [params & children] + (into + [:a (update params :class str " inline-flex items-center justify-center bg-white dark:bg-gray-600 items-center p-3 text-sm font-medium border border-gray-300 dark:border-gray-700 text-center text-gray-500 hover:text-gray-800 rounded-lg dark:text-gray-400 dark:hover:text-gray-100") + [:div.h-4.w-4 children]])) + +(defn save-button- [params & children] + [:button { :class "text-white bg-green-500 hover:bg-green-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 dark:bg-green-600 dark:hover:bg-green-700 dark:focus:ring-green-800 inline-flex items-center hover:scale-105 transition duration-300"} + [:div.htmx-indicator.flex.items-center + (svg/spinner {:class "inline w-4 h-4 text-white"}) + [:div.ml-3 "Loading..."]] + (into [:div.htmx-indicator-hidden ] children)]) diff --git a/src/clj/auto_ap/ssr/components/card.clj b/src/clj/auto_ap/ssr/components/card.clj new file mode 100644 index 00000000..b93838b4 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/card.clj @@ -0,0 +1,12 @@ +(ns auto-ap.ssr.components.card) + +(defn card- [params & children] + (into [:div (update params :class str " shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white overflow-hidden")] + children)) + +(defn content-card- [params & children] + [:section {:class " py-3 sm:py-5"} + [:div {:class "max-w-screen-2xl"} + (into + [:div {:class "relative overflow-hidden shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white"}] + children)]]) diff --git a/src/clj/auto_ap/ssr/components/data_grid.clj b/src/clj/auto_ap/ssr/components/data_grid.clj new file mode 100644 index 00000000..5625818e --- /dev/null +++ b/src/clj/auto_ap/ssr/components/data_grid.clj @@ -0,0 +1,100 @@ +(ns auto-ap.ssr.components.data-grid + (:require + [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.components.card :refer [content-card-]] + [auto-ap.ssr.components.paginator :refer [paginator-]] + [bidi.bidi :as bidi] + [hiccup2.core :as hiccup])) + +(defn header- [params & rest] + (into [:th.px-4.py-3 {:scope "col" :class (:class params) + "_" (hiccup/raw (when (:sort-key params ) (format "on click trigger sorted(key:\"%s\")", (:sort-key params)))) + :style (:style params)}] + (if (:sort-key params) + [(into [:a {:href "#"} ] rest)] + rest))) + +(defn sort-header- [params & rest] + [:th.px-4.py-3 {:scope "col" :class (:class params) + "_" (hiccup/raw (format "on click trigger sorted(key:\"%s\")", (:sort-key params)))} + (into [:a {:href "#"} ] rest)]) + +(defn row- [params & rest] + (into [:tr (update params + :class str " border-b dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700")] rest)) + +(defn cell- [params & rest] + (into [:td.px-4.py-2 params ] rest)) + +(defn right-stack-cell- [params & rest] + (cell- params (into [:div.flex.flex-row-reverse.items-center.justify-between + rest])) + ) + +(defn checkbox-header- [params & rest] + [:th {:scope "col", :class "p-4"} + [:div {:class "flex items-center"} + [:input {:id "checkbox-all", :type "checkbox", :class "w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"}] + [:label {:for "checkbox-all", :class "sr-only"} "checkbox"]]]) + +(defn data-grid- [{:keys [headers thead-params]} & rest] + [:table {:class "w-full text-sm text-left text-gray-500 dark:text-gray-400"} + [:thead (assoc thead-params :class "text-xs text-gray-800 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400") + (into + [:tr] + headers)] + (into + [:tbody] + rest)]) + +;; needed for tailwind +;; lg:table-cell md:table-cell + +(defn data-grid-card- [{:keys [id + route + title + paginate? + action-buttons + total + subtitle + thead-params + start + per-page + flash-id + headers + rows] :as params}] + [:div {:hx-get (bidi/path-for ssr-routes/only-routes + route + :request-method :get) + :hx-trigger "clientSelected from:body" + :hx-swap "outerHTML swap:300ms" + :id id} + (content-card- + {} + [:div {:class "flex flex-col px-4 py-3 space-y-3 lg:flex-row lg:items-center lg:justify-between lg:space-y-0 lg:space-x-4 text-gray-800 dark:text-gray-100"} + [:div + [:h1.text-2xl.mb-3.font-bold title] + [:div {:class "flex items-center flex-1 space-x-4"} + [:h5 + (when subtitle + [:span subtitle])]]] + (into [:div {:class "flex flex-col flex-shrink-0 space-y-3 md:flex-row md:items-center lg:justify-end md:space-y-0 md:space-x-3"}] + action-buttons)] + [:div {:class "overflow-x-auto"} + (data-grid- {:headers headers + :thead-params thead-params} + rows)] + + (when (or paginate? + (nil? paginate?)) + (paginator- {:start start + :end (Math/min (+ start per-page) total) + :per-page per-page + :total total + :a-params (fn [page] + {:hx-get (str (bidi/path-for ssr-routes/only-routes + route + :request-method :get) + "?start=" (* page per-page)) + :hx-target (str "#" id) + :hx-swap "outerHTML show:#app:top"})})))]) diff --git a/src/clj/auto_ap/ssr/components/dialog.clj b/src/clj/auto_ap/ssr/components/dialog.clj new file mode 100644 index 00000000..6ce3b034 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/dialog.clj @@ -0,0 +1,44 @@ +(ns auto-ap.ssr.components.dialog + (:require [hiccup2.core :as hiccup])) + +(defn modal- [params & children] + [:div + [:div#modal-holder { :tabindex "-1", :class "fixed top-0 left-0 right-0 z-50 w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full flex justify-center hidden" :aria-hidden true + "_" (hiccup/raw "on closeModal transition <#modal-holder .modal-content /> opacity to 0.0 over 300ms then call hideModal() ")} + [:div {:class "relative w-full max-w-2xl max-h-full"} + (into [:div#modal-content] + children)] + ] + [:script {:lang "text/javascript"} + (hiccup/raw " + var modal_element = document.getElementById('modal-holder'); + var modal_options = { + placement: 'center', + backdrop: 'dynamic', + backdropClasess: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40', + closable: true, + onOpen: function() { + modal_element.dispatchEvent('openModal'); + + }, + onHide: function() { + modal_element.outerHTML='
'; + }, + }; + var curModal = new Modal(modal_element, modal_options); +curModal.show(); +function hideModal() { +curModal.hide(); +} +") + + ]]) + +(defn modal-card- [params header content footer] + [:div#modal-card params + [:div {:class "relative bg-white rounded-lg shadow dark:bg-gray-700 dark:text-white fade-in slide-up duration-300 transition-all modal-content"} + [:div {:class "flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600"} header] + [:div {:class "p-6 space-y-6"} + content] + [:div footer]] + ]) diff --git a/src/clj/auto_ap/ssr/components/inputs.clj b/src/clj/auto_ap/ssr/components/inputs.clj new file mode 100644 index 00000000..b66049f9 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/inputs.clj @@ -0,0 +1,24 @@ +(ns auto-ap.ssr.components.inputs) + +(defn select- [params & children] + (into + [:select {:class "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + :name (:name params)} + (cond->> + (map (fn [[k v]] + [:option {:value k :selected (= v (:value params))} v]) + (:options params)) + (:allow-blank? params) (conj [:option {:value "" :selected (not (:value params))} ""]))] + children)) + +(defn text-input- [params] + [:input + (update params + :class str " bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500") + ]) + +(defn field- [params & rest] + (into + [:div + [:label {:class "block mb-2 text-sm font-medium text-gray-900 dark:text-white"} (:label params)]] + rest)) diff --git a/src/clj/auto_ap/ssr/components/navbar.clj b/src/clj/auto_ap/ssr/components/navbar.clj new file mode 100644 index 00000000..692b4cc8 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/navbar.clj @@ -0,0 +1,45 @@ +(ns auto-ap.ssr.components.navbar + (:require + [auto-ap.graphql.utils :refer [is-admin?]] + [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.company-dropdown :as cd] + [auto-ap.ssr.components.buttons :refer [icon-button-]] + [auto-ap.ssr.components.user-dropdown :as user-dropdown] + [auto-ap.ssr.svg :as svg] + [bidi.bidi :as bidi])) + +(defn navbar- [{:keys [client identity]}] + [:nav {:class "fixed z-30 w-full bg-white border-b border-gray-200 dark:bg-gray-800 dark:border-gray-700"} + [:div {:class "px-3 py-3 lg:px-5 lg:pl-3"} + [:div {:class "flex items-center justify-between"} + [:div {:class "flex items-center justify-start"} + [:button {:aria-controls "left-nav", :id "left-nav-toggle" :type "button", :class "inline-flex items-center p-2 mt-2 ml-2 mr-2 text-sm text-gray-500 rounded-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600"} + [:span {:class "sr-only"} "Open sidebar"] + [:svg {:class "w-6 h-6", :aria-hidden "true", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:clip-rule "evenodd", :fill-rule "evenodd", :d "M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"}]]] + [:a {:href "/" :class "flex ml-2 md:mr-24"} + [:img {:src "/img/logo-big2.png", :class "h-10 mr-16", :alt "Integreat logo"}]]] + + [:div {:class "flex items-center gap-4"} + + (when (is-admin? identity) + [:button.mt-1.lg:w-96.relative.hidden.lg:block {:class "bg-gray-50 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 w-full pl-10 py-4 pr-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500 gap-4 " + :hx-get (bidi/path-for ssr-routes/only-routes + :search) + :hx-target "#modal-holder" + :hx-swap "outerHTML"} + [:div {:class "absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none text-gray-500"} + [:div.w-4.h-4 svg/search] + [:span.ml-2 "Search"]]]) + [:div {:class "hidden mr-3 -mb-1 sm:block"} + [:span]] + (icon-button- + {:id "toggleSidebarMobileSearch", :type "button", :class "p-2 text-gray-500 rounded-lg lg:hidden hover:text-gray-900 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white" + :hx-get (bidi/path-for ssr-routes/only-routes + :search) + :hx-target "#modal-holder" + :hx-swap "outerHTML"} + svg/search) + (cd/dropdown {:client client :identity identity}) + + (user-dropdown/dropdown {:identity identity})]]]]) diff --git a/src/clj/auto_ap/ssr/components/navbar_dropdown.clj b/src/clj/auto_ap/ssr/components/navbar_dropdown.clj deleted file mode 100644 index b478b720..00000000 --- a/src/clj/auto_ap/ssr/components/navbar_dropdown.clj +++ /dev/null @@ -1,14 +0,0 @@ -(ns auto-ap.ssr.components.navbar-dropdown - (:require [hiccup2.core :as hiccup])) - -(defn navbar-dropdown [id header children] - [:div { - :id id - :class (str "navbar-item has-dropdown") - "_" (hiccup/raw "on click elsewhere remove .is-active from me") - - } - [:a {:class "navbar-link login" - "_" (hiccup/raw "on click toggle .is-active on the parentElement of me then add .appear to next <.navbar-dropdown />")} header] - (into [:div {:class "navbar-dropdown"} - children])]) diff --git a/src/clj/auto_ap/ssr/components/page.clj b/src/clj/auto_ap/ssr/components/page.clj new file mode 100644 index 00000000..a7f6f4bf --- /dev/null +++ b/src/clj/auto_ap/ssr/components/page.clj @@ -0,0 +1,36 @@ +(ns auto-ap.ssr.components.page + (:require + [auto-ap.ssr.components.aside :refer [left-aside-]] + [auto-ap.ssr.components.navbar :refer [navbar-]] + [hiccup2.core :as hiccup] + [auto-ap.ssr.svg :as svg])) + +(defn page- [{:keys [nav page-specific active-client identity app-params] :or {app-params {}}} & children] + [:div#app + (navbar- {:client active-client + :identity identity}) + [:div#app-contents.flex.pt-16.overflow-hidden (assoc app-params :hx-disinherit "*") + (left-aside- {:nav nav + :page-specific page-specific}) + [:div#main-content {:class "relative w-full h-full lg:pl-64 overflow-y-auto px-4 bg-gray-100 dark:bg-gray-900 min-h-content " + "_" (hiccup/raw "on htmx:responseError put event.detail.xhr.response into #error-details then add .htmx-added to #error-holder then remove .hidden from #error-holder then wait 30ms then remove .htmx-added from #error-holder")} + [:div#error-holder.hidden + [:div.fixed.top-0.right-0.left-0.z-30.mx-auto.max-w-screen-lg.w-screen-lg.my-0.pt-8.rounded-lg + [:div.relative + [:button.absolute.right-2.top-2.w-6.h-6.z-50.text-red-600 + {"_" (hiccup/raw "on click add .hidden to #error-holder")} + svg/filled-x]] + + [:div.m-4.overflow-auto.z-30.flex.center-items.justify-center.text-red-800.bg-red-50.dark:bg-gray-800.dark:text-red-400.border-red-300.rounded-lg.border.transition-all.duration-500.fade-in.slide-up.max-h-96 + + [:div {:class "p-4 mb-4 text-lg w-full" :role "alert"} + [:div.inline-block.w-8.h-8.mr-2 svg/alert] + [:span.font-medium "Oh, drat! An unexpected error has occurred."] + [:div.text-sm + [:p "Integreat staff have been notified and are looking into it. "] + [:p "To see error details, " [:a.underline {:href "#" :data-collapse-toggle "error-details"} "click here"] "."] + [:pre#error-details.text-xs.hidden]]]]]] + (into + [:div.p-4] + children)]] + [:div#modal-holder]]) diff --git a/src/clj/auto_ap/ssr/components/paginator.clj b/src/clj/auto_ap/ssr/components/paginator.clj new file mode 100644 index 00000000..c89caffb --- /dev/null +++ b/src/clj/auto_ap/ssr/components/paginator.clj @@ -0,0 +1,61 @@ +(ns auto-ap.ssr.components.paginator) + +(defn bound [x y z] + (cond + (< z x) + x + (< y x) + x + (> y z) + z + :else + y)) + +(def elipsis-button + [:p {:href "#", :class "flex items-center justify-center px-3 py-2 text-sm leading-tight text-gray-500 bg-white border border-gray-300 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"} "..."]) + +(defn paginator-internal- [{:keys [start per-page end total a-params]}] + (let [per-page (or per-page 20) + max-buttons 5 + buttons-before (Math/floor (/ max-buttons 2)) + total-pages (long (Math/max (long 1) (long (Math/ceil (/ total per-page))))) + current-page (long (Math/floor (/ start per-page))) + first-page-button (bound 0 (- current-page buttons-before) (- total-pages max-buttons)) + all-buttons (into [] (for [x (range total-pages)] + [:li + [:a (-> (a-params x) + (update + :class #(cond-> % + true (str " flex items-center justify-center px-3 py-2 text-sm leading-tight border ") + + (= current-page x) + (str " text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:border-gray-700 dark:bg-gray-700 dark:text-white") + + (not= current-page x) + (str " text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white"))) + (assoc :href "#")) + (inc x)]])) + + + last-page-button (Math/min (long total-pages) (long (+ max-buttons first-page-button))) + + extended-last-page-button (when (not= last-page-button total-pages) + (list + elipsis-button + (last all-buttons))) + + extended-first-page-button (when (not= first-page-button 0) + (list + (first all-buttons) + elipsis-button))] + [:nav + [:ul {:class "inline-flex items-stretch -space-x-px"} + extended-first-page-button + (apply list (subvec all-buttons first-page-button last-page-button)) + extended-last-page-button]])) + +(defn paginator- [{:keys [start per-page end total a-params] :as params}] + [:nav {:class "flex flex-col items-start justify-between p-4 space-y-3 md:flex-row md:items-center md:space-y-0", :aria-label "Table navigation"} + [:span {:class "text-sm font-normal text-gray-500 dark:text-gray-400"} + [:span {:class "font-semibold text-gray-900 dark:text-white"} (str (inc start)) "-" (str end) " of " (str total)]] + (paginator-internal- params)]) diff --git a/src/clj/auto_ap/ssr/components/tags.clj b/src/clj/auto_ap/ssr/components/tags.clj new file mode 100644 index 00000000..0a2ab9d5 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/tags.clj @@ -0,0 +1,20 @@ +(ns auto-ap.ssr.components.tags) + + +(defn pill- [params & children] + (into + [:span (cond-> params + true (update :class str " text-xs font-medium px-2 py-0.5 rounded whitespace-nowrap") + + (= :primary (:color params)) + (update :class str " bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300 ") + + (= :secondary (:color params)) + (update :class str " bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300 ") + + (= :yellow (:color params)) + (update :class str " bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300") + + (= :red (:color params)) + (update :class str " bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300"))] + children)) diff --git a/src/clj/auto_ap/ssr/components/user_dropdown.clj b/src/clj/auto_ap/ssr/components/user_dropdown.clj new file mode 100644 index 00000000..485156c0 --- /dev/null +++ b/src/clj/auto_ap/ssr/components/user_dropdown.clj @@ -0,0 +1,61 @@ +(ns auto-ap.ssr.components.user-dropdown + (:require + [auto-ap.client-routes :as client-routes2] + [auto-ap.datomic :refer [conn pull-attr]] + [auto-ap.ssr-routes :as ssr-routes] + [bidi.bidi :as bidi] + [datomic.api :as dc] + [hiccup2.core :as hiccup])) + +(defn dropdown [{:keys [identity]}] + [:div {:class "flex items-center ml-3 mr-10"} + [:div + [:button#user-menu-button {:type "button", :class "flex text-sm bg-gray-800 rounded-full focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600", :aria-expanded "false" + "_" (hiccup/raw "init call initUserDropdown()")} + [:span {:class "sr-only"} "Open user menu"] + [:img {:class "w-8 h-8 rounded-full", :src (pull-attr (dc/db conn) :user/profile-image-url (:db/id identity)) :alt "user photo" :referrerpolicy "no-referrer"}]]] + [:div#user-menu {:class "z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600 mr-10"} + [:div {:class "px-4 py-3", :role "none"} + [:p {:class "text-sm text-gray-900 dark:text-white", :role "none"} (:user/name identity)] + [:p {:class "text-sm font-medium text-gray-900 truncate dark:text-gray-300", :role "none"} (pull-attr (dc/db conn) :user/email (:db/id identity))] + #_(icon-button- + {"_" (hiccup/raw "on click toggle .dark on ")} + [:div.h-4.w-4 + [:div.hidden.dark:block svg/sun] + [:div.dark:hidden svg/moon]])] + [:ul {:class "py-1", :role "none"} + [:li + [:a {:href (bidi/path-for ssr-routes/only-routes :company), :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "My Company"]] + (when (= "admin" (:user/role identity)) + [:a {:href (bidi/path-for client-routes2/routes :admin), :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Admin"]) + [:li + [:a {:href "#", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem" + "_" (hiccup/raw "on click toggle .dark on ")} + "Night Mode"]] + [:li + [:a {:href "/logout", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Sign out"]]]] + + [:script {:lang "text/javascript"} + (hiccup/raw + " +function initUserDropdown() { + var $dropdownTargetEl = document.getElementById('user-menu'); + + // set the element that trigger the dropdown menu on click + var $dropdownTriggerEl = document.getElementById('user-menu-button'); + + var userDrowdown = new Dropdown($dropdownTargetEl, $dropdownTriggerEl, { + placement: 'bottom', + triggerType: 'click', + offsetSkidding: 0, + offsetDistance: 10, + delay: 5000, + onHide: () => { + }, + onShow: () => { + }, + onToggle: () => { + } + }); +} +")]]) diff --git a/src/clj/auto_ap/ssr/core.clj b/src/clj/auto_ap/ssr/core.clj index e5d344d4..bb947cd0 100644 --- a/src/clj/auto_ap/ssr/core.clj +++ b/src/clj/auto_ap/ssr/core.clj @@ -2,32 +2,45 @@ (:require [auto-ap.routes.utils :refer [wrap-admin wrap-client-redirect-unauthenticated wrap-secure]] - [auto-ap.ssr.admin :as admin] + [auto-ap.ssr.admin.history :as history] [auto-ap.ssr.auth :as auth] [auto-ap.ssr.transaction.insights :as insights] [auto-ap.ssr.company.company-1099 :as company-1099] + [auto-ap.ssr.company.yodlee :as company-yodlee] [auto-ap.ssr.search :as search] [auto-ap.ssr.company-dropdown :as company-dropdown] - [auto-ap.routes.ezcater-xls :as ezcater-xls])) + [auto-ap.ssr.company.reports :as company-reports] + [auto-ap.routes.ezcater-xls :as ezcater-xls] + [auto-ap.ssr.company :as company])) ;; from auto-ap.ssr-routes, because they're shared (def key->handler {:logout auth/logout - :admin-history (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/history))) - :admin-history-search (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/history-search))) - :admin-history-inspect (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/inspect))) - :active-client (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin company-dropdown/active-client))) - :company-dropdown-contents (wrap-client-redirect-unauthenticated (wrap-secure company-dropdown/dropdown-contents)) + :admin-history (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page))) + :admin-history-search (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page))) + :admin-history-inspect (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/inspect))) + :active-client (wrap-client-redirect-unauthenticated (wrap-secure (wrap-secure company-dropdown/active-client))) + :company-dropdown-search-results + (wrap-client-redirect-unauthenticated (wrap-secure company-dropdown/dropdown-search-results)) + :company (wrap-client-redirect-unauthenticated (wrap-secure company/page)) :company-1099 (wrap-client-redirect-unauthenticated (wrap-secure company-1099/page)) :company-1099-vendor-table (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-table)) :company-1099-vendor-dialog (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-dialog)) :company-1099-vendor-save (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-save)) - :transaction-insights (wrap-client-redirect-unauthenticated (wrap-secure insights/page)) - :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-secure insights/insight-table)) - :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-secure insights/transaction-rows)) - :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-secure insights/approve)) - :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-secure insights/explain)) + :company-yodlee (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/page)) + :company-yodlee-table (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/table)) + :company-yodlee-fastlink-dialog (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/fastlink-dialog)) + :company-yodlee-provider-account-refresh (wrap-client-redirect-unauthenticated (wrap-admin company-yodlee/refresh-provider-account)) + :company-reports (wrap-client-redirect-unauthenticated (wrap-secure company-reports/page)) + :company-reports-table (wrap-client-redirect-unauthenticated (wrap-secure company-reports/table)) + :company-reports-delete (wrap-client-redirect-unauthenticated (wrap-admin company-reports/delete-report)) + :transaction-insights (wrap-client-redirect-unauthenticated (wrap-admin insights/page)) + :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-admin insights/insight-table)) + :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-admin insights/transaction-rows)) + :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-admin insights/approve)) + :transaction-insight-disapprove (wrap-client-redirect-unauthenticated (wrap-admin insights/disapprove)) + :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-admin insights/explain)) :admin-ezcater-xls (wrap-client-redirect-unauthenticated (wrap-admin ezcater-xls/page)) :search (wrap-client-redirect-unauthenticated (wrap-secure search/dialog-contents))}) diff --git a/src/clj/auto_ap/ssr/grid_page_helper.clj b/src/clj/auto_ap/ssr/grid_page_helper.clj new file mode 100644 index 00000000..ff557dcb --- /dev/null +++ b/src/clj/auto_ap/ssr/grid_page_helper.clj @@ -0,0 +1,186 @@ +(ns auto-ap.ssr.grid-page-helper + (:require + [auto-ap.ssr.components :as com] + [auto-ap.ssr.ui :refer [base-page]] + [auto-ap.ssr.utils :refer [html-response]] + [hiccup2.core :as hiccup] + [bidi.bidi :as bidi] + [auto-ap.ssr-routes :as ssr-routes] + [cemerick.url :as url] + [clojure.string :as str] + [auto-ap.ssr.svg :as svg])) + +(defn row* [gridspec user entity {:keys [flash? delete-after-settle?] :as options}] + (let [cells (mapv (fn [header] + (com/data-grid-cell {:class (if-let [show-starting (:show-starting header)] + (format "hidden %s:table-cell" show-starting) + (:class header))} + ((:render header) entity))) + (:headers gridspec)) + cells (conj cells (com/data-grid-right-stack-cell {} + (into [:form + [:input {:type :hidden :name "id" :value ((:id-fn gridspec) entity)}]] + ((:row-buttons gridspec) user entity))))] + (apply com/data-grid-row + {:class (when flash? + "live-added") + "_" (hiccup/raw (when delete-after-settle? + " on htmx:afterSettle wait 400ms then remove me")) + + :data-id ((:id-fn gridspec) entity)} + cells))) + +(defn sort-icon [sort key] + (->> sort + (filter (comp #(= key %) :sort-key)) + first + :sort-icon)) + +(defn sort-by-list [sort] + (if (seq sort) + (into + [:div.flex.gap-2.items-center + "sorted by" + + ] + (for [{:keys [name sort-icon ]} sort] + [:div.py-1.px-3.text-sm.rounded.bg-gray-100.dark:bg-gray-600.flex.items-center.gap-2.relative name [:div.h-4.w-4.mr-3 sort-icon] + [:div {:class "absolute inline-flex items-center justify-center w-6 h-6 text-xs font-bold text-white hover:scale-110 transition-all duration-300 bg-gray-400 border-2 border-white rounded-full -top-2 -right-2 dark:border-gray-900"} + [:div.h-4.w-4 svg/x] + ]] + )) + "default sort")) + +(defn table* [grid-spec user {:keys [start per-page client flash-id sort request]}] + (let [start (or start 0) + per-page (or per-page 30) + [entities total] ((:fetch-page grid-spec) + user + {:start start + :per-page per-page + :client-id (:db/id client) + :sort sort + :request request})] + (com/data-grid-card {:id (:id grid-spec) + :title (:title grid-spec) + :route (:route grid-spec) + :start start + :per-page per-page + :total total + :subtitle [:div.flex.items-center.gap-2 + [:span (format "Total %s: %d, " (:entity-name grid-spec) total)] + (sort-by-list sort)] + :action-buttons ((:action-buttons grid-spec) user) + :rows (for [entity entities] + (row* grid-spec user entity {:flash? (= flash-id ((:id-fn grid-spec) entity))})) + :thead-params {:hx-get (bidi/path-for ssr-routes/only-routes + (:route grid-spec)) + :hx-target (str "#" (:id grid-spec)) + :hx-trigger "sorted once" + :hx-vals "js:{\"toggle-sort\": event.detail.key || \"\"}"} + :headers + (conj + (mapv + (fn [h] + (if (:sort-key h) + (com/data-grid-sort-header {:class (if-let [show-starting (:show-starting h)] + (format "hidden %s:table-cell" show-starting) + (:class h)) + :sort-key (:sort-key h)} + + [:div.flex.gap-4.items-center + (:name h) + [:div.h-6.w-6.text-gray-400.dark:text-gray-500 (sort-icon sort (:sort-key h))]]) + (com/data-grid-header {:class (if-let [show-starting (:show-starting h)] + (format "hidden %s:table-cell" show-starting) + (:class h)) + :sort-key (:sort-key h)} + (:name h)) + + )) + (:headers grid-spec)) + (com/data-grid-header {}))}))) + + + +(defn parse-sort [grid-spec q] + (if (not-empty q) + (into [] + (map (fn [k] + (let [[k v] (str/split k #":")] + {:sort-key (str k) + :asc (boolean (= "asc" v)) + :name (:name (first (filter #(= (str k) (:sort-key %)) (:headers grid-spec)))) + :sort-icon (if (= (boolean (= "asc" v)) true) + svg/sort-down + svg/sort-up)})) + (str/split q #","))) + [])) + +(defn toggle-sort [grid-spec q k] + (if ((set (map :sort-key q)) k) + (mapv + (fn [s] + (if (= (:sort-key s) + k) + (-> s + (update :asc + #(boolean (not %))) + (update :sort-icon (fn [x] + (if (= x svg/sort-down) + svg/sort-up + svg/sort-down)))) + s)) + q) + (conj q {:sort-key k + :asc true + :name (:name (first (filter #(= (str k) (:sort-key %)) (:headers grid-spec)))) + :sort-icon svg/sort-down}))) + +(defn sort->query [s] + (str/join "," (map (fn [k] (format "%s:%s" (:sort-key k) (if (= true (:asc k)) + "asc" + "desc"))) + s))) + +(defn params->query-string [q] + (-> q + (dissoc :client :session) + (update :sort sort->query) + (url/map->query))) + +(defn extract-params [grid-spec {:keys [query-params hx-query-params identity session] :as request}] + (let [{hx-start "start" hx-per-page "per-page" hx-sort "sort" } hx-query-params + {q-start "start" q-per-page "per-page" q-sort "sort" q-toggle-sort "toggle-sort"} query-params] + (cond-> {} + hx-start (assoc :start (some-> hx-start not-empty (Long/parseLong ))) + q-start (assoc :start (some-> q-start not-empty (Long/parseLong ))) + hx-per-page (assoc :per-page (some-> hx-per-page not-empty (Long/parseLong ))) + q-per-page (assoc :per-page (some-> q-per-page not-empty (Long/parseLong ))) + hx-sort (assoc :sort (parse-sort grid-spec hx-sort)) + q-sort (assoc :sort (parse-sort grid-spec q-sort)) + (not-empty q-toggle-sort) (update :sort #(toggle-sort grid-spec % q-toggle-sort) ) + (:session request) (assoc :session (:session request)) + (:client (:session request)) (assoc :client (:client (:session request)))))) + +(defn table [grid-spec {:keys [query-params hx-query-params identity session] :as request}] + (let [params (extract-params grid-spec request) + query-string (params->query-string params)] + (html-response (table* + grid-spec + identity + params + ) + :headers {"hx-push-url" (str "?" query-string)}))) + +(defn page [grid-spec {:keys [identity] :as request}] + (base-page + request + (com/page {:nav (:nav grid-spec) + :active-client (:client (:session request)) + :identity (:identity request)} + (apply com/breadcrumbs {} (:breadcrumbs grid-spec)) + (table* grid-spec + identity + (extract-params grid-spec request))) + (:title grid-spec))) diff --git a/src/clj/auto_ap/ssr/login_dropdown.clj b/src/clj/auto_ap/ssr/login_dropdown.clj deleted file mode 100644 index a0b4715f..00000000 --- a/src/clj/auto_ap/ssr/login_dropdown.clj +++ /dev/null @@ -1,26 +0,0 @@ -(ns auto-ap.ssr.login-dropdown - (:require - [auto-ap.client-routes :as client-routes] - [auto-ap.ssr.components.navbar-dropdown :refer [navbar-dropdown]] - [bidi.bidi :as bidi] - [hiccup2.core :as hiccup] - [auto-ap.ssr-routes :as ssr-routes])) - -(defn dropdown [{:keys [identity]}] - (if identity - (navbar-dropdown - "login-dropdown" - [:span [:span.icon [:i.fa.fa-user] ] - [:span (:user/name identity)]] - [:div - [:a {:class "navbar-item" - :href (bidi/path-for client-routes/routes :reports)} "My company"] - #_[:a.dropdown-item {:on-click (dispatch-event-with-propagation [:vendor-dialog/started {}])} "New Vendor"] ;; double colorn - #_[:a.dropdown-item {:on-click (dispatch-event-with-propagation [:vendor-dialog/edit {}])} "Edit Vendor"] - (when (= "admin" (:user/role identity)) - [:a {:class "navbar-item" :href (bidi/path-for client-routes/routes :admin)} "Administration"]) - [:hr {:class "navbar-divider"}] - [:a.navbar-item {"_" (hiccup/raw "on click call localStorage.removeItem(\"jwt\")") - :href (bidi/path-for ssr-routes/only-routes :logout)} - "Logout"]]) - [:a.navbar-item {:href (bidi/path-for client-routes/routes :login )} "Login"])) diff --git a/src/clj/auto_ap/ssr/search.clj b/src/clj/auto_ap/ssr/search.clj index d7340507..45cbee37 100644 --- a/src/clj/auto_ap/ssr/search.clj +++ b/src/clj/auto_ap/ssr/search.clj @@ -5,7 +5,9 @@ [auto-ap.ssr.utils :refer [html-response]] [auto-ap.time :as atime] [clojure.string :as str] - [com.brunobonacci.mulog :as mu])) + [com.brunobonacci.mulog :as mu] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.svg :as svg])) (defn try-cleanse-date [d] (try @@ -61,58 +63,65 @@ (let [results (search-results q id)] [:div (if (seq results) - (for [doc results] - [:div.block - [:div.card - [:div.card-header.has-background-info-light - (cond (= "transaction" (:type doc)) - [:div.card-header-icon.icon-task-list-text-1] + [:div.flex.gap-8.flex-col + (for [doc results] + (com/card {} + [:div.flex.flex-col.gap-4 + [:div.flex.items-center.p-2.gap-4.bg-gray-50.dark:bg-gray-800 + [:div.h-8.w-8.p-2 + (cond (= "transaction" (:type doc)) + svg/bank + - (= "invoice" (:type doc)) - [:div.card-header-icon.icon-accounting-invoice-mail] + (= "invoice" (:type doc)) + svg/accounting-invoice-mail + - (= "payment" (:type doc)) - [:div.card-header-icon.icon-check-payment-sign] + (= "payment" (:type doc)) + svg/payments - (= "journal-entry" (:type doc)) - [:div.card-header-icon.icon-receipt] + (= "journal-entry" (:type doc)) + svg/receipt - :else - nil) - [:div.card-header-title (clojure.string/capitalize (:type doc)) - " " - " " - [:span.tags.ml-3 - [:span.tag.is-warning "client: " (:client_code doc)] - [:span.tag.is-info "amount: $" (first (:amount doc))] + :else + nil)] + (clojure.string/capitalize (:type doc)) + (com/pill {:color :primary} + "client: " (:client_code doc)) + (com/pill {:color :secondary} + "amount: $" (first (:amount doc))) (when-let [vendor-name (first (:vendor_name doc))] - [:span.tag.is-primary "vendor: " vendor-name])]] - [:a.card-header-icon.fa.fa-external-link {:href (str "/" (cond (= "invoice" - (:type doc)) - "invoices" + (com/pill {:color :yellow} + "vendor: " vendor-name)) + [:div + (com/link {:href (str "/" (cond (= "invoice" + (:type doc)) + "invoices" - (= "transaction" - (:type doc)) - "transactions" + (= "transaction" + (:type doc)) + "transactions" - (= "journal-entry" - (:type doc)) - "ledger" + (= "journal-entry" + (:type doc)) + "ledger" - :else - "payments") "/?exact-match-id=" (:id doc)) - :target "_blank"}] - ] - - - [:div.card-content - [:span + :else + "payments") "/?exact-match-id=" (:id doc)) + :target "_blank"} + [:div.h-8.w-8.p-2 + svg/external-link])] + ] - [:strong (atime/unparse (atime/parse (:date doc) atime/solr-date) atime/normal-date)] - ": " - (str (or (first (:description doc)) - (first (:number doc))))]]]] - ) + + [:div.px-4.pb-2 + [:span + + [:strong (atime/unparse (atime/parse (:date doc) atime/solr-date) atime/normal-date)] + ": " + (str (or (first (:description doc)) + (first (:number doc))))]]]) + )] [:div.block "No results found."])])) (defn dialog-contents [request] @@ -122,22 +131,26 @@ (if-let [q (get (:form-params request) "q")] (html-response (search-results* q (:identity request))) (html-response - [:div#search {:style {:height "400px" :overflow "auto"}} - - [:div.block - [:input#search-input.input {:type "search" - :placeholder "5/5/2034 Magheritas" - :name "q" - :hx-post "/search" - :hx-trigger "keyup changed delay:300ms, search" - :hx-target "#search-results" - :hx-indicator "#search" - :value (:q (:params request)) - :autofocus true}]] - [:i "Try dates, numbers, vendors. To filter to specific entity type, use 'invoice', 'transaction', 'journal-entry', 'payment'."] - [:style - ".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"] - [:div#search-results - ] - [:div.loader.is-loading.big.htmx-indicator {:style {:display "none"}}]]))) + (com/modal {} + (com/modal-card {} + [:div.p-2 "Search"] + [:div#search.overflow-auto.space-y-6.p-2.h-96 + + (com/text-input {:id "search-input" + :type "search" + :placeholder "5/5/2034 Magheritas" + :name "q" + :hx-post "/search" + :hx-trigger "keyup changed delay:300ms, search" + :hx-target "#search-results" + :hx-indicator "#search" + :value (:q (:params request)) + :autofocus true}) + [:i.text-sm.text-gray-600.dark:text-gray-50 "Try dates, numbers, vendors. To filter to specific type, use 'invoice', 'transaction', 'journal-entry', 'payment'."] + #_[:style + ".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"] + [:div#search-results + ] + [:div.loader.is-loading.big.htmx-indicator ]] + nil))))) diff --git a/src/clj/auto_ap/ssr/svg.clj b/src/clj/auto_ap/ssr/svg.clj new file mode 100644 index 00000000..385bbc1b --- /dev/null +++ b/src/clj/auto_ap/ssr/svg.clj @@ -0,0 +1,433 @@ +(ns auto-ap.ssr.svg) + +(def pie + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "analytics-pie-2"] + [:path {:d "M13.5.75v9h9A9,9,0,0,0,13.5.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M10.5,14.25v-9a9,9,0,1,0,5.561,16.077Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M22.5,12.75h-9l5.561,7.077A8.986,8.986,0,0,0,22.5,12.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]) + + +(def accounting-invoice-mail + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "accounting-document"] + [:path {:d "M21.75,21.75a1.5,1.5,0,0,1-1.5,1.5H3.75a1.5,1.5,0,0,1-1.5-1.5V2.25A1.5,1.5,0,0,1,3.75.75H14.379a1.5,1.5,0,0,1,1.06.439l5.872,5.872a1.5,1.5,0,0,1,.439,1.06Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M21.75,8.25h-6a1.5,1.5,0,0,1-1.5-1.5v-6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M6.2,11.594a2.224,2.224,0,0,0,1.858.875c1.139,0,2.063-.693,2.063-1.547S9.2,9.376,8.062,9.376,6,8.683,6,7.828s.924-1.547,2.062-1.547a2.221,2.221,0,0,1,1.858.875", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.469", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.062", :y2 "13.5", :x2 "8.062"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "5.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.062", :y2 "6.281", :x2 "8.062"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "15", :stroke-linecap "round", :stroke-width "1.5px", :x1 "12", :y2 "15", :x2 "18"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "19.5", :stroke-linecap "round", :stroke-width "1.5px", :x1 "6.75", :y2 "19.5", :x2 "18"}]]) + +(def receipt-register-1 + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:g + [:path {:d "M17.63,18h3a1.5,1.5,0,0,1,1.5,1.5v2.25a1.5,1.5,0,0,1-1.5,1.5H3.38a1.5,1.5,0,0,1-1.5-1.5V18H7.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "17.03", :stroke-linecap "round", :stroke-width "1.5px", :x1 "11.45", :y2 "14.35", :x2 "8.71"}] + [:circle {:cx "12.48", :cy "18.11", :r "1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M1.88,4.5H8.63L9.81,3.31A1.5,1.5,0,0,0,8.75.75H3.38a1.5,1.5,0,0,0-1.5,1.5V18", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.1", :stroke-linecap "round", :stroke-width "1.5px", :x1 "13.22", :y2 "6.59", :x2 "14.2"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "8.54", :stroke-linecap "round", :stroke-width "1.5px", :x1 "17.13", :y2 "9.25", :x2 "17.97"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.09", :stroke-linecap "round", :stroke-width "1.5px", :x1 "19.9", :y2 "13.03", :x2 "20.46"}] + [:path {:d "M8.63,4.5V7.74A12.22,12.22,0,0,1,18.92,18", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:circle {:cx "7.13", :cy "12.75", :r "2.25", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]]) + +(def payments + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "cash-payment-sign-2"] + [:path {:d "M8.212,15.637l-3.712.53.53-3.712,9.546-9.546a2.25,2.25,0,1,1,3.182,3.182Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M5.25,8.25h-3a1.5,1.5,0,0,0-1.5,1.5v10.5a1.5,1.5,0,0,0,1.5,1.5h19.5a1.5,1.5,0,0,0,1.5-1.5V9.75a1.5,1.5,0,0,0-1.5-1.5h-1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "18", :stroke-linecap "round", :stroke-width "1.5px", :x1 "20.25", :y2 "18", :x2 "12.75"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "14.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "20.25", :y2 "14.25", :x2 "15.75"}]]) + +(def bank + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:g + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "23.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "23.25", :x2 "23.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "19.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "19.25", :x2 "23.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "2", :y2 "16.25", :x2 "2"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "5.5", :y2 "16.25", :x2 "5.5"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "10.25", :y2 "16.25", :x2 "10.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "13.75", :y2 "16.25", :x2 "13.75"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "18.5", :y2 "16.25", :x2 "18.5"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "22", :y2 "16.25", :x2 "22"}] + [:path {:d "M23.25,7.25H.75L11.19,1a1.49,1.49,0,0,1,1.62,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]]) + +(def receipt + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:g + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "21.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "17.25", :y2 "21.75", :x2 "11.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "13.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "13.25", :x2 "15.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "9.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "9.75", :x2 "15.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "6.25", :x2 "15.25"}] + [:path {:d "M20.25.75h-1.5v5.5h4.5V3.75A3,3,0,0,0,20.25.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M13.5,17.25H3.75a3,3,0,0,0-3,3v3h10.5V19.5a2.25,2.25,0,0,1,4.5,0v.75a1.5,1.5,0,0,0,1.5,1.5h0a1.5,1.5,0,0,0,1.5-1.5V.75H8.25a3,3,0,0,0-3,3v13.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]]) + +(defn spinner [{:keys [class]}] + [:svg {:aria-hidden "true", :role "status", :class (str "animate-spin " class) :viewbox "0 0 100 101", :fill "none", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z", :fill "#E5E7EB"}] + [:path {:d "M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z", :fill "currentColor"}]]) + +(defn spinner-primary [{:keys [class]}] + [:svg {:aria-hidden "true", :role "status", :class (str "animate-spin " class) :viewbox "0 0 100 101", :fill "none", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z", :fill "#79b52e"}] + [:path {:d "M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z", :fill "currentColor"}]]) + +(def search + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "search"] + [:circle {:r "9.063", :stroke "currentColor", :transform "translate(-3.056 4.62) rotate(-23.025)", :fill "none", :stroke-linejoin "round", :stroke-linecap "round", :stroke-width "1.5px", :cx "9.813", :cy "9.812"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "16.22", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.221", :y2 "23.25", :x2 "23.25"}]]) + +(def moon + [:svg {:id "theme-toggle-dark-icon", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"}]]) + +(def sun + [:svg {:id "theme-toggle-light-icon", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z", :fill-rule "evenodd", :clip-rule "evenodd"}]]) + + +(def home + [:svg { :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:d "M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z"}]]) + +(def breadcrumb-component + [:svg { :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"} + [:path {:fill-rule "evenodd", :d "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", :clip-rule "evenodd"}]]) + +(def refresh + [:svg {:xmlns "http://www.w3.org/2000/svg", :aria-hidden "true", :fill "none", :viewbox "0 0 24 24", :stroke-width "1.5", :stroke "currentColor"} + [:path {:stroke-linecap "round", :stroke-linejoin "round", :d "M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"}]]) + + +(def upload + [:svg { :xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24", :stroke-width "2", :stroke "currentColor", :aria-hidden "true"} + [:path {:stroke-linecap "round", :stroke-linejoin "round", :d "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5"}]]) + +(def vendors + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "messages-people-user-dollar"] + [:circle {:cx "4.5", :cy "6.75", :r "3", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M8.25,17.25V15a3.75,3.75,0,0,0-7.5,0v2.25h1.5l.75,6H6l.75-6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M17.625,5.25H15a1.341,1.341,0,0,0-.5,2.587l2.654.826a1.341,1.341,0,0,1-.5,2.587H13.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "5.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "15.75", :y2 "3.75", :x2 "15.75"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "15.75", :y2 "11.25", :x2 "15.75"}] + [:path {:d "M11.251,15.748h3v4.5l4.5-4.5h3a1.5,1.5,0,0,0,1.5-1.5v-12a1.5,1.5,0,0,0-1.5-1.5h-12a1.5,1.5,0,0,0-1.5,1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]) + +(def report + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "app-window-pie-chart"] + [:rect {:y "2.253", :rx "1.5", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "21", :stroke-linecap "round", :stroke-width "1.5px", :x "1.51", :ry "1.5", :height "19.5"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.753", :stroke-linecap "round", :stroke-width "1.5px", :x1 "1.51", :y2 "6.753", :x2 "22.51"}] + [:circle {:cx "9.01", :cy "14.253", :r "4.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:polyline {:points "9.01 9.753 9.01 14.253 12.192 17.435", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "11.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "11.253", :x2 "19.51"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "14.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "14.253", :x2 "19.51"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "17.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "17.253", :x2 "19.51"}]]) + +(def government-building + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:g + [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "3.5", :height "6"}] + [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "10.5", :height "6"}] + [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "17.5", :height "6"}] + [:path {:d "M21.75,13.39a.87.87,0,0,1-.86.86H3.11a.86.86,0,0,1-.25-1.69l8.85-2.72a1,1,0,0,1,.58,0l8.85,2.72A.87.87,0,0,1,21.75,13.39Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:polyline {:points "15.5 8.25 18 8.25 18 11.6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:polyline {:points "6 11.6 6 8.25 8.5 8.25", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:path {:d "M6,8.25a6,6,0,0,1,12,0", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "0.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "12", :y2 "2.25", :x2 "12"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "23.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "23.25", :x2 "23.25"}] + [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "20.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "2", :y2 "20.25", :x2 "22"}]]]) + +(def external-link + [:svg + {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"} + [:defs] + [:title "navigation-next"] + [:path + {:d "M23,9.5H12.387a4,4,0,0,0-4,4v2", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:polyline + {:points "19 13.498 23 9.498 19 5.498", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:path + {:d + "M14.387,13v5.5a1,1,0,0,1-1,1h-12a1,1,0,0,1-1-1V6.5a1,1,0,0,1,1-1h12a1,1,0,0,1,1,1V7", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}]]) + +(def pencil + [:svg + {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"} + [:defs] + [:title "pencil"] + [:rect + {:y "1.09", + :stroke "currentColor", + :transform "translate(11.889 -5.238) rotate(45)", + :fill "none", + :stroke-linejoin "round", + :width "6", + :stroke-linecap "round", + :x "9.268", + :height "21.284"}] + [:polygon + {:points "2.621 17.136 0.5 23.5 6.864 21.379 2.621 17.136", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:path + {:d "M21.914,6.328,17.672,2.086l.707-.707a3,3,0,0,1,4.242,4.242Z", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}]]) + +(def drop-down + [:svg {:class "w-4 h-4 ml-2", :aria-hidden "true", :fill "none", :stroke "currentColor", :viewbox "0 0 24 24", :xmlns "http://www.w3.org/2000/svg"} + [:path {:stroke-linecap "round", :stroke-linejoin "round", :stroke-width "2", :d "M19 9l-7 7-7-7"}]]) + +(def download + [:svg + {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"} + [:defs] + [:title "download-thick-bottom"] + [:path + {:d + "M5.5,11.5c-.275,0-.341.159-.146.354l6.292,6.293a.5.5,0,0,0,.709,0l6.311-6.275c.2-.193.13-.353-.145-.355L15.5,11.5V1.5a1,1,0,0,0-1-1h-5a1,1,0,0,0-1,1V11a.5.5,0,0,1-.5.5Z", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:path + {:d "M23.5,18.5v4a1,1,0,0,1-1,1H1.5a1,1,0,0,1-1-1v-4", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}]]) + +(def trash + [:svg + {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"} + [:defs] + [:title "bin-1"] + [:path + {:d + "M21,4.5,19.188,21.709A2,2,0,0,1,17.2,23.5H6.8a2,2,0,0,1-1.989-1.791L3,4.5", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:line + {:x1 "0.5", + :y1 "4.5", + :x2 "23.5", + :y2 "4.5", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:path + {:d "M7.5,4.5v-3a1,1,0,0,1,1-1h7a1,1,0,0,1,1,1v3", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:line + {:x1 "12", + :y1 "9", + :x2 "12", + :y2 "19.5", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:line + {:x1 "16.5", + :y1 "9", + :x2 "16", + :y2 "19.5", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}] + [:line + {:x1 "7.5", + :y1 "9", + :x2 "8", + :y2 "19.5", + :fill "none", + :stroke "currentColor", + :stroke-linecap "round", + :stroke-linejoin "round"}]]) + +(def alert + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "alert-triangle"] + [:path {:d "M22.553,22.581a.569.569,0,0,1-.553.894H2a.569.569,0,0,1-.553-.894L11.553,2.37c.246-.492.648-.492.894,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "12", :y1 "16.979", :x2 "12", :y2 "9.979", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M11.991,18.979a.246.246,0,0,0-.241.255.255.255,0,0,0,.254.245h.005a.246.246,0,0,0,.241-.255A.255.255,0,0,0,12,18.979h-.005", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + +(def x + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "delete-2"] + [:circle {:cx "12", :cy "12", :r "11.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "7", :y1 "7", :x2 "17", :y2 "17", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "17", :y1 "7", :x2 "7", :y2 "17", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + + +(def filled-x + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:circle {:cx "12", :cy "12", :r "11.5", :fill "#FFF", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M24,12A12,12,0,1,0,12,24,12,12,0,0,0,24,12Zm-7.29,3.28a1,1,0,0,1,0,1.41,1,1,0,0,1-1.42,0l-3.11-3.11a.26.26,0,0,0-.35,0L8.72,16.69a1,1,0,0,1-1.41-1.41l3.11-3.11a.26.26,0,0,0,0-.35L7.31,8.71a1,1,0,0,1,0-1.42,1,1,0,0,1,1.41,0l3.11,3.11a.24.24,0,0,0,.35,0l3.11-3.11a1,1,0,1,1,1.42,1.42L13.6,11.82a.24.24,0,0,0,0,.35Z", :fill "currentColor"}]]) + +(def sort-down + [:svg {:id "Regular", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "arrow-thick-down-4"] + [:rect {:y "0.75", :rx "3", :stroke "currentColor", :transform "translate(0 24) rotate(-90)", :fill "none", :stroke-linejoin "round", :width "22.5", :stroke-linecap "round", :stroke-width "1.5px", :x "0.75", :ry "3", :height "22.5"}] + [:path {:d "M9.75,6v7.5L6.53,10.28a.75.75,0,0,0-1.28.531v2.068a1.5,1.5,0,0,0,.439,1.06L11.47,19.72a.749.749,0,0,0,1.06,0l5.781-5.781a1.5,1.5,0,0,0,.439-1.06V10.811a.75.75,0,0,0-1.28-.531L14.25,13.5V6a.75.75,0,0,0-.75-.75h-3A.75.75,0,0,0,9.75,6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]) + +(def sort-up + [:svg {:id "Regular", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "arrow-thick-up-4"] + [:rect {:y "0.75", :rx "3", :stroke "currentColor", :transform "translate(24 0) rotate(90)", :fill "none", :stroke-linejoin "round", :width "22.5", :stroke-linecap "round", :stroke-width "1.5px", :x "0.75", :ry "3", :height "22.5"}] + [:path {:d "M14.25,18V10.5l3.22,3.22a.75.75,0,0,0,1.28-.531V11.121a1.5,1.5,0,0,0-.439-1.06L12.53,4.28a.749.749,0,0,0-1.06,0L5.689,10.061a1.5,1.5,0,0,0-.439,1.06v2.068a.75.75,0,0,0,1.28.531L9.75,10.5V18a.75.75,0,0,0,.75.75h3A.75.75,0,0,0,14.25,18Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]) + +(def dashboard + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "gauge-dashboard"] + [:circle {:cx "12", :cy "14", :r "1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "13.06", :y1 "12.939", :x2 "18.011", :y2 "7.99", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "2.5", :y1 "14.5", :x2 "4.5", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "21.5", :y1 "14.5", :x2 "19.5", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "20.776", :y1 "10.365", :x2 "18.929", :y2 "11.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "15.635", :y1 "5.223", :x2 "14.87", :y2 "7.071", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "12", :y1 "4.5", :x2 "12", :y2 "6.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "8.365", :y1 "5.223", :x2 "9.13", :y2 "7.071", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "5.283", :y1 "7.282", :x2 "6.695", :y2 "8.697", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "3.224", :y1 "10.365", :x2 "5.07", :y2 "11.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M12,2.5A11.5,11.5,0,0,0,.5,14v3.5a1,1,0,0,0,1,1h21a1,1,0,0,0,1-1V14A11.5,11.5,0,0,0,12,2.5Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + +(def restaurant + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:g + [:line {:x1 "1", :y1 "14.5", :x2 "23", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "6", :y1 "17.5", :x2 "11", :y2 "17.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "7.5", :y1 "17.5", :x2 "6", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "9.5", :y1 "17.5", :x2 "11", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "6.25", :y1 "22.5", :x2 "10.75", :y2 "22.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "13", :y1 "17.5", :x2 "18", :y2 "17.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "14.5", :y1 "17.5", :x2 "13", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "16.5", :y1 "17.5", :x2 "18", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "13.25", :y1 "22.5", :x2 "17.75", :y2 "22.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "2.5", :y1 "23.5", :x2 "2.5", :y2 "7.33", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "21.5", :y1 "23.5", :x2 "21.5", :y2 "7.33", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M16,14.5V12a.5.5,0,0,1,.5-.5h1a.5.5,0,0,1,.5.5v2.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M7,14.5l-.64-1.28a.5.5,0,0,1,.45-.72h4.38a.5.5,0,0,1,.45.72L11,14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M6.5,4H.5V1.5a1,1,0,0,1,1-1h5Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:rect {:x "6.5", :y "0.5", :width "5.5", :height "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:rect {:x "12", :y "0.5", :width "5.5", :height "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M23.5,4h-6V.5h5a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M23.5,4v.5a3,3,0,0,1-6,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M6.5,4v.5a3,3,0,0,1-6,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M17.5,4v.75a2.75,2.75,0,0,1-5.5,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M12,4v.75a2.75,2.75,0,0,1-5.5,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]]) + +(def user + [:svg {:id "Light", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "single-man"] + [:path {:d "M3,22.75a9,9,0,0,1,18,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:circle {:cx "12", :cy "6.75", :r "5.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M7.261,3.958A9.124,9.124,0,0,0,13.833,6.75a9.138,9.138,0,0,0,3.617-.744", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + + +(def accounts + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "accounting-abacus"] + [:rect {:y "0.5", :rx "1", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "21", :stroke-linecap "round", :x "1.504", :ry "1", :height "23"}] + [:line {:x1 "15.504", :y1 "20.5", :x2 "15.504", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "8.504", :y1 "17.5", :x2 "8.504", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M10.5,4.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M10.5,6.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M17.5,13.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M17.5,19.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M10.5,16.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M17.5,4.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "8.504", :y1 "7.5", :x2 "8.504", :y2 "15.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "8.504", :y1 "3.5", :x2 "8.504", :y2 "0.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "15.504", :y1 "14.5", :x2 "15.504", :y2 "18.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "15.504", :y1 "5.5", :x2 "15.504", :y2 "12.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "15.504", :y1 "0.5", :x2 "15.504", :y2 "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + + +(def cog + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "cash-toggle"] + [:path {:d "M19.923,7.212a1.874,1.874,0,0,0,1.065,2.571l1.265.45a1.875,1.875,0,0,1,0,3.534l-1.265.45a1.874,1.874,0,0,0-1.065,2.571L20.5,18A1.874,1.874,0,0,1,18,20.5l-1.213-.576a1.874,1.874,0,0,0-2.571,1.065l-.45,1.265a1.875,1.875,0,0,1-3.534,0l-.45-1.265a1.874,1.874,0,0,0-2.571-1.065L6,20.5A1.874,1.874,0,0,1,3.5,18l.576-1.213a1.874,1.874,0,0,0-1.065-2.571l-1.265-.45a1.875,1.875,0,0,1,0-3.534l1.265-.45A1.874,1.874,0,0,0,4.077,7.212L3.5,6A1.874,1.874,0,0,1,6,3.5l1.213.576A1.874,1.874,0,0,0,9.783,3.012l.45-1.265a1.875,1.875,0,0,1,3.534,0l.45,1.265a1.874,1.874,0,0,0,2.571,1.065L18,3.5A1.874,1.874,0,0,1,20.5,6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M13.5,9H11.467a1.342,1.342,0,0,0-.5,2.587l2.064.826a1.342,1.342,0,0,1-.5,2.587H10.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "12", :y1 "16", :x2 "12", :y2 "15", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "12", :y1 "9", :x2 "12", :y2 "8", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:circle {:cx "12", :cy "12", :r "6.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + +(def question + [:svg {:xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24"} + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M9.5116 9.51125C9.5116 8.92057 9.68675 8.34316 10.0149 7.85203C10.3431 7.3609 10.8095 6.97811 11.3552 6.75207C11.9009 6.52603 12.5014 6.46689 13.0807 6.58212C13.6601 6.69736 14.1922 6.98179 14.6099 7.39946C15.0276 7.81714 15.312 8.34928 15.4272 8.92861C15.5425 9.50794 15.4833 10.1084 15.2573 10.6541C15.0312 11.1999 14.6485 11.6663 14.1573 11.9944C13.6662 12.3226 13.0888 12.4978 12.4981 12.4978V15.4843"}] + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M23.4486 12C23.4488 11.2025 23.2094 10.4233 22.7616 9.76338C22.3138 9.10345 21.6781 8.5932 20.937 8.29872C21.2535 7.56634 21.3428 6.75575 21.1931 5.97204C21.0435 5.18834 20.6619 4.46766 20.0977 3.90343C19.5336 3.3392 18.813 2.95744 18.0293 2.80766C17.2457 2.65787 16.4351 2.74695 15.7026 3.06336C15.4084 2.32189 14.8983 1.68587 14.2383 1.23773C13.5784 0.789596 12.799 0.550003 12.0013 0.550003C11.2036 0.550003 10.4243 0.789596 9.76434 1.23773C9.1044 1.68587 8.59426 2.32189 8.30005 3.06336C7.56756 2.74664 6.75681 2.65732 5.97294 2.80697C5.18907 2.95662 4.46825 3.33834 3.90396 3.90263C3.33967 4.46692 2.95794 5.18774 2.80829 5.97161C2.65864 6.75548 2.74797 7.56623 3.06469 8.29872C2.32321 8.59293 1.68719 9.10307 1.23906 9.76301C0.790923 10.423 0.551331 11.2023 0.551331 12C0.551331 12.7977 0.790923 13.577 1.23906 14.237C1.68719 14.8969 2.32321 15.4071 3.06469 15.7013C2.74814 16.4337 2.6589 17.2443 2.80854 18.028C2.95818 18.8117 3.3398 19.5324 3.90392 20.0966C4.46804 20.6608 5.18865 21.0426 5.97233 21.1924C6.75601 21.3421 7.56661 21.2531 8.29905 20.9366C8.59327 21.6781 9.1034 22.3141 9.76335 22.7623C10.4233 23.2104 11.2026 23.45 12.0003 23.45C12.7981 23.45 13.5774 23.2104 14.2373 22.7623C14.8973 22.3141 15.4074 21.6781 15.7016 20.9366C16.4341 21.2531 17.2447 21.3421 18.0283 21.1924C18.812 21.0426 19.5326 20.6608 20.0968 20.0966C20.6609 19.5324 21.0425 18.8117 21.1921 18.028C21.3418 17.2443 21.2525 16.4337 20.936 15.7013C21.6773 15.407 22.3132 14.8968 22.7612 14.2368C23.2092 13.5769 23.4487 12.7976 23.4486 12Z"}] + [:path {:stroke "currentColor", :d "M12.4981 17.973C12.3606 17.973 12.2492 17.8616 12.2492 17.7242C12.2492 17.5867 12.3606 17.4753 12.4981 17.4753"}] + [:path {:stroke "currentColor", :d "M12.4981 17.973C12.6356 17.973 12.747 17.8616 12.747 17.7242C12.747 17.5867 12.6356 17.4753 12.4981 17.4753"}]]) + +(def rabbit + [:svg {:xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24"} + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M9 21.5H6.5"}] + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M6.52169 19.4653H7.51807"}] + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M6.52268 21.4561C6.25869 21.4561 6.00551 21.3512 5.81884 21.1646C5.63217 20.9779 5.5273 20.7247 5.5273 20.4607C5.5273 20.1967 5.63217 19.9435 5.81884 19.7569C6.00551 19.5702 6.25869 19.4653 6.52268 19.4653"}] + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M7.51806 10.5069C9.50883 10.5069 11.3443 11.9999 12.495 15.4838C12.9927 16.9769 14.4857 21.4561 14.4857 21.4561H18.4673C18.7313 21.4561 18.9844 21.5609 19.1711 21.7476C19.3578 21.9343 19.4626 22.1875 19.4626 22.4515C19.4626 22.7154 19.3578 22.9686 19.1711 23.1553C18.9844 23.342 18.7313 23.4468 18.4673 23.4468H12.495C12.495 23.4468 10.979 20.9733 10.0483 19.4653C8.51345 16.9769 5.65172 15.5246 3.66096 14.1559C1.6702 12.7873 0.324441 9.73645 2.04346 7.52073C4.28208 4.63412 8.59606 5.77881 9.97367 7.37142L13.8049 11.2036C13.9426 11.3462 14.1074 11.46 14.2895 11.5382C14.4717 11.6165 14.6676 11.6577 14.8659 11.6594C15.0641 11.6611 15.2607 11.6233 15.4442 11.5483C15.6277 11.4732 15.7944 11.3623 15.9346 11.2221C16.0748 11.082 16.1857 10.9153 16.2607 10.7318C16.3358 10.5483 16.3736 10.3517 16.3719 10.1534C16.3701 9.95516 16.3289 9.75924 16.2507 9.57708C16.1724 9.39492 16.0587 9.23017 15.9161 9.09244L9.94381 3.10323C9.66371 2.823 9.50641 2.44298 9.5065 2.04677C9.5066 1.65057 9.66408 1.27062 9.94431 0.990528C10.2245 0.710433 10.6046 0.553129 11.0008 0.553223C11.397 0.553316 11.7769 0.710798 12.057 0.991026L22.2617 11.1957C22.6601 11.5395 22.974 11.9705 23.1791 12.4552C23.3841 12.9399 23.4748 13.4653 23.4442 13.9907C23.4442 15.4838 22.4488 16.4792 20.458 16.4792H17.9696L15.4751 18.2271"}] + [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M1.73291 7.98666C1.46709 7.9302 1.22172 7.80228 1.02324 7.61666C0.824763 7.43105 0.680706 7.19479 0.606596 6.93334C0.532486 6.6719 0.531133 6.39518 0.602684 6.13303C0.674235 5.87087 0.815976 5.63321 1.01263 5.44567C1.20928 5.25812 1.45339 5.1278 1.71864 5.06875C1.9839 5.00971 2.26024 5.02417 2.51788 5.11059C2.77551 5.197 3.00468 5.3521 3.18068 5.55915C3.35668 5.7662 3.47284 6.01735 3.51663 6.28555"}] + [:path {:stroke "currentColor", :d "M20.458 13.742C20.3206 13.742 20.2092 13.6305 20.2092 13.4931C20.2092 13.3557 20.3206 13.2443 20.458 13.2443"}] + [:path {:stroke "currentColor", :d "M20.458 13.742C20.5955 13.742 20.7069 13.6305 20.7069 13.4931C20.7069 13.3557 20.5955 13.2443 20.458 13.2443"}]]) + + +(def arrow-in + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "download-thick-box"] + [:polygon {:points "15.5 14.5 15.5 8.5 8.5 8.5 8.5 14.5 5.5 14.5 12 21 18.469 14.5 15.5 14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:path {:d "M22.629,4.572A6.22,6.22,0,0,1,23,6.5v16a1,1,0,0,1-1,1H2a1,1,0,0,1-1-1V6.5a6.22,6.22,0,0,1,.371-1.928L2.629,1.428A1.6,1.6,0,0,1,4,.5H20a1.6,1.6,0,0,1,1.371.928Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "12", :y1 "6", :x2 "12", :y2 "0.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}] + [:line {:x1 "1.034", :y1 "6", :x2 "22.966", :y2 "6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + +(def thumbs-up + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "like"] + [:path {:d "M19.5,16.065h0a1.5,1.5,0,0,1,0,3h-1a1.5,1.5,0,0,1,0,3H12c-4,0-3-2-11-2v-9H4a7.949,7.949,0,0,0,7.5-8c0-1.581,3-1.781,3,1.219a31.593,31.593,0,0,1-1,5.781h8a1.5,1.5,0,0,1,0,3h-1a1.5,1.5,0,0,1,0,3h-1", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) + +(def thumbs-down + [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"} + [:defs] + [:title "dislike"] + [:path {:d "M4.5,8h0a1.5,1.5,0,0,1,0-3h1a1.5,1.5,0,0,1,0-3H12c4,0,3,1.87,11,1.87V13H20a7.811,7.811,0,0,0-7.5,7.856c0,1.582-3,1.813-3-1.187A29.774,29.774,0,0,1,10.5,14h-8a1.5,1.5,0,0,1,0-3h1a1.5,1.5,0,0,1,0-3h1", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]) diff --git a/src/clj/auto_ap/ssr/transaction/insights.clj b/src/clj/auto_ap/ssr/transaction/insights.clj index 9a15813e..77ee295b 100644 --- a/src/clj/auto_ap/ssr/transaction/insights.clj +++ b/src/clj/auto_ap/ssr/transaction/insights.clj @@ -1,16 +1,18 @@ (ns auto-ap.ssr.transaction.insights (:require + [auto-ap.client-routes :as client-routes] [auto-ap.datomic :refer [conn visible-clients]] - [auto-ap.shared-views.company.sidebar :refer [company-side-bar]] + [auto-ap.rule-matching :refer [spread-cents]] [auto-ap.ssr-routes :as ssr-routes] + [auto-ap.ssr.components :as com] + [auto-ap.ssr.svg :as svg] [auto-ap.ssr.ui :refer [base-page]] [auto-ap.ssr.utils :refer [html-response]] [auto-ap.time :as atime] [bidi.bidi :as bidi] [clj-time.coerce :as coerce] [datomic.api :as dc] - [hiccup2.core :as hiccup] - [clj-time.core :as time])) + [iol-ion.tx :refer [random-tempid]])) (def pull-expr [:transaction/description-original :db/id @@ -25,98 +27,139 @@ (defn transaction-recommendations [identity selected-client & {:keys [after]}] (let [visible-clients (visible-clients identity)] - (->> - (dc/q '[:find (pull ?t pull-expr) - :in $ [?c ...] pull-expr - :where [?t :transaction/recommended-account] - [?t :transaction/client ?c] - [?t :transaction/approval-status :transaction-approval-status/unapproved] - (not [?t :transaction/vendor])] - (dc/db conn) - (if selected-client - [selected-client] - visible-clients) - pull-expr) - (map first) - (sort-by :transaction/date) - (reverse) - (drop-while (fn [x] - (if after - (not= (Long/parseLong after) (:db/id x)) - false))) - (#(if after + (->> + (dc/qseq {:query '[:find (pull ?t pull-expr) + :in $ [?c ...] pull-expr + :where [?t :transaction/recommended-account] + [?t :transaction/client ?c] + [?t :transaction/approval-status :transaction-approval-status/unapproved] + (not [?t :transaction/vendor])] + :args [(dc/db conn) + (if selected-client + [selected-client] + visible-clients) + pull-expr]}) + (map first) + (sort-by :transaction/date) + (reverse) + (drop-while (fn [x] + (if after + (not= (Long/parseLong after) (:db/id x)) + false))) + (#(if after (drop 1 %) %)) - (take 10) - (into [])))) + (take 10) + (into [])))) (defn transaction-row [r & {:keys [hide-actions? class last?]}] - [:tr (cond-> {:class class} - last? (assoc :hx-get (bidi/path-for ssr-routes/only-routes - :transaction-insight-rows - :after (:db/id r)) - :hx-trigger "intersect once" - :hx-indicator "#insight-table" - :hx-swap "afterend")) - [:td {:style {:width "8em"}}(:client/code (:transaction/client r))] - [:td {:style {:width "10em"}} (:bank-account/code (:transaction/bank-account r))] - [:td {:style {:width "12em"}} (some-> (:transaction/date r) coerce/to-date-time (atime/unparse-local atime/normal-date))] - [:td {:style {:width "30em" :max-width "30em"}} (str (:transaction/description-original r))] - [:td {:style {:width "10em"}} - (if (> (:transaction/amount r) 0.0 ) - [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))] - [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])] - [:td {:style {:width "12em"}} - [:div [:div.tag (:vendor/name (:transaction/recommended-vendor r))]] - [:div [:div.tag (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r)))]] - [:div [:div.tag - {:class (cond - (> (:transaction/account-confidence r) 0.90) - "is-success is-light" - (> (:transaction/account-confidence r) 0.80) - "is-info is-light" + (com/data-grid-row + (cond-> {:class class} + last? (assoc :hx-get (bidi/path-for ssr-routes/only-routes + :transaction-insight-rows + :after (:db/id r)) + :hx-trigger "intersect once" + :hx-indicator "#insight-table" + :hx-swap "afterend")) + (com/data-grid-cell {} (:client/code (:transaction/client r))) + (com/data-grid-cell {} (:bank-account/code (:transaction/bank-account r))) + (com/data-grid-cell {} (some-> (:transaction/date r) coerce/to-date-time (atime/unparse-local atime/normal-date))) - :else - "is-warning is-light")} - (str "%" (Math/round (* 100.0 (:transaction/account-confidence r))))]]] - [:td - (when-not hide-actions? - [:div.buttons - [:button.button {:hx-post (bidi/path-for ssr-routes/only-routes - :transaction-insight-approve - :transaction-id (:db/id r)) - :hx-target "closest tr"} - [:i.fa.fa-thumbs-up ]] - [:button.button - [:i.fa.fa-thumbs-down ]] - [:a.button {:hx-get (bidi/path-for ssr-routes/only-routes - :transaction-insight-explain - :transaction-id (:db/id r)) - :hx-target "#modal-holder" - :hx-swap "beforeend"} - [:i.fa.fa-question ]]])]]) + (com/data-grid-cell {} (str (:transaction/description-original r))) + (com/data-grid-cell {} + (if (> (:transaction/amount r) 0.0) + [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))] + [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])) + (com/data-grid-cell {:style {:width "12em"}} + [:div.flex.gap-2.flex-wrap {:style {:width "12em"}} + (com/pill {:color :primary} (:vendor/name (:transaction/recommended-vendor r))) + (com/pill {:color :secondary} (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r)))) + (com/pill {:class (cond + (> (:transaction/account-confidence r) 0.90) + "is-success is-light" + (> (:transaction/account-confidence r) 0.80) + "is-info is-light" + + :else + "is-warning is-light")} (str "%" (Math/round (* 100.0 (:transaction/account-confidence r)))))]) + (com/data-grid-right-stack-cell {} + (when-not hide-actions? + [:form.flex.gap-2 + [:input {:type :hidden :name "id" :value (:db/id r)}] + (com/icon-button {:hx-post (bidi/path-for ssr-routes/only-routes + :transaction-insight-approve + :transaction-id (:db/id r)) + :hx-target "closest tr" + :color :primary-light} + svg/thumbs-up) + (com/icon-button {:hx-delete (bidi/path-for ssr-routes/only-routes + :transaction-insight-disapprove + :transaction-id (:db/id r)) + :hx-target "closest tr" + :color :danger-light} + svg/thumbs-down) + (com/icon-button {:hx-get (bidi/path-for ssr-routes/only-routes + :transaction-insight-explain + :transaction-id (:db/id r)) + :hx-target "#modal-holder" + :hx-swap "outerHTML"} + svg/question)])))) (defn approve [{:keys [identity session] {:keys [transaction-id]} :route-params}] - (html-response (transaction-row - (dc/pull (dc/db conn) - pull-expr - (Long/parseLong transaction-id)) - :auto-remove? true - :hide-actions? true - :class "live-added"))) + (let [approval-details (dc/pull (dc/db conn) [{:transaction/recommended-account [:account/location :db/id]} + :transaction/recommended-vendor + :transaction/amount + :db/id + {:transaction/client [:client/locations]} ] + (cond-> transaction-id + string? (Long/parseLong))) + cents-to-distribute (int (Math/round (Math/abs (* (:transaction/amount approval-details) 100)))) + valid-locations (or + (some-> approval-details :transaction/recommended-account :account/location vector) + (->> approval-details + :transaction/client + :client/locations)) + updated-transaction [:upsert-transaction {:db/id (:db/id approval-details) + :transaction/approval-status :transaction-approval-status/approved + :transaction/vendor (:transaction/recommended-vendor approval-details) + :transaction/accounts (->> valid-locations + (map + (fn [cents location] + {:db/id (random-tempid) + :transaction-account/account (-> approval-details :transaction/recommended-account :db/id) + :transaction-account/amount (* 0.01 cents) + :transaction-account/location location}) + (spread-cents cents-to-distribute (count valid-locations))))}]] + @(dc/transact conn [updated-transaction]) + (html-response (transaction-row + (dc/pull (dc/db conn) + pull-expr + (Long/parseLong transaction-id)) + :auto-remove? true + :hide-actions? true + :class "live-added")))) + +(defn disapprove [{:keys [identity session] {:keys [transaction-id]} :route-params}] + (let [transaction-id (cond-> transaction-id string? (Long/parseLong))] + @(dc/transact conn [[:upsert-transaction {:db/id transaction-id :transaction/recommended-account nil :transaction/recommended-vendor nil}]]) + (html-response (transaction-row + (dc/pull (dc/db conn) pull-expr transaction-id) + :auto-remove? true + :hide-actions? true + :class "live-removed")))) (defn explain [{:keys [identity session] {:keys [transaction-id]} :route-params}] (let [r (dc/pull (dc/db conn) - pull-expr - (Long/parseLong transaction-id)) + pull-expr + (Long/parseLong transaction-id)) similar (->> (dc/q '[:find ?date ?do ?amt :in $ ?tr :where [(iol-ion.query/recent-date 180) ?start-date] [?tr :transaction/client ?c] - [?tr :transaction/recommended-account ?a ] - [?tr :transaction/recommended-vendor ?v ] + [?tr :transaction/recommended-account ?a] + [?tr :transaction/recommended-vendor ?v] [?t2 :transaction/client ?c] [?t2 :transaction/date ?date] [(>= ?date ?start-date)] @@ -130,38 +173,31 @@ (take 5) sort reverse)] - (html-response [:div.modal.is-active.wide - [:div.modal-background {"_" (hiccup/raw "on click remove <#modal-holder div/>")}] - [:div.modal-card - [:div.modal-card-head - [:h1.title "Similar transactions"] - [:div.tags - [:div.tag.is-large.is-info.is-light (:vendor/name (:transaction/recommended-vendor r))] - [:div.tag.is-large.is-info.is-light (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r)))]]] - [:div.modal-card-body - [:table.table - [:thead - [:tr - [:td "Date"] - [:td "Description"] - [:td "Amount"]]] - [:tbody - [:tr - [:th (some-> r :transaction/date coerce/to-date-time (atime/unparse-local atime/normal-date))] - [:th (-> r :transaction/description-original)] - [:th (if (> (-> r :transaction/amount) 0.0 ) - [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))] - [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])]] - (for [[date description amt] similar] - [:tr - [:td (some-> date coerce/to-date-time (atime/unparse-local atime/normal-date))] - [:td description] - [:td (if (> amt 0.0 ) - [:div.tag.is-success.is-light (str "$" (Math/round amt))] - [:div.tag.is-danger.is-light (str "$" (Math/round amt))])]])]] - - ]] - [:button.modal-close.is-large {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]]))) + (html-response + (com/modal {} + (com/modal-card {:style {:width "900px"}} + [:div.flex [:div.p-2 "Similar Transactions"]] + [:table.w-full + [:thead + [:tr + [:td "Date"] + [:td "Description"] + [:td "Amount"]]] + [:tbody + [:tr + [:th.text-left (some-> r :transaction/date coerce/to-date-time (atime/unparse-local atime/normal-date))] + [:th.text-left (-> r :transaction/description-original)] + [:th.text-left (if (> (-> r :transaction/amount) 0.0) + [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))] + [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])]] + (for [[date description amt] similar] + [:tr + [:td (some-> date coerce/to-date-time (atime/unparse-local atime/normal-date))] + [:td description] + [:td (if (> amt 0.0) + [:div.tag.is-success.is-light (str "$" (Math/round amt))] + [:div.tag.is-danger.is-light (str "$" (Math/round amt))])]])]] + [:div]))))) (defn transaction-rows* [{:keys [selected-client identity after]}] (let [recommendations (transaction-recommendations identity selected-client :after after)] @@ -178,28 +214,23 @@ :after (:after route-params)}))) (defn insight-table* [{:keys [selected-client identity]}] - [:div#insight-table {:hx-get (bidi/path-for ssr-routes/only-routes - :transaction-insight-table - :request-method :get) - :hx-trigger "clientSelected from:body" - :hx-swap "outerHTML swap:100ms"} - - [:table.table - [:thead - [:tr - [:td "Client"] - [:td "Account"] - [:td "Date"] - [:td "Description"] - [:td "Amount"] - [:td "Vendor / Account"] - [:td "action"]]] - [:tbody - (transaction-rows* {:selected-client selected-client - :identity identity})]] - [:div.container.htmx-indicator - [:div.column.is-4.is-offset-4.has-text-centered - [:div.loader.is-loading.is-active.big.is-centered]]]]) + (let [recommendations (transaction-recommendations identity selected-client)] + (com/data-grid-card {:id "insight-table" + :title "Transaction Insights" + :route :transaction-insight-table + :paginate? false + :total (count recommendations) + :action-buttons nil + :rows (for [r recommendations + :let [last? (= r (last recommendations))]] + (transaction-row r :last? last?)) + :headers [(com/data-grid-header {} "Client") + (com/data-grid-header {} "Account") + (com/data-grid-header {} "Date") + (com/data-grid-header {} "Description") + (com/data-grid-header {} "Amount") + (com/data-grid-header {:style {:width "4em"}} "Vendor / Account") + (com/data-grid-header {})]}))) (defn insight-table [{:keys [session identity]}] (html-response (insight-table* {:selected-client @@ -208,10 +239,24 @@ (defn page [{:keys [identity matched-route session] :as request}] (base-page - request - [:div - [:h1.title "Transaction Insights"] - (insight-table* {:selected-client - (-> session :client :db/id) - :identity identity})] - [:div (company-side-bar matched-route)])) + request + (com/page {:nav (com/main-aside-nav) + :active-client (:client (:session request)) + :identity (:identity request) + :app-params {:hx-get (bidi/path-for ssr-routes/only-routes + :admin-history) + :hx-trigger "clientSelected from:body" + :hx-select "#app-contents" + :hx-swap "outerHTML swap:300ms"}} + (com/breadcrumbs {} + [:a {:href (bidi/path-for client-routes/routes + :transactions)} + "Transactions"] + [:a {:href (bidi/path-for ssr-routes/only-routes + :transaction-insights)} + "Insights"]) + (insight-table* {:selected-client + (-> session :client :db/id) + :identity identity})) + + "Transaction Insights")) diff --git a/src/clj/auto_ap/ssr/ui.clj b/src/clj/auto_ap/ssr/ui.clj index 98adeefb..39974204 100644 --- a/src/clj/auto_ap/ssr/ui.clj +++ b/src/clj/auto_ap/ssr/ui.clj @@ -1,9 +1,5 @@ (ns auto-ap.ssr.ui (:require - [auto-ap.client-routes :as client-routes] - [auto-ap.ssr.company-dropdown :as company-dropdown] - [auto-ap.ssr.login-dropdown :as login-dropdown] - [bidi.bidi :as bidi] [hiccup2.core :as hiccup])) (defn html-page [hiccup] @@ -15,69 +11,32 @@ {} hiccup))}) -(defn base-page [request contents side-bar-contents] - (html-page - [:html.has-navbar-fixed-top - [:head - [:meta {:charset "utf-8"}] - [:meta {:http-equiv "X-UA-Compatible", :content "IE=edge"}] - [:meta {:name "viewport", :content "width=device-width, initial-scale=1"}] - [:title "Integreat"] - [:link {:rel "stylesheet", :href "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css", :integrity "sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=", :crossorigin "anonymous"}] - [:link {:href "/css/font.min.css", :rel "stylesheet"}] - [:link {:rel "stylesheet", :href "/css/bulma.min.css"}] - [:link {:rel "stylesheet", :href "/css/bulma-calendar.min.css"}] - [:link {:rel "stylesheet", :href "/css/bulma-badge.min.css"}] - [:link {:rel "stylesheet", :href "/css/react-datepicker.min.inc.css"}] - [:link {:rel "stylesheet", :href "/css/animate.css"}] - [:link {:rel "stylesheet", :href "/finance-font/style.css"}] - [:link {:rel "stylesheet", :href "/css/main.css"}] - [:link {:rel "stylesheet", :href "https://unpkg.com/placeholder-loading/dist/css/placeholder-loading.min.css"}] - #_[:link {:rel "stylesheet", :href "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/css/autoComplete.min.css"}] - [:script {:src "https://unpkg.com/hyperscript.org@0.9.7"}] - [:script {:src "https://unpkg.com/@popperjs/core@2"}] - #_[:script {:src "https://unpkg.com/htmx.org@1.8.4" - :integrity "sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV" - :crossorigin= "anonymous"}] - [:script {:src "https://unpkg.com/htmx.org@1.9.0/dist/htmx.js" - :crossorigin= "anonymous"}] - [:script {:type "text/javascript", :src "https://cdn.yodlee.com/fastlink/v4/initialize.js", :async "async" }]] - [:script {:type "text/javascript", :src "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"}] - [:script {:src "https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"}] - [:link {:rel "stylesheet" :href "https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" :type "text/css"}] - [:body - [:div {:id "app"} - [:div - [:nav {:class "navbar has-shadow is-fixed-top is-grey"} - - [:div {:class "container"} - [:div {:class "navbar-brand"} - [:a {:class "navbar-item", :href "../"} - [:img {:src "/img/logo.png"}]]] - [:div.navbar-menu {:id "navMenu"} - [:div.navbar-start - [:a.navbar-item {:href "/"} - "Home" ] - [:a.navbar-item {:href (bidi/path-for client-routes/routes :unpaid-invoices)} - "Invoices" ] - [:a.navbar-item {:href (bidi/path-for client-routes/routes :payments)} - "Payments" ] - [:a.navbar-item {:href (bidi/path-for client-routes/routes :sales-orders)} - "POS" ] - [:a.navbar-item {:href (bidi/path-for client-routes/routes :transactions)} - "Transactions" ] - [:a.navbar-item {:href (bidi/path-for client-routes/routes :ledger)} - "Ledger" ]] - [:div.navbar-end - (company-dropdown/dropdown request) - (login-dropdown/dropdown request)]]]] - [:div {:class "columns has-shadow", :id "mail-app", :style "margin-bottom: 0px; height: calc(100vh - 46px);"} - [:aside {:class "column aside menu is-2 "} - [:div {:class "main left-nav"} - side-bar-contents]] - [:div {:class "column messages hero ", :id "message-feed", :style "overflow: auto;"} - [:div {:class "inbox-messages"} - contents]]] - [:div] - [:div {:id "dz-hidden"}]]] - [:div#modal-holder]]])) +(defn base-page [request contents page-name] + (html-page + [:html.has-navbar-fixed-top + [:head + [:meta {:charset "utf-8"}] + [:meta {:http-equiv "X-UA-Compatible", :content "IE=edge"}] + [:meta {:name "viewport", :content "width=device-width, initial-scale=1"}] + [:title (str "Integreat | " page-name)] + [:link {:href "/css/font.min.css", :rel "stylesheet"}] + [:link {:rel "icon" :type "image/png" :href "/favicon.png"}] + [:link {:rel "stylesheet", :href "/css/react-datepicker.min.inc.css"}] + [:link {:rel "stylesheet", :href "/output.css"}] + + [:script {:src "https://unpkg.com/hyperscript.org@0.9.7/dist/_hyperscript.min.js"}] + [:script {:src "https://unpkg.com/@popperjs/core@2.11.8/dist/umd/popper.min.js"}] + #_[:script {:src "https://unpkg.com/htmx.org@1.8.4" + :integrity "sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV" + :crossorigin= "anonymous"}] + [:script {:src "https://unpkg.com/htmx.org@1.9.0/dist/htmx.js" + :crossorigin= "anonymous"}] + [:script {:src "https://unpkg.com/htmx.org/dist/ext/debug.js"}] + [:script {:src "/js/htmx-disable.js"}] + [:script {:type "text/javascript", :src "https://cdn.yodlee.com/fastlink/v4/initialize.js", :async "async"}]] + [:script {:type "text/javascript", :src "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"}] + [:script {:src "https://unpkg.com/dropzone@5.9.3/dist/min/dropzone.min.js"}] + [:link {:rel "stylesheet" :href "https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" :type "text/css"}] + [:body {:hx-ext "disable-submit"} + contents + [:script {:src "/js/flowbite.min.js"}]]])) diff --git a/src/clj/auto_ap/ssr/utils.clj b/src/clj/auto_ap/ssr/utils.clj index 189762b8..929d5d64 100644 --- a/src/clj/auto_ap/ssr/utils.clj +++ b/src/clj/auto_ap/ssr/utils.clj @@ -2,7 +2,8 @@ (:require [auto-ap.logging :as alog] [config.core :refer [env]] - [hiccup2.core :as hiccup])) + [hiccup2.core :as hiccup] + [clojure.string :as str])) (defn html-response [hiccup & {:keys [status headers] :or {status 200 headers {}}}] {:status status @@ -39,3 +40,24 @@ (ex-message e)] :status 500))))))) +(defn form-data->map [form-data] + (reduce-kv + (fn [acc k v] + (cond (and (string? v) + (empty? v)) + acc + + :else + (assoc-in acc (->> (str/split k #"_") + (mapv #(apply keyword (str/split % #"/")))) + v))) + {} + form-data)) + +(defn path->name [k] + (cond (keyword? k) + (str (namespace k) "/" (name k)) + + (seq k) + (str/join "_" (map path->name k)) + :else k)) diff --git a/src/clj/auto_ap/yodlee/core2.clj b/src/clj/auto_ap/yodlee/core2.clj index 9437647c..04dd1ce5 100644 --- a/src/clj/auto_ap/yodlee/core2.clj +++ b/src/clj/auto_ap/yodlee/core2.clj @@ -13,7 +13,8 @@ [clj-time.coerce :as coerce] [datomic.api :as dc] [auto-ap.datomic :refer [conn]] - [auto-ap.datomic.clients :as d-clients])) + [auto-ap.datomic.clients :as d-clients] + [clojure.string :as str])) ;; switch all of this to use tokens instead of passing around client codes, particularly because the codes ;; need to be tweaked for repeats (defn client-code->login [client-code] @@ -61,7 +62,7 @@ (client/post (merge {:headers (assoc base-headers "loginName" (:yodlee2-admin-user env) "Content-Type" "application/x-www-form-urlencoded") - :body (str "clientId=" (:yodlee2-client-id env) " &secret=" (:yodlee2-client-secret env)) + :body (str "clientId=" (:yodlee2-client-id env) "&secret=" (:yodlee2-client-secret env)) :as :json} other-config) ) @@ -75,11 +76,13 @@ (log/info "logging in as " client-code) (-> (str (:yodlee2-base-url env) "/auth/token") (client/post (merge {:headers (assoc base-headers - "loginName" (if (<= (count client-code) 3) - (str client-code client-code) - client-code) + "loginName" (if (:yodlee2-test-user env) + (:yodlee2-test-user env) + (if (<= (count client-code) 3) + (str client-code client-code) + client-code)) "Content-Type" "application/x-www-form-urlencoded") - :body (str "clientId=" (:yodlee2-client-id env) " &secret=" (:yodlee2-client-secret env)) + :body (str "clientId=" (:yodlee2-client-id env) "&secret=" (:yodlee2-client-secret env)) :as :json} other-config) ) @@ -278,10 +281,6 @@ provider-accounts) vals))) - - - - (defn delete-provider-account [client-code id] (let [cob-session (login-user (client-code->login client-code))] diff --git a/src/cljc/auto_ap/ssr_routes.cljc b/src/cljc/auto_ap/ssr_routes.cljc index 9f4cdfba..a741d8f9 100644 --- a/src/cljc/auto_ap/ssr_routes.cljc +++ b/src/cljc/auto_ap/ssr_routes.cljc @@ -5,20 +5,30 @@ "admin" {"/history" {"" :admin-history "/" :admin-history #"/search/?" :admin-history-search - ["/" [#"\d+" :entity-id] #"/?"] :admin-history-search + ["/" [#"\d+" :entity-id] #"/?"] :admin-history ["/inspect/" [#"\d+" :entity-id] #"/?"] :admin-history-inspect} "/ezcater-xls" :admin-ezcater-xls} "transaction" {"/insights" {"" :transaction-insights "/table" :transaction-insight-table ["/approve/" [#"\d+" :transaction-id]] {:post :transaction-insight-approve} + ["/disapprove/" [#"\d+" :transaction-id]] {:delete :transaction-insight-disapprove} ["/rows/" [#"\d+" :after]] {:get :transaction-insight-rows} ["/explain/" [#"\d+" :transaction-id]] {:get :transaction-insight-explain}}} - "company" {"/dropdown" :company-dropdown-contents - "/active" {:put :active-client} - "/1099" :company-1099 - "/1099/table" {:get :company-1099-vendor-table} - "/1099/vendor-dialog" {["/" [#"\d+" :vendor-id]] {:get :company-1099-vendor-dialog - :post :company-1099-vendor-save}}}}) + "company" {"" :company + "/dropdown" :company-dropdown-search-results + "/active" {:put :active-client} + "/1099" :company-1099 + "/1099/table" {:get :company-1099-vendor-table} + "/1099/vendor-dialog" {["/" [#"\d+" :vendor-id]] {:get :company-1099-vendor-dialog + :post :company-1099-vendor-save}} + "/reports" {"" {:get :company-reports + :delete :company-reports-delete} + "/table" :company-reports-table} + "/yodlee" {"" {:get :company-yodlee} + "/table" {:get :company-yodlee-table} + "/fastlink" {:get :company-yodlee-fastlink-dialog} + "/refresh" {:put :company-yodlee-provider-account-refresh}} + }}) (def only-routes ["/" routes]) diff --git a/src/cljs/auto_ap/views/components/layouts.cljs b/src/cljs/auto_ap/views/components/layouts.cljs index b67e0d39..e342fc32 100644 --- a/src/cljs/auto_ap/views/components/layouts.cljs +++ b/src/cljs/auto_ap/views/components/layouts.cljs @@ -1,23 +1,21 @@ (ns auto-ap.views.components.layouts (:require [auto-ap.events :as events] + [auto-ap.forms :as forms] + [auto-ap.forms.builder :as form-builder] [auto-ap.routes :as routes] + [auto-ap.ssr-routes :as ssr-routes] [auto-ap.subs :as subs] [auto-ap.views.components.modal :as modal] [auto-ap.views.components.search :as search] [auto-ap.views.components.vendor-dialog :as vendor-dialog] [auto-ap.views.utils - :refer [active-when - appearing - dispatch-event-with-propagation - login-url]] + :refer [active-when appearing dispatch-event-with-propagation login-url]] [bidi.bidi :as bidi] [clojure.string :as str] [re-frame.core :as re-frame] [reagent.core :as r] - [auto-ap.forms.builder :as form-builder] - [vimsical.re-frame.cofx.inject :as inject] - [auto-ap.forms :as forms])) + [vimsical.re-frame.cofx.inject :as inject])) (defn navbar-drop-down [{:keys [ class]} _] (let [!child (r/atom nil)] @@ -47,19 +45,19 @@ (defn login-dropdown [] (let [user (re-frame/subscribe [::subs/user])] (if @user - [navbar-drop-down {:header [:span [:span.icon [:i.fa.fa-user] ] + [navbar-drop-down {:header [:span [:span.icon [:i.fa.fa-user]] [:span (:user/name @user)]] :id ::account} [:div [:a {:class "navbar-item" - :href (bidi/path-for routes/routes :reports)} "My company"] + :href (bidi/path-for auto-ap.ssr-routes/only-routes :company)} "My company"] [:a.dropdown-item {:on-click (dispatch-event-with-propagation [::vendor-dialog/started {}])} "New Vendor"] [:a.dropdown-item {:on-click (dispatch-event-with-propagation [::vendor-dialog/edit {}])} "Edit Vendor"] (when (= "admin" (:user/role @user)) [:a {:class "navbar-item" :href (bidi/path-for routes/routes :admin)} "Administration"]) [:hr {:class "navbar-divider"}] - [:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]] - [:a.navbar-item {:href login-url} "Login"]))) + [:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]] + [:a.navbar-item {:href (login-url)} "Login"]))) (re-frame/reg-sub ::client-search diff --git a/src/cljs/auto_ap/views/pages/login.cljs b/src/cljs/auto_ap/views/pages/login.cljs index abfb9547..76b63982 100644 --- a/src/cljs/auto_ap/views/pages/login.cljs +++ b/src/cljs/auto_ap/views/pages/login.cljs @@ -1,7 +1,8 @@ (ns auto-ap.views.pages.login (:require [auto-ap.views.utils :refer [login-url]] - [re-frame.core :as re-frame])) + [re-frame.core :as re-frame] + [cemerick.url :as url])) (re-frame/reg-sub ::logout-reason @@ -17,9 +18,9 @@ [:div.notification.is-warning reason]) [:h1.title "Login"] [:div.box.slideInFromBelow - + [:img {:src "/img/logo-big.png"}] [:div - [:a.button.is-large.is-primary {:href login-url} "Login with Google"]]] + [:a.button.is-large.is-primary {:href (doto (login-url (get (:query (url/url (.-location js/window))) "redirect-to")) println)} "Login with Google"]]] [:p.has-text-gray "Copyright Integreat 2018"]]]]]]) diff --git a/src/cljs/auto_ap/views/pages/needs_activation.cljs b/src/cljs/auto_ap/views/pages/needs_activation.cljs index ffead368..27bc2d9d 100644 --- a/src/cljs/auto_ap/views/pages/needs_activation.cljs +++ b/src/cljs/auto_ap/views/pages/needs_activation.cljs @@ -12,11 +12,11 @@ (defn needs-activation-page [] - [:div + [:div [:h2 "Sorry, your user is not activated yet. Please have Ben Skinner enable your account. Click " [:a {:on-click (fn [] (re-frame/dispatch-sync [::relogin]) true) - :href login-url} + :href (login-url)} "here"] " to try again."]]) diff --git a/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs b/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs index 36a7d887..8e993836 100644 --- a/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs +++ b/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs @@ -21,56 +21,55 @@ user @(re-frame/subscribe [::subs/user]) client @(re-frame/subscribe [::subs/client])] [:div - [:div [:p.menu-label "Type"] - [:ul.menu-list - [:li.menu-item - [:a.item {:href (bidi/path-for routes/routes :transactions) - :class [(active-when ap = :transactions)]} - [:span {:class "icon" :style {:font-size "25px"}}] - [:span {:class "name"} "All"]]] - [:li.menu-item - [:a.item {:href (bidi/path-for routes/routes :unapproved-transactions) - :class [(active-when ap = :unapproved-transactions)]} - [:span {:class "icon icon-task-list-text-1" :style {:font-size "25px"}}] - [:span {:class "name"} "Unapproved"]]] - [:li.menu-item - [:a.item {:href (bidi/path-for routes/routes :requires-feedback-transactions) - :class [(active-when ap = :requires-feedback-transactions)]} + [:div [:p.menu-label "Type"] + [:ul.menu-list + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :transactions) + :class [(active-when ap = :transactions)]} + [:span {:class "icon" :style {:font-size "25px"}}] + [:span {:class "name"} "All"]]] + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :unapproved-transactions) + :class [(active-when ap = :unapproved-transactions)]} + [:span {:class "icon icon-task-list-text-1" :style {:font-size "25px"}}] + [:span {:class "name"} "Unapproved"]]] + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :requires-feedback-transactions) + :class [(active-when ap = :requires-feedback-transactions)]} - [:span {:class "icon icon-task-list-question" :style {:font-size "25px"}}] - - [:span {:class "name"} "Client Review"]]] - [:li.menu-item - [:a.item {:href (bidi/path-for routes/routes :approved-transactions) - :class [(active-when ap = :approved-transactions)]} + [:span {:class "icon icon-task-list-question" :style {:font-size "25px"}}] - [:span {:class "icon icon-task-list-check-1" :style {:font-size "25px"}}] - - [:span {:class "name"} "Approved"]]] - [:li.menu-item - [:a.item {:href (bidi/path-for routes/routes :excluded-transactions) - :class [(active-when ap = :excluded-transactions)]} + [:span {:class "name"} "Client Review"]]] + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :approved-transactions) + :class [(active-when ap = :approved-transactions)]} - [:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}] - - [:span {:class "name"} "Excluded"]]] + [:span {:class "icon icon-task-list-check-1" :style {:font-size "25px"}}] + + [:span {:class "name"} "Approved"]]] + [:li.menu-item + [:a.item {:href (bidi/path-for routes/routes :excluded-transactions) + :class [(active-when ap = :excluded-transactions)]} + + [:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}] + + [:span {:class "name"} "Excluded"]]] + (when @(re-frame/subscribe [::subs/is-admin?]) [:li.menu-item [:a.item {:href (bidi/path-for ssr-routes/only-routes :transaction-insights) :class [(active-when ap = :transaction-insights)]} [:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}] - - [:span {:class "name"} "Insights"]]] - ]] - (when client - [:<> + + [:span {:class "name"} "Insights"]]])]] + (when client + [:<> [:p.menu-label "Bank Account"] - [:div + [:div [bank-account-filter {:on-change-event [::data-page/filter-changed data-page :bank-account] :value @(re-frame/subscribe [::data-page/filter data-page :bank-account]) :bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]]) - [:p.menu-label "Financial Account"] [:div @@ -79,7 +78,7 @@ {:query i :client-id (:id client)} [:name :id]]) - :entity->text (fn [x ] (str (:numeric-code x) " - " (:name x))) + :entity->text (fn [x] (str (:numeric-code x) " - " (:name x))) :type "typeahead-v3" :on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account (some-> % (select-keys [:name :id :numeric-code]))]) :value @(re-frame/subscribe [::data-page/filter data-page :account])}]] @@ -94,13 +93,11 @@ :on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %]) :value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]] - - [:p.menu-label "Amount"] - [:div - [number-filter - {:on-change-event [::data-page/filter-changed data-page :amount-range] - :value @(re-frame/subscribe [::data-page/filter data-page :amount-range])}]] + [:div + [number-filter + {:on-change-event [::data-page/filter-changed data-page :amount-range] + :value @(re-frame/subscribe [::data-page/filter data-page :amount-range])}]] [:p.menu-label "Date Range"] [:div @@ -108,33 +105,31 @@ {:on-change-event [::data-page/filter-changed data-page :date-range] :value @(re-frame/subscribe [::data-page/filter data-page :date-range])}]] - [:p.menu-label "Location"] [:div.field [:div.control [:input.input {:placeholder "SC" :style {:width "3em"} :value @(re-frame/subscribe [::data-page/filter data-page :location]) - :on-change (dispatch-value-change [::data-page/filter-changed data-page :location ])} ]]] + :on-change (dispatch-value-change [::data-page/filter-changed data-page :location])}]]] - [:p.menu-label "Description"] - [:div - [:div.field - [:div.control [:input.input {:placeholder "CHECK 123 ABC" - :value @(re-frame/subscribe [::data-page/filter data-page :description]) - :on-change (dispatch-value-change [::data-page/filter-changed data-page :description])} ]]]] + [:p.menu-label "Description"] + [:div + [:div.field + [:div.control [:input.input {:placeholder "CHECK 123 ABC" + :value @(re-frame/subscribe [::data-page/filter data-page :description]) + :on-change (dispatch-value-change [::data-page/filter-changed data-page :description])}]]]] (when-let [exact-match-id @(re-frame/subscribe [::data-page/filter data-page :exact-match-id])] [:div [:p.menu-label "Specific Transaction"] [:span.tag.is-medium exact-match-id " " [:button.delete.is-small {:on-click (dispatch-event [::data-page/filter-changed data-page :exact-match-id nil])}]]]) - (when (= "admin" (:user/role user)) [:<> - + [:p.menu-label "Admin only"] - [:div + [:div [switch-field {:id "unresolved-only" :checked (boolean @(re-frame/subscribe [::data-page/filter data-page :unresolved])) :on-change (fn [e] @@ -149,7 +144,7 @@ [:button.delete.is-small {:on-click (dispatch-event [::data-page/filter-changed data-page :import-batch-id nil])}]]]) - [:div + [:div [switch-field {:id "potentially-duplicate" :checked (boolean @(re-frame/subscribe [::data-page/filter data-page :potential-duplicates])) :on-change (fn [e] diff --git a/src/cljs/auto_ap/views/utils.cljs b/src/cljs/auto_ap/views/utils.cljs index 86d2bab0..0326e38f 100644 --- a/src/cljs/auto_ap/views/utils.cljs +++ b/src/cljs/auto_ap/views/utils.cljs @@ -57,10 +57,16 @@ (when (apply f (into [active-page] rest)) " is-active")) -(def login-url - (let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com" - redirect-uri (js/encodeURI (str (.-origin (.-location js/window)) "/api/oauth"))] - (str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&max_auth_age=0&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile"))) +(defn login-url + ([] (login-url nil)) + ([next] + + (let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com" + redirect-uri (js/encodeURI (str (.-origin (.-location js/window)) "/api/oauth" + ))] + (str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&max_auth_age=0&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile" + (when next + (str "&state=" (js/encodeURIComponent next))))))) (defn dispatch-value-change [event] (fn [e] @@ -249,9 +255,9 @@ :user/role))))))) (defn query-params [] - (reduce-kv + (reduce-kv (fn [result k v] - (assoc result (keyword k) (edn/read-string v))) + (assoc result (keyword k) (try (edn/read-string v) (catch js/Error e v)))) {} (:query (cemerick.url/url (.-location js/window))))) diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..b2056c91 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,92 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: "class", + content: ["./src/**/*.{cljs,clj,cljc}", + "./node_modules/flowbite/**/*.js"], + theme: { + extend: { + "fontFamily": { + "sans": ["Calibri", "ui-sans-serif", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "Noto Sans", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"] + + }, + "colors": { + "green": { + "50": "#f2f8ea", + "100": "#e4f0d5", + "200": "#c9e1ab", + "300": "#afd382", + "400": "#94c458", + "500": "#79b52e", + "600": "#619125", + "700": "#496d1c", + "800": "#304812", + "900": "#182409" + }, + "primary": { + "50": "#f2f8ea", + "100": "#e4f0d5", + "200": "#c9e1ab", + "300": "#afd382", + "400": "#94c458", + "500": "#79b52e", + "600": "#619125", + "700": "#496d1c", + "800": "#304812", + "900": "#182409" + }, + "blue": { + "50": "#e6f5fd", + "100": "#ccebfb", + "200": "#99d7f7", + "300": "#66c4f2", + "400": "#33b0ee", + "500": "#009cea", + "600": "#007dbb", + "700": "#005e8c", + "800": "#003e5e", + "900": "#001f2f" + }, + "secondary": { + "50": "#e9f5e8", + "100": "#d2ebd2", + "200": "#a6d7a4", + "300": "#79c377", + "400": "#4daf49", + "500": "#209b1c", + "600": "#1a7c16", + "700": "#135d11", + "800": "#0d3e0b", + "900": "#061f06" + }, + "red": { + "50": "#ffe6e6", + "100": "#ffcdcd", + "200": "#ff9a9a", + "300": "#ff6868", + "400": "#ff3535", + "500": "#ff0303", + "600": "#cc0202", + "700": "#990202", + "800": "#660101", + "900": "#330101" + }, + "orange": { + "50": "#fef2e8", + "100": "#fde6d1", + "200": "#fbcca2", + "300": "#f8b374", + "400": "#f69945", + "500": "#f48017", + "600": "#c36612", + "700": "#924d0e", + "800": "#623309", + "900": "#311a05" + } + + } + } + } , + plugins: [ + require('flowbite/plugin') + ] +} diff --git a/test/clj/auto_ap/import/transactions_test.clj b/test/clj/auto_ap/import/transactions_test.clj index 2f17f13e..87f123ce 100644 --- a/test/clj/auto_ap/import/transactions_test.clj +++ b/test/clj/auto_ap/import/transactions_test.clj @@ -16,8 +16,7 @@ (def base-transaction #:transaction {:date #inst "2020-01-02T00:00:00-08:00" :raw-id "1" - :id - (di/sha-256 "1") + :id (di/sha-256 "1") :amount 12.0 :description-original "original-description" :status "POSTED" diff --git a/test/clj/auto_ap/integration/graphql/accounts.clj b/test/clj/auto_ap/integration/graphql/accounts.clj index c1be61f2..09330b4a 100644 --- a/test/clj/auto_ap/integration/graphql/accounts.clj +++ b/test/clj/auto_ap/integration/graphql/accounts.clj @@ -8,159 +8,159 @@ (use-fixtures :each wrap-setup) -(deftest test-account-search - (testing "It should find matching account names" - @(dc/transact conn [{:account/name "Food Research" - :db/ident :client-specific-account - :account/numeric-code 51100 - :account/search-terms "Food Research" - :account/applicability :account-applicability/global - :account/default-allowance :allowance/allowed}]) - (sut/rebuild-search-index) - (is (> (count (sut/search {:id (admin-token)} - {:query "Food Research"} - nil - )) - 0))) - (testing "It should find exact matches by numbers" - (is (= (count (sut/search {:id (admin-token)} - {:query "51100"} - nil - )) - 1))) - (testing "It should filter out accounts that are not allowed for clients" - @(dc/transact conn [{:account/name "CLIENT SPECIFIC" - :db/ident :client-specific-account - :account/numeric-code 99999 - :account/search-terms "CLIENTSPECIFIC" - :account/applicability :account-applicability/customized - :account/default-allowance :allowance/allowed}]) - (sut/rebuild-search-index) - (is (= [] (sut/search {:id (admin-token)} - {:query "CLIENTSPECIFIC"} - nil - ))) - - (testing "It should show up for the client specific version" - (let [client-id (-> @(dc/transact conn [{:client/name "CLIENT" - :db/id "client"} - {:db/ident :client-specific-account - :account/client-overrides [{:account-client-override/client "client" - :account-client-override/name "HI" - :account-client-override/search-terms "HELLOWORLD"}]}]) - :tempids - (get "client"))] - (sut/rebuild-search-index) - (is (= 1 (count (sut/search {:id (admin-token)} - {:query "HELLOWORLD" - :client_id client-id} - nil)))))) +#_(deftest test-account-search - (testing "It should hide accounts that arent applicable" - @(dc/transact conn [{:account/name "DENIED" - :db/ident :denied-account - :account/numeric-code 99998 - :account/search-terms "DENIED" - :account/applicability :account-applicability/global - :account/default-allowance :allowance/denied - :account/vendor-allowance :allowance/denied - :account/invoice-allowance :allowance/denied}]) - (is (= 0 (count (sut/search {:id (admin-token)} - {:query "DENIED"} - nil)))) - (is (= 0 (count (sut/search {:id (admin-token)} - {:query "DENIED" - :allowance :invoice} - nil)))) - (is (= 0 (count (sut/search {:id (admin-token)} - {:query "DENIED" - :allowance :vendor} - nil))))) - - (testing "It should warn when using a warn account" - @(dc/transact conn [{:account/name "WARNING" - :db/ident :warn-account - :account/numeric-code 99997 - :account/search-terms "WARNING" - :account/applicability :account-applicability/global - :account/default-allowance :allowance/warn - :account/vendor-allowance :allowance/warn - :account/invoice-allowance :allowance/warn}]) + (with-redefs [auto-ap.solr/impl (auto-ap.solr/->InMemSolrClient (atom {}))] + (testing "It should find matching account names" + @(dc/transact conn [{:account/name "Food Research" + :db/ident :client-specific-account + :account/numeric-code 51100 + :account/search-terms "Food Research" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/allowed}]) (sut/rebuild-search-index) - (is (some? (:warning (first (sut/search {:id (admin-token)} - {:query "WARNING" - :allowance :global} - nil))))) - (is (some? (:warning (first (sut/search {:id (admin-token)} - {:query "WARNING" - :allowance :invoice} - nil))))) - (is (some? (:warning (first (sut/search {:id (admin-token)} - {:query "WARNING" - :allowance :vendor} - nil)))))) - (testing "It should only include admin accounts for admins" - @(dc/transact conn [{:account/name "ADMINONLY" - :db/ident :warn-account - :account/numeric-code 99997 - :account/search-terms "ADMINONLY" - :account/applicability :account-applicability/global - :account/default-allowance :allowance/admin-only - :account/vendor-allowance :allowance/admin-only - :account/invoice-allowance :allowance/admin-only}]) + (clojure.pprint/pprint auto-ap.solr/impl) + (is (> (count (sut/search {:id (admin-token)} + {:query "Food Research"} + nil)) + 0))) + (testing "It should find exact matches by numbers" + (is (= (count (sut/search {:id (admin-token)} + {:query "51100"} + nil)) + 1))) + (testing "It should filter out accounts that are not allowed for clients" + @(dc/transact conn [{:account/name "CLIENT SPECIFIC" + :db/ident :client-specific-account + :account/numeric-code 99999 + :account/search-terms "CLIENTSPECIFIC" + :account/applicability :account-applicability/customized + :account/default-allowance :allowance/allowed}]) (sut/rebuild-search-index) - (is (= 1 (count (sut/search {:id (admin-token)} - {:query "ADMINONLY"} - nil)))) - (is (= 0 (count (sut/search {:id (user-token)} - {:query "ADMINONLY"} - nil))))) + (is (= [] (sut/search {:id (admin-token)} + {:query "CLIENTSPECIFIC"} + nil))) - (testing "It should allow searching for vendor accounts for invoices" - (let [vendor-id (-> @(dc/transact conn [{:account/name "VENDORONLY" - :db/id "vendor-only" - :db/ident :vendor-only - :account/numeric-code 99996 - :account/search-terms "VENDORONLY" - :account/applicability :account-applicability/global - :account/default-allowance :allowance/allowed - :account/vendor-allowance :allowance/allowed - :account/invoice-allowance :allowance/denied} - {:vendor/name "Allowed" - :vendor/default-account "vendor-only" - :db/id "vendor"}]) - :tempids - (get "vendor"))] - (sut/rebuild-search-index) + (testing "It should show up for the client specific version" + (let [client-id (-> @(dc/transact conn [{:client/name "CLIENT" + :db/id "client"} + {:db/ident :client-specific-account + :account/client-overrides [{:account-client-override/client "client" + :account-client-override/name "HI" + :account-client-override/search-terms "HELLOWORLD"}]}]) + :tempids + (get "client"))] + (sut/rebuild-search-index) + (is (= 1 (count (sut/search {:id (admin-token)} + {:query "HELLOWORLD" + :client_id client-id} + nil)))))) + + (testing "It should hide accounts that arent applicable" + @(dc/transact conn [{:account/name "DENIED" + :db/ident :denied-account + :account/numeric-code 99998 + :account/search-terms "DENIED" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/denied + :account/vendor-allowance :allowance/denied + :account/invoice-allowance :allowance/denied}]) (is (= 0 (count (sut/search {:id (admin-token)} - {:query "VENDORONLY" + {:query "DENIED"} + nil)))) + (is (= 0 (count (sut/search {:id (admin-token)} + {:query "DENIED" :allowance :invoice} nil)))) + (is (= 0 (count (sut/search {:id (admin-token)} + {:query "DENIED" + :allowance :vendor} + nil))))) + (testing "It should warn when using a warn account" + @(dc/transact conn [{:account/name "WARNING" + :db/ident :warn-account + :account/numeric-code 99997 + :account/search-terms "WARNING" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/warn + :account/vendor-allowance :allowance/warn + :account/invoice-allowance :allowance/warn}]) + (sut/rebuild-search-index) + (is (some? (:warning (first (sut/search {:id (admin-token)} + {:query "WARNING" + :allowance :global} + nil))))) + (is (some? (:warning (first (sut/search {:id (admin-token)} + {:query "WARNING" + :allowance :invoice} + nil))))) + (is (some? (:warning (first (sut/search {:id (admin-token)} + {:query "WARNING" + :allowance :vendor} + nil)))))) + (testing "It should only include admin accounts for admins" + @(dc/transact conn [{:account/name "ADMINONLY" + :db/ident :warn-account + :account/numeric-code 99997 + :account/search-terms "ADMINONLY" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/admin-only + :account/vendor-allowance :allowance/admin-only + :account/invoice-allowance :allowance/admin-only}]) + (sut/rebuild-search-index) (is (= 1 (count (sut/search {:id (admin-token)} - {:query "VENDORONLY" - :allowance :invoice - :vendor_id vendor-id} - nil)))))))) + {:query "ADMINONLY"} + nil)))) + (is (= 0 (count (sut/search {:id (user-token)} + {:query "ADMINONLY"} + nil))))) -(deftest get-graphql - (testing "should retrieve a single account" - @(dc/transact conn [{:account/numeric-code 1 - :account/default-allowance :allowance/allowed - :account/type :account-type/asset - :account/location "A" - :account/name "Test"}]) + (testing "It should allow searching for vendor accounts for invoices" + (let [vendor-id (-> @(dc/transact conn [{:account/name "VENDORONLY" + :db/id "vendor-only" + :db/ident :vendor-only + :account/numeric-code 99996 + :account/search-terms "VENDORONLY" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/allowed + :account/vendor-allowance :allowance/allowed + :account/invoice-allowance :allowance/denied} + {:vendor/name "Allowed" + :vendor/default-account "vendor-only" + :db/id "vendor"}]) + :tempids + (get "vendor"))] + (sut/rebuild-search-index) + (is (= 0 (count (sut/search {:id (admin-token)} + {:query "VENDORONLY" + :allowance :invoice} + nil)))) - (is (= {:name "Test", - :invoice_allowance nil, - :numeric_code 1, - :vendor_allowance nil, - :location "A", - :applicability nil} - (dissoc (first (:accounts (sut/get-graphql {:id (admin-token)} {} nil))) - :id - :type - :default_allowance))))) + (is (= 1 (count (sut/search {:id (admin-token)} + {:query "VENDORONLY" + :allowance :invoice + :vendor_id vendor-id} + nil))))))) + + (deftest get-graphql + (testing "should retrieve a single account" + @(dc/transact conn [{:account/numeric-code 1 + :account/default-allowance :allowance/allowed + :account/type :account-type/asset + :account/location "A" + :account/name "Test"}]) + + (is (= {:name "Test", + :invoice_allowance nil, + :numeric_code 1, + :vendor_allowance nil, + :location "A", + :applicability nil} + (dissoc (first (:accounts (sut/get-graphql {:id (admin-token)} {} nil))) + :id + :type + :default_allowance))))))) (deftest upsert-account (testing "should create a new account" diff --git a/test/clj/auto_ap/integration/routes/ezcater_xls.clj b/test/clj/auto_ap/integration/routes/ezcater_xls.clj index 366c6208..b4712fbd 100644 --- a/test/clj/auto_ap/integration/routes/ezcater_xls.clj +++ b/test/clj/auto_ap/integration/routes/ezcater_xls.clj @@ -9,50 +9,51 @@ (use-fixtures :each wrap-setup) (deftest stream->sales-orders - (testing "Should import nothing when there are no clients" - (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))] - (is (= [:missing "Nick The Greek (Santa Cruz)"] (first (sut/stream->sales-orders s)))))) - (testing "should import for a single client" - (let [{:strs [test-client]} (setup-test-data [(test-client - :db/id "test-client" - :client/code "NGOP" - :client/locations ["DT"] - :client/name "The client" - :client/matches ["Nick the Greek (Elk Grove)"])])] + (with-redefs [auto-ap.solr/impl (auto-ap.solr/->InMemSolrClient (atom {}))] + (testing "Should import nothing when there are no clients" (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))] - (is (seq (sut/stream->sales-orders s)))) - (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))] - (is (= #:sales-order - {:vendor :vendor/ccp-ezcater - :service-charge -95.9 - :date #inst "2023-04-03T18:30:00" - :reference-link "ZA2-320" - :charges - [#:charge{:type-name "CARD" - :date #inst "2023-04-03T18:30:00" - :client test-client - :location "DT" - :external-id - "ezcater/charge/17592186045501-DT-ZA2-320-0" - :processor :ccp-processor/ezcater - :total 516.12 - :tip 0.0}] - :client test-client - :tip 0.0 - :tax 37.12 - :external-id "ezcater/order/17592186045501-DT-ZA2-320" - :total 516.12 - :line-items - [#:order-line-item{:external-id - "ezcater/order/17592186045501-DT-ZA2-320-0" - :item-name "EZCater Catering" - :category "EZCater Catering" - :discount 0.0 - :tax 37.12 - :total 516.12}] - :discount 0.0 - :location "DT" - :returns 0.0} - (last (first (filter (comp #{:order} first) - (sut/stream->sales-orders s)))))))))) + (is (= [:missing "Nick The Greek (Santa Cruz)"] (first (sut/stream->sales-orders s)))))) + (testing "should import for a single client" + (let [{:strs [test-client]} (setup-test-data [(test-client + :db/id "test-client" + :client/code "NGOP" + :client/locations ["DT"] + :client/name "The client" + :client/matches ["Nick the Greek (Elk Grove)"])])] + (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))] + (is (seq (sut/stream->sales-orders s)))) + (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))] + (is (= #:sales-order + {:vendor :vendor/ccp-ezcater + :service-charge -95.9 + :date #inst "2023-04-03T18:30:00" + :reference-link "ZA2-320" + :charges + [#:charge{:type-name "CARD" + :date #inst "2023-04-03T18:30:00" + :client test-client + :location "DT" + :external-id + "ezcater/charge/17592186045501-DT-ZA2-320-0" + :processor :ccp-processor/ezcater + :total 516.12 + :tip 0.0}] + :client test-client + :tip 0.0 + :tax 37.12 + :external-id "ezcater/order/17592186045501-DT-ZA2-320" + :total 516.12 + :line-items + [#:order-line-item{:external-id + "ezcater/order/17592186045501-DT-ZA2-320-0" + :item-name "EZCater Catering" + :category "EZCater Catering" + :discount 0.0 + :tax 37.12 + :total 516.12}] + :discount 0.0 + :location "DT" + :returns 0.0} + (last (first (filter (comp #{:order} first) + (sut/stream->sales-orders s)))))))))))