diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 0000000..82fe415 --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,27 @@ +name: ci + +on: + push: + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - + name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + tags: eddiemurphy5/hep-connect:latest \ No newline at end of file diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index e035cb5..0000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# tab宽度 -tabWidth: 4 -# 句尾不加分号 -semi: false -# 使用单引号括住字符串 -singleQuote: true -printWidth: 120 diff --git a/Dockerfile b/Dockerfile index d5f4d12..b6d01c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,19 @@ -FROM golang:1.17.2 as builder +FROM node:22-alpine3.19 +# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories +RUN apk update && apk add tzdata curl && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -ENV GO111MODULE=on GOPROXY=https://goproxy.cn,direct +ENV NODE_ENV production WORKDIR /app -COPY . . +RUN npm install -g pnpm -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o run . +COPY package.json pnpm-lock.yaml /app/ -FROM alpine:3.14.2 +RUN pnpm i -P -WORKDIR /app -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories -RUN apk update && apk add tzdata curl net-tools && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -RUN echo "curl http://localhost:3000/metrics/prometheus" > /app/README.md - -COPY --from=builder /app/run . -#COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo -ENV TZ=Asia/Shanghai +COPY . /app -EXPOSE 9060/udp EXPOSE 3000 -ENTRYPOINT ["/app/run"] - +CMD [ "node", "app.mjs" ] \ No newline at end of file diff --git a/Makefile b/Makefile index 30ae44c..8719a41 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,9 @@ DBName= DBUserPasswd= dev: - watchexec -r -e go -- go run main.go -go: - go build -o run . -gofmt: - gofmt -l -w . + watchexec -r -e mjs -- bun app.mjs +dev1: + watchexec -r -e mjs -- node app.mjs image-build: docker build . -t $(image_name) image-push: @@ -18,22 +16,8 @@ image-push: release: git tag v$(version) git push origin v$(version) -test: - go test -v ./... -fmt: - go fmt ./... changelog: git-chglog -o CHANGELOG.md -run: - -docker rm -f sipgrep-go; - docker run -d \ - -p 3000:3000 \ - -p 9060:9060/udp \ - -e DBAddr="$(DBAddr)" \ - -e DBName="$(DBName)" \ - -e DBUserPasswd="$(DBUserPasswd)" \ - --name sipgrep-go \ - harbor:5000/wecloud/sipgrep-go:$(image_name) t1: http --verbose localhost:3000/api/v1/call BeginTime=="2023-11-05 00:00:00" EndTime=="2023-11-05 23:59:59" t2: diff --git a/README.md b/README.md index 6d5b9be..72325c6 100644 --- a/README.md +++ b/README.md @@ -1,137 +1,35 @@ -# V23 Roadmap, under developing +# siphub功能介绍 -- sipgrep-go merge into sipgrep-ui, so there are no sipgrep-ui or sipgrep-go, just one sipgrep. -- using react + ant design as ui frame -- using golang fiber as the web server, no nodejs -- using [SequenceDiagram](https://github.com/davidje13/SequenceDiagram) to draw sip sequence dragram -- add pagenation -- add login page +# 截图 -this is the first version +**搜索页面展示** +![](docs/img/search.jpg) -1. [x] 1. Search Page Done -![](atta/2023-11-12-19-49-40.png) +**时序图展示页面** +![](docs/img/flow.jpg) -2. [ ] 2. SIP Sequence Leg A Page Doing -![](atta/2023-11-12-19-50-24.png) -3. [ ] 3. SIP Sequence Leg B Page -4. [ ] 4. SIP Sequence Import Page -5. [ ] 5. Cron Job create daily Table -6. [ ] 6. cluster frame -7. [ ] 7. SIP Raw Message Compression +# 功能列表 -For production, Please use [siphub v22](https://github.com/wangduanduan/siphub/tree/master) +- [x] 时序图搜索 +- [x] 时序图展示 +- [ ] 分表 +- [ ] 收藏 +- [ ] 导入pcap +- [ ] 导入json +- [ ] 导出json +- [ ] AB Call-leg关联 -# Feature +## 依赖 -- [ ] search call -- [ ] show SIP sequence diagram -- [ ] bind A-Leg and B-Leg -- [ ] load balance -- [ ] cluster -- [ ] call statistic +- PostgreSQL 16 -## db +# 架构图 -- only support mysql 8 -- you need create a db which name sipgrep, the sipgrep will create table auto +- OpenSIPS、FreeSWITCH、Heplify 将SIP消息以HEP格式写入到hep-connect +- hep-connect将消息写入数据库, hep-connect部署文档参考 https://github.com/wangduanduan/hep-connect +- siphub提供web查询界面,负责从数据库查询和展示SIP消息 -# Inter - -## OpenSIPS 2X - -test witch OpenSIPS 2.4 - -```bash -# add hep listen -listen=hep_udp:your_ip:9061 - -loadmodule "proto_hep.so" -# replace SIP_HUB_IP_PORT with sipgrep‘s ip:port -modparam("proto_hep", "hep_id","[hep_dst] SIP_HUB_IP_PORT;transport=udp;version=3") -loadmodule "siptrace.so" -modparam("siptrace", "trace_id","[tid]uri=hep:hep_dst") - -# add ite in request route(); -if(!is_method("REGISTER") && !has_totag()){ - sip_trace("tid", "d", "sip"); -} -``` - -## OpenSIPS 3.x - -``` -socket=hep_udp:127.0.0.1:9060 -loadmodule "proto_hep.so" -modparam("proto_hep", "hep_id","[hid] SIPGREP_IP:SIPGREP_PORT;transport=udp;version=3") -loadmodule "tracer.so" -modparam("tracer", "trace_id","[tid]uri=hep:hid") - - -route { - ... - if (has_totag()) { - route(r_seq_request); - } else { - trace("tid", "d", "sip"); - } - ... -} -``` - -## FreeSWITCH - -fs version 1.6.8+ - -编辑: sofia.conf.xml - -用真实的sipgrep ip:port替换SIPGREP_IP:SIPGREP_PORT - -``` - -``` - -```shell -freeswitch@fsnode04> sofia global capture on - -+OK Global capture on -freeswitch@fsnode04> sofia global capture off - -+OK Global capture off -``` - -然后将下面两个文件的sip-capture设置为yes -- sofia_internal.conf.xml -- sofia_external.conf.xml - - -``` - -``` - -最后,建议重启一下fs. - -## heplify集成 - -参考 https://github.com/sipcapture/heplify - -heplify是一个go语言开发的,基于网卡抓包的方式,捕获sip消息的客户端程序,整个程序就是一个二进制文件,可以不依赖其他组件运行。 - -- -i 指定网卡。需要更具机器真实网卡进行修改 -- -m SIP 指定抓SIP消息 -- -hs 指定sipgrep-go的地址。需要根据sipgrep-go的真实地址进行修改 -- -p 指定生成日志文件的位置 -- -dim 排除某些类型的SIP包,例如排除OPTIONS和REGISTER注册的包 -- -pr 指定抓包的端口范围。 - -``` -nohup ./heplify -i eno1 \ - -m SIP \ - -hs 192.168.3.3:9060 \ - -p "/var/log/" \ - -dim OPTIONS,REGISTER \ - -pr "5060-5061" & -``` \ No newline at end of file +![](docs/img/arch.jpg) \ No newline at end of file diff --git a/app.mjs b/app.mjs new file mode 100644 index 0000000..40a1a44 --- /dev/null +++ b/app.mjs @@ -0,0 +1,40 @@ +import express from 'express' +import bodyParser from 'body-parser' +import { AppLoger, logger } from './logger.mjs' +import dayjs from 'dayjs' +import { route } from './router/api.mjs' +import { queryRecord } from './db.mjs' + +const app = express() + +app.use(AppLoger()) +app.use(bodyParser.urlencoded({ extended: false })) +app.use(express.static('public')) +app.set('view engine', 'ejs') + +app.get('/', async function (req, res) { + let n = dayjs() + let day = n.format('YYYY-MM-DD') + let start = n.subtract(10, 'm').format('HH:mm:ss') + let stop = n.format('HH:mm:ss') + + let result = await queryRecord({ + day, + start, + stop, + caller: '', + callee: '', + msg_min: 1 + }) + + res.render('home/index', { + day, + start, + stop, + table: result.rows + }) +}) + +app.use('/api', route) + +app.listen(3000) \ No newline at end of file diff --git a/atta/2023-10-27-10-52-01.png b/atta/2023-10-27-10-52-01.png deleted file mode 100644 index 52b1695..0000000 Binary files a/atta/2023-10-27-10-52-01.png and /dev/null differ diff --git a/atta/2023-10-27-10-52-02.png b/atta/2023-10-27-10-52-02.png deleted file mode 100644 index 52b1695..0000000 Binary files a/atta/2023-10-27-10-52-02.png and /dev/null differ diff --git a/atta/2023-11-12-19-49-40.png b/atta/2023-11-12-19-49-40.png deleted file mode 100644 index bc9ec9b..0000000 Binary files a/atta/2023-11-12-19-49-40.png and /dev/null differ diff --git a/atta/2023-11-12-19-50-24.png b/atta/2023-11-12-19-50-24.png deleted file mode 100644 index a117970..0000000 Binary files a/atta/2023-11-12-19-50-24.png and /dev/null differ diff --git a/cspell.json b/cspell.json deleted file mode 100644 index 86db4f5..0000000 --- a/cspell.json +++ /dev/null @@ -1,20 +0,0 @@ -// cSpell Settings -{ - // Version of the setting file. Always 0.2 - "version": "0.2", - // language - current active spelling language - "language": "en", - // words - list of words to be always considered correct - "words": [ - "antd", - "Opensips", - "Infof", - "gorm" - ], - // flagWords - list of words to be always considered incorrect - // This is useful for offensive words and common spelling errors. - // For example "hte" should be "the" - "flagWords": [ - "hte" - ] -} \ No newline at end of file diff --git a/db.mjs b/db.mjs new file mode 100644 index 0000000..12875b9 --- /dev/null +++ b/db.mjs @@ -0,0 +1,87 @@ +import pg from 'pg' +import { AppEnv } from './env.mjs' +import { logger } from './logger.mjs' +import { whereBuilder } from './util.mjs' +const { Client, Pool } = pg + +const pool = new Pool({ + user: AppEnv.DBUser, + password: AppEnv.DBPasswd, + host: AppEnv.DBAddr, + port: AppEnv.DBPort, + database: AppEnv.DBName, + idleTimeoutMillis: 30000, + max: 20, + connectionTimeoutMillis: 2000, +}) + + + +export async function queryRecord(c) { + logger.info(c) + console.log(c) + let wh = whereBuilder(c) + const sql = ` + select + sip_call_id as "CallID", + to_char(min(create_time),'HH24:MI:SS') as "startTime", + to_char(max(create_time),'HH24:MI:SS') as "stopTime", + to_char(max(create_time) - min(create_time),'HH24:MI:SS') as "duration", + min(from_user) as "caller", + min(to_user) as "callee", + count(*)::int as "msgTotal", + min(user_agent) as "UA", + max(response_code)::int as "finalCode", + string_agg(DISTINCT CASE WHEN response_code BETWEEN 170 AND 190 THEN response_code::text END, ',') AS "tempCode" + from + public.records + where + ${wh.join(' and ')} + group by sip_call_id + having count(*) >= ${c.msg_min} + order by "startTime" desc + limit ${AppEnv.QueryLimit} + ` + + logger.info(sql) + const res = await pool.query(sql) + + return res +} + + +export async function queryById(id, day) { + const sql = ` + select + sip_call_id, + sip_method, + to_char(create_time, + 'YYYY-MM-DD HH24:MI:SS') as create_time, + timestamp_micro, + raw_msg, + cseq_number, + case + when sip_protocol = 6 then 'TCP' + when sip_protocol = 17 then 'UDP' + when sip_protocol = 22 then 'TLS' + when sip_protocol = 50 then 'ESP' + else 'Unknown' + end as sip_protocl, + replace(src_host,':','_') as src_host, + replace(dst_host,':','_') as dst_host, + response_desc, + length(raw_msg) as msg_len +from + public.records +where + sip_call_id = '${id}' +order by + create_time , + timestamp_micro + ` + + logger.info(sql) + const res = await pool.query(sql) + + return res +} \ No newline at end of file diff --git a/docs/img/arch.jpg b/docs/img/arch.jpg new file mode 100644 index 0000000..dcd2109 Binary files /dev/null and b/docs/img/arch.jpg differ diff --git a/docs/img/flow.jpg b/docs/img/flow.jpg new file mode 100644 index 0000000..3c2073e Binary files /dev/null and b/docs/img/flow.jpg differ diff --git a/docs/img/search.jpg b/docs/img/search.jpg new file mode 100644 index 0000000..7f4f6f8 Binary files /dev/null and b/docs/img/search.jpg differ diff --git a/env.mjs b/env.mjs new file mode 100644 index 0000000..04d7f97 --- /dev/null +++ b/env.mjs @@ -0,0 +1,9 @@ +export const AppEnv = { + DBUser: process.env.DBUser ?? 'wangduanduan', + DBPasswd: process.env.DBPasswd, + DBAddr: process.env.DBAddr ?? '127.0.0.1', + DBPort: process.env.DBPort ? parseInt(process.env.DBPort) : 5432, + DBName: process.env.DBName ?? 'postgres', + LogLevel: process.env.LogLevel ?? 'debug', + QueryLimit: process.env.QueryLimit ? parseInt(process.env.QueryLimit) : 10 +} \ No newline at end of file diff --git a/error.txt b/error.txt deleted file mode 100644 index 476e85b..0000000 --- a/error.txt +++ /dev/null @@ -1,8 +0,0 @@ -2023-10-31T11:00:27.938+0800 INFO msg/msg.go:32 200 8011cmbc.poc->8011cmbc.poc -panic: runtime error: index out of range [0] with length 0 - -goroutine 8 [running]: -sipgrep/pkg/mysql.BatchSaveInit() - /Users/wangduanduan/github/siphub/pkg/mysql/record.go:65 +0x298 -created by main.main in goroutine 1 - /Users/wangduanduan/github/siphub/main.go:22 +0x7c \ No newline at end of file diff --git a/go.mod b/go.mod deleted file mode 100644 index 348a34d..0000000 --- a/go.mod +++ /dev/null @@ -1,70 +0,0 @@ -module sipgrep - -go 1.21 - -toolchain go1.22.5 - -require ( - github.com/caarlos0/env/v6 v6.10.1 - github.com/go-playground/validator/v10 v10.22.0 - github.com/gofiber/fiber/v2 v2.52.5 - github.com/golang-module/carbon/v2 v2.3.12 - github.com/prometheus/client_golang v1.19.1 - github.com/stretchr/testify v1.9.0 - github.com/uptrace/bun v1.2.1 - github.com/uptrace/bun/dialect/pgdialect v1.2.1 - github.com/uptrace/bun/driver/pgdriver v1.2.1 - go.uber.org/zap v1.27.0 - gopkg.in/natefinch/lumberjack.v2 v2.2.1 - gorm.io/driver/mysql v1.5.7 - gorm.io/gorm v1.25.11 -) - -require ( - filippo.io/edwards25519 v1.1.0 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.4 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/gofiber/template v1.8.3 // indirect - github.com/gofiber/template/html/v2 v2.1.2 // indirect - github.com/gofiber/utils v1.1.0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.5 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.55.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/net v0.27.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/driver/postgres v1.5.9 // indirect - mellium.im/sasl v0.3.1 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index 22b0575..0000000 --- a/go.sum +++ /dev/null @@ -1,150 +0,0 @@ -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/II= -github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= -github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= -github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= -github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= -github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= -github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= -github.com/gofiber/template/html/v2 v2.1.2 h1:wkK/mYJ3nIhongTkG3t0QgV4ADdgOYJYVSAF2AHnh8Y= -github.com/gofiber/template/html/v2 v2.1.2/go.mod h1:E98Z/FzvpaSib06aWEgYk6GXNf3ctoyaJH8yW5ay5ak= -github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= -github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= -github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k= -github.com/golang-module/carbon/v2 v2.3.12/go.mod h1:HNsedGzXGuNciZImYP2OMnpiwq/vhIstR/vn45ib5cI= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= -github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= -github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.2.1 h1:2ENAcfeCfaY5+2e7z5pXrzFKy3vS8VXvkCag6N2Yzfk= -github.com/uptrace/bun v1.2.1/go.mod h1:cNg+pWBUMmJ8rHnETgf65CEvn3aIKErrwOD6IA8e+Ec= -github.com/uptrace/bun/dialect/pgdialect v1.2.1 h1:ceP99r03u+s8ylaDE/RzgcajwGiC76Jz3nS2ZgyPQ4M= -github.com/uptrace/bun/dialect/pgdialect v1.2.1/go.mod h1:mv6B12cisvSc6bwKm9q9wcrr26awkZK8QXM+nso9n2U= -github.com/uptrace/bun/driver/pgdriver v1.2.1 h1:Cp6c1tKzbTIyL8o0cGT6cOhTsmQZdsUNhgcV51dsmLU= -github.com/uptrace/bun/driver/pgdriver v1.2.1/go.mod h1:jEd3WGx74hWLat3/IkesOoWNjrFNUDADK3nkyOFOOJM= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= -github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= -github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= -gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= -gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= -gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= -gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= -mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= -mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= diff --git a/img/call1.png b/img/call1.png deleted file mode 100644 index c214ed6..0000000 Binary files a/img/call1.png and /dev/null differ diff --git a/img/call2.png b/img/call2.png deleted file mode 100644 index 8da34bd..0000000 Binary files a/img/call2.png and /dev/null differ diff --git a/img/d1.jpg b/img/d1.jpg deleted file mode 100644 index b6f2e52..0000000 Binary files a/img/d1.jpg and /dev/null differ diff --git a/img/d2.jpg b/img/d2.jpg deleted file mode 100644 index 363390b..0000000 Binary files a/img/d2.jpg and /dev/null differ diff --git a/img/d4.jpg b/img/d4.jpg deleted file mode 100644 index 2a95b1a..0000000 Binary files a/img/d4.jpg and /dev/null differ diff --git a/img/frame.png b/img/frame.png deleted file mode 100644 index f9c7b1e..0000000 Binary files a/img/frame.png and /dev/null differ diff --git a/img/import.jpg b/img/import.jpg deleted file mode 100644 index c32e30e..0000000 Binary files a/img/import.jpg and /dev/null differ diff --git a/img/search.png b/img/search.png deleted file mode 100644 index 0b9ef2e..0000000 Binary files a/img/search.png and /dev/null differ diff --git a/logger.mjs b/logger.mjs new file mode 100644 index 0000000..2ff6370 --- /dev/null +++ b/logger.mjs @@ -0,0 +1,21 @@ +import exp from 'constants'; +import log4js from 'log4js' + +log4js.configure({ + appenders: { + console: { type: 'console' }, + file: { type: 'file', filename: 'logs/log4jsconnect.log' }, + }, + categories: { + default: { appenders: ['console'], level: 'debug' }, + log4jslog: { appenders: ['file'], level: 'debug' }, + }, +}); + + +export const logger = log4js.getLogger(); +logger.level = 'debug' + +export function AppLoger() { + return log4js.connectLogger(logger, { level: 'auto' }) +} \ No newline at end of file diff --git a/main.go b/main.go deleted file mode 100644 index dc1bd06..0000000 --- a/main.go +++ /dev/null @@ -1,48 +0,0 @@ -package main - -import ( - // "sipgrep/pkg/env" - "sipgrep/pkg/hepserver" - "sipgrep/pkg/log" - "sipgrep/pkg/mysql" - - // _ "sipgrep/pkg/pg" - "sipgrep/pkg/route" - - "github.com/gofiber/fiber/v2" - "github.com/gofiber/template/html/v2" - "time" -) - -func main() { - mysql.Connect() - - go mysql.BatchSaveInit() - go hepserver.CreateHepServer() - - engine := html.New("./views", ".html") - app := fiber.New(fiber.Config{ - Views: engine, - }) - - app.Static("/", "./public") - - app.Get("/", func(c *fiber.Ctx) error { - // Render index template - return c.Render("index", fiber.Map{ - "Title": "Hello, World!", - "Today": time.Now().Format("2006-01-02"), - "EndTime": time.Now().Format("15:04:05"), - "StartTime": time.Now().Add(-time.Minute * 30).Format("15:04:05"), - }) - }) - - api := app.Group("/api") - - v1 := api.Group("/v1") - v1.Get("/call", route.Search) - v1.Get("/call/:Day/:SIPCallID/", route.SearchCallID) - - log.Infof("app listen on :3000") - app.Listen(":3000") -} diff --git a/package.json b/package.json index d09a742..2bb0a14 100644 --- a/package.json +++ b/package.json @@ -4,35 +4,15 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "build": "" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/jquery": "^3.5.27", - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "antd": "^5.10.2", - "axios": "^1.6.0", - "dayjs": "^1.11.10", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "jotai": "^2.5.0", - "jquery": "^3.7.1", - "normalize.css": "^8.0.1", - "prettier": "^3.0.3", - "react-router-dom": "^6.17.0", - "svg-sequence-diagram": "^1.3.0", - "typescript": "^5.0.2", - "vite": "^4.4.5" + "body-parser": "^1.20.2", + "dayjs": "^1.11.13", + "ejs": "^3.1.10", + "express": "^4.19.2", + "log4js": "^6.9.1", + "pg": "^8.12.0", + "validator": "^13.12.0" } } diff --git a/pkg/env/env.go b/pkg/env/env.go deleted file mode 100644 index 46bbc7b..0000000 --- a/pkg/env/env.go +++ /dev/null @@ -1,49 +0,0 @@ -package env - -import ( - "log" - - "github.com/caarlos0/env/v6" -) - -type config struct { - UDPListenPort int `env:"UDPListenPort" envDefault:"9060"` - MaxPacketLength int `env:"MaxPacketLength" envDefault:"4096"` - MaxReadTimeoutSeconds int `env:"MaxReadTimeoutSecond" envDefault:"5"` - LogLevel string `env:"LogLevel" envDefault:"info"` - Hostname string `env:"HOSTNAME" envDefault:"unknow"` - HeaderUIDName string `env:"HeaderUIDName"` - HeaderFSCallIDName string `env:"HeaderFSCallIDName"` - DiscardMethods string `env:"DiscardMethods" envDefault:"OPTIONS"` - MinPacketLength int `env:"MinPacketLength" envDefault:"24"` - SqlMaxOpenConn int `env:"SqlMaxOpenConn" envDefault:"64"` - SqlMaxIdleConn int `env:"SqlMaxIdleConn" envDefault:"64"` - - DBUser string `env:"DBUser"` - DBPasswd string `env:"DBPasswd"` - - DBAddr string `env:"DBAddr" envDefault:"localhost"` - DBName string `env:"DBName" envDefault:"sipgrep"` - CalleeFrom string `env:"CalleeFrom" envDefault:"RURI"` - MaxBatchItems int `env:"MaxBatchItems" envDefault:"20"` - TickerSecondTime int `env:"TickerSecondTime" envDefault:"20"` - PageLimit int `env:"PageLimit" envDefault:"200"` -} - -var Conf = config{} - -func init() { - if err := env.Parse(&Conf); err != nil { - log.Fatalf("%+v\n", err) - } else { - // 只有在debug级别,才打印配置信息 - // 配置信息中存在mysql的密码 - if Conf.LogLevel == "debug" { - log.Printf("%#v\n", Conf) - } - } - - if Conf.TickerSecondTime < 20 { - log.Panicf("TickerSencondTime must bigger than 20. TickerSecondTime: %d", Conf.TickerSecondTime) - } -} diff --git a/pkg/hep/hep.go b/pkg/hep/hep.go deleted file mode 100644 index aa907c7..0000000 --- a/pkg/hep/hep.go +++ /dev/null @@ -1,141 +0,0 @@ -/** -* Homer Encapsulation Protocol v3 -* Courtesy of Weave Communications, Inc (http://getweave.com/) under the ISC license (https://en.wikipedia.org/wiki/ISC_license) -**/ - -package hep - -import ( - "encoding/binary" - "errors" - "net" - "sipgrep/pkg/log" -) - -// HEP ID -const ( - HEPID1 = 0x011002 - HEPID2 = 0x021002 - HEPID3 = 0x48455033 -) - -// Generic Chunk Types -const ( - _ = iota // Don't want to assign zero here, but want to implicitly repeat this expression after... - IPProtocolFamily - IPProtocolID - IP4SourceAddress - IP4DestinationAddress - IP6SourceAddress - IP6DestinationAddress - SourcePort - DestinationPort - Timestamp - TimestampMicro - ProtocolType // Maps to Protocol Types below - CaptureAgentID - KeepAliveTimer - AuthenticationKey - PacketPayload - CompressedPayload - InternalC -) - -// HepMsg represents a parsed HEP packet -type HepMsg struct { - IPProtocolFamily byte - IPProtocolID byte - IP4SourceAddress string - IP4DestinationAddress string - IP6SourceAddress string - IP6DestinationAddress string - SourcePort uint16 - DestinationPort uint16 - Timestamp uint32 - TimestampMicro uint32 - ProtocolType byte - CaptureAgentID uint16 - KeepAliveTimer uint16 - AuthenticateKey string - Body string -} - -// NewHepMsg returns a parsed message object. Takes a byte slice. -func NewHepMsg(packet []byte) (*HepMsg, error) { - newHepMsg := &HepMsg{} - err := newHepMsg.parse(packet) - if err != nil { - return nil, err - } - return newHepMsg, nil -} - -func (hepMsg *HepMsg) parse(udpPacket []byte) error { - - switch udpPacket[0] { - case 0x48: - return hepMsg.parseHep3(udpPacket) - default: - err := errors.New("Not a valid HEP packet - HEP ID does not match spec") - return err - } -} - -func (hepMsg *HepMsg) parseHep3(udpPacket []byte) error { - currentByte := uint16(6) - - for int(currentByte) < cap(udpPacket) { - hepChunk := udpPacket[currentByte:] - chunkType := binary.BigEndian.Uint16(hepChunk[2:4]) - chunkLength := binary.BigEndian.Uint16(hepChunk[4:6]) - - currentByte += chunkLength - if int(chunkLength) > cap(hepChunk) { - // 一般这种情况是因为每次读取的MaxPacketLength设置的比较小 - // 导致无法一次性读区完整的hep包 - // 所以可以适当增加MaxPacketLength - // 例如设置为4096 - log.Warnf("chunkLength big then slice capacity: chunkLength: %v, slice capacity: %v", chunkLength, cap(hepChunk)) - chunkLength = uint16(cap(hepChunk)) - } - chunkBody := hepChunk[6:chunkLength] - - switch chunkType { - case IPProtocolFamily: - hepMsg.IPProtocolFamily = chunkBody[0] - case IPProtocolID: - hepMsg.IPProtocolID = chunkBody[0] - case IP4SourceAddress: - hepMsg.IP4SourceAddress = net.IP(chunkBody).String() - case IP4DestinationAddress: - hepMsg.IP4DestinationAddress = net.IP(chunkBody).String() - case IP6SourceAddress: - hepMsg.IP6SourceAddress = net.IP(chunkBody).String() - case IP6DestinationAddress: - hepMsg.IP4DestinationAddress = net.IP(chunkBody).String() - case SourcePort: - hepMsg.SourcePort = binary.BigEndian.Uint16(chunkBody) - case DestinationPort: - hepMsg.DestinationPort = binary.BigEndian.Uint16(chunkBody) - case Timestamp: - hepMsg.Timestamp = binary.BigEndian.Uint32(chunkBody) - case TimestampMicro: - hepMsg.TimestampMicro = binary.BigEndian.Uint32(chunkBody) - case ProtocolType: - hepMsg.ProtocolType = chunkBody[0] - case CaptureAgentID: - hepMsg.CaptureAgentID = binary.BigEndian.Uint16(chunkBody) - case KeepAliveTimer: - hepMsg.KeepAliveTimer = binary.BigEndian.Uint16(chunkBody) - case AuthenticationKey: - hepMsg.AuthenticateKey = string(chunkBody) - case PacketPayload: - hepMsg.Body += string(chunkBody) - case CompressedPayload: - case InternalC: - default: - } - } - - return nil -} diff --git a/pkg/hepserver/server.go b/pkg/hepserver/server.go deleted file mode 100644 index 954132c..0000000 --- a/pkg/hepserver/server.go +++ /dev/null @@ -1,62 +0,0 @@ -package hepserver - -import ( - "fmt" - "net" - "sipgrep/pkg/env" - "sipgrep/pkg/log" - "sipgrep/pkg/msg" - "sipgrep/pkg/mysql" - "sipgrep/pkg/prom" - "time" - - "github.com/prometheus/client_golang/prometheus" -) - -const MinRawPacketLength = 105 - -func main() { - fmt.Println("vim-go") -} - -func CreateHepServer() { - conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: env.Conf.UDPListenPort}) - - if err != nil { - log.Fatalf("Udp Service listen report udp fail:%v", err) - } - log.Infof("create udp success") - - defer conn.Close() - var data = make([]byte, env.Conf.MaxPacketLength) - var raw []byte - for { - conn.SetDeadline(time.Now().Add(time.Duration(env.Conf.MaxReadTimeoutSeconds) * time.Second)) - n, remoteAddr, err := conn.ReadFromUDP(data) - - if err != nil { - if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() { - continue - } else { - prom.MsgCount.With(prometheus.Labels{"type": "read_udp_error"}) - log.Errorf("read udp error: %v, from %v", err, remoteAddr) - } - } - - prom.MsgCount.With(prometheus.Labels{"type": "all_received_packet"}).Inc() - - if n < MinRawPacketLength { - prom.MsgCount.With(prometheus.Labels{"type": "raw_byte_too_small"}).Inc() - log.Warnf("less then MinRawPacketLength: %d, received length: %d, from: %v", MinRawPacketLength, n, remoteAddr) - continue - } - - raw = make([]byte, n) - - copy(raw, data[:n]) - - prom.MsgCount.With(prometheus.Labels{"type": "on_message"}).Inc() - - go msg.OnMessage(raw, mysql.Save, remoteAddr.IP) - } -} diff --git a/pkg/log/log.go b/pkg/log/log.go deleted file mode 100644 index 2074aa9..0000000 --- a/pkg/log/log.go +++ /dev/null @@ -1,72 +0,0 @@ -package log - -import ( - "os" - "sipgrep/pkg/env" - - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "gopkg.in/natefinch/lumberjack.v2" -) - -/* Debugw Infow Warnw Errorw Fatalw Panicw */ - -var log *zap.SugaredLogger - -var Debugf = log.Debugf -var Infof = log.Infof -var Errorf = log.Errorf -var Fatalf = log.Fatalf -var Warnf = log.Warnf - -func getLogLevel(level string) zapcore.Level { - switch level { - case "debug": - return zapcore.DebugLevel - case "info": - return zapcore.InfoLevel - case "warn": - return zapcore.WarnLevel - case "error": - return zapcore.ErrorLevel - } - return zapcore.DebugLevel -} - -func initLogger() { - - logLevel := getLogLevel(env.Conf.LogLevel) - - lumberJackLogger := &lumberjack.Logger{ - Filename: "./logs/" + env.Conf.Hostname + "/app.log", - MaxSize: 10, - MaxBackups: 10, - MaxAge: 7, - Compress: false, - } - writeSyncer := zapcore.AddSync(lumberJackLogger) - encoderConf := zap.NewProductionEncoderConfig() - encoderConf.EncodeTime = zapcore.ISO8601TimeEncoder - encoderConf.EncodeLevel = zapcore.CapitalLevelEncoder - encoder := zapcore.NewConsoleEncoder(encoderConf) - fileCore := zapcore.NewCore(encoder, writeSyncer, logLevel) - consoleCore := zapcore.NewCore(encoder, zapcore.Lock(os.Stdout), logLevel) - - core := zapcore.NewTee( - fileCore, - consoleCore, - ) - - logger := zap.New(core, zap.AddCaller()) - log = logger.Sugar() - - Infof = log.Infof - Errorf = log.Errorf - Fatalf = log.Fatalf - Debugf = log.Debugf - Warnf = log.Warnf -} - -func init() { - initLogger() -} diff --git a/pkg/models/models.go b/pkg/models/models.go deleted file mode 100644 index 8ff978b..0000000 --- a/pkg/models/models.go +++ /dev/null @@ -1,37 +0,0 @@ -package models - -import "time" - -const ( - HeaderCallID = "Call-ID" - HeaderFrom = "From" - HeaderTo = "To" - HeaderUA = "User-Agent" - HeaderCSeq = "CSeq" -) - -type SIP struct { - Title string // Method or Status - IsRequest bool - ResponseCode int - ResponseDesc string - CallID string - RequestURL string - RequestUsername string - RequestDomain string - ToUsername string - ToDomain string - FromUsername string - FromDomain string - CSeqNumber int - CSeqMethod string - UserAgent string - SrcAddr string // IP:PORT - DstAddr string // IP:PORT - CreateAt time.Time - TimestampMicro uint32 - Protocol int - UID string // correlative id for AB call leg - FSCallID string // freeswitch CallID - Raw *string // raw sip message -} diff --git a/pkg/msg/msg.go b/pkg/msg/msg.go deleted file mode 100644 index 9eb0fcf..0000000 --- a/pkg/msg/msg.go +++ /dev/null @@ -1,103 +0,0 @@ -package msg - -import ( - "fmt" - "net" - "sipgrep/pkg/env" - "sipgrep/pkg/hep" - "sipgrep/pkg/log" - "sipgrep/pkg/models" - "sipgrep/pkg/parser" - "sipgrep/pkg/prom" - "strings" - "time" - - "github.com/prometheus/client_golang/prometheus" -) - -type dbSave func(*models.SIP) - -func OnMessage(b []byte, fn dbSave, ip net.IP) { - sip, errType, _ := Format(b) - - if errType != "" { - if errType != "method_discarded" { - log.Errorf("format msg error: %v; raw length: %d, %s, from: %v", errType, len(b), b, ip) - } - prom.MsgCount.With(prometheus.Labels{"type": errType}).Inc() - return - } - - prom.MsgCount.With(prometheus.Labels{"type": "hep_parse_ok"}).Inc() - log.Infof("%s %s->%s", sip.Title, sip.FromUsername+sip.FromDomain, sip.ToUsername+sip.FromDomain) - fn(sip) -} - -func Format(p []byte) (s *models.SIP, errorType string, errMsg string) { - hepMsg, err := hep.NewHepMsg(p) - - if err != nil { - log.Errorf("NewHepMsg error %v", err) - return nil, "hep_parse_error", "" - } - - if hepMsg.Body == "" { - return nil, "hep_body_is_empty", "" - } - - if len(hepMsg.Body) < env.Conf.MinPacketLength { - return nil, "hep_body_is_too_small", "" - } - - sip := parser.Parser{ - SIP: models.SIP{ - Raw: &hepMsg.Body, - }} - - sip.ParseCseq() - - sip.TimestampMicro = hepMsg.TimestampMicro - - if sip.CSeqMethod == "" { - return nil, "cseq_is_empty", "" - } - - if strings.Contains(env.Conf.DiscardMethods, sip.CSeqMethod) { - return nil, "method_discarded", sip.CSeqMethod - } - - sip.ParseCallID() - - if sip.CallID == "" { - return nil, "callid_is_empty", "" - } - - sip.ParseFirstLine() - - if sip.Title == "" { - return nil, "title_is_empty", "" - } - - if sip.RequestURL != "" { - sip.ParseRequestURL() - } - - sip.ParseFrom() - sip.ParseTo() - sip.ParseUserAgent() - sip.CreateAt = time.Unix(int64(hepMsg.Timestamp), 0) - - if env.Conf.HeaderFSCallIDName != "" { - sip.ParseFSCallID(env.Conf.HeaderFSCallIDName) - } - - if env.Conf.HeaderUIDName != "" { - sip.ParseUID(env.Conf.HeaderUIDName) - } - - sip.Protocol = int(hepMsg.IPProtocolID) - sip.SrcAddr = fmt.Sprintf("%s_%d", hepMsg.IP4SourceAddress, hepMsg.SourcePort) - sip.DstAddr = fmt.Sprintf("%s_%d", hepMsg.IP4DestinationAddress, hepMsg.DestinationPort) - - return &sip.SIP, "", "" -} diff --git a/pkg/mysql/record.go b/pkg/mysql/record.go deleted file mode 100644 index 3d782da..0000000 --- a/pkg/mysql/record.go +++ /dev/null @@ -1,200 +0,0 @@ -package mysql - -import ( - // "fmt" - "sipgrep/pkg/env" - "sipgrep/pkg/log" - "sipgrep/pkg/models" - "sipgrep/pkg/prom" - "sipgrep/pkg/util" - "time" - - "github.com/prometheus/client_golang/prometheus" - // "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/gorm" -) - -var db *gorm.DB - -const MaxUserAgentLength = 40 - -type Record struct { - ID int64 `gorm:"column:id;type:int;autoIncrement;primaryKey"` - SIPCallID string `gorm:"column:sip_call_id;index;type:char(64);not null;default:''"` - SIPMethod string `gorm:"column:sip_method;index;type:char(20);not null;default:''"` - CreateTime time.Time `gorm:"column:create_time;type:timestamp;not null;default:CURRENT_TIMESTAMP;primaryKey"` - ToUser string `gorm:"column:to_user;index;type:char(40);not null;default:''"` - LegUid string `gorm:"column:leg_uid;index;type:char(64);not null;default:''"` - FromUser string `gorm:"column:from_user;index;type:char(40);not null;default:''"` - - FsCallID string `gorm:"column:fs_call_id;type:char(64);not null; default:''"` - - ResponseCode int `gorm:"column:response_code;type:int;not null;default:0"` - ResponseDesc string `gorm:"column:response_desc;type:char(64);not null;default:''"` - CSeqMethod string `gorm:"column:cseq_method;type:char(20);not null;default:''"` - CSeqNumber int `gorm:"column:cseq_number;type:int;not null;default:0"` - - FromHost string `gorm:"column:from_host;type:char(64);not null;default:''"` - ToHost string `gorm:"column:to_host;type:char(64);not null;default:''"` - SIPProtocol uint `gorm:"column:sip_protocol;type:int;not null;default:0"` - UserAgent string `gorm:"column:user_agent;type:char(40);not null;default:''"` - SrcHost string `gorm:"column:src_host;type:char(32);not null;default:''"` - DstHost string `gorm:"column:dst_host;type:char(32);not null;default:''"` - TimestampMicro uint32 `gorm:"column:timestamp_micro;type:int;not null;default:0"` - RawMsg string `gorm:"column:raw_msg;type:text;not null"` -} - -type CallTable struct { - Record - MsgCount int -} - -var maxBatchItems = env.Conf.MaxBatchItems -var batchChan = make(chan *Record, maxBatchItems*2) -var ticker = time.NewTicker(time.Second * time.Duration(env.Conf.TickerSecondTime)) - -func BatchSaveInit() { - - for { - // 一次性开辟需要的内存空间, 而不是动态开辟 - batchItems := make([]*Record, 0, maxBatchItems) - i := 0 - for ; i < maxBatchItems; i++ { - // 默认情况下,当达到最大的插入批次量时,就执行插入语句 - select { - case <-ticker.C: - // 但是在抓包比较少的情况下,希望在达到一定的延迟后,也可以自动插入 - log.Infof("ticker for saving to db") - i = maxBatchItems - default: - batchItems = append(batchItems, <-batchChan) - } - } - - log.Infof("start batch insert: %v", len(batchItems)) - prom.MsgCount.With(prometheus.Labels{"type": "batch_insert"}).Inc() - go db.Create(&batchItems) - - } -} - -func Save(s *models.SIP) { - ua := s.UserAgent - - if len(ua) > MaxUserAgentLength { - ua = ua[:MaxUserAgentLength] - } - - RawMsg := *s.Raw - - item := Record{ - FsCallID: s.FSCallID, - LegUid: s.UID, - SIPMethod: s.Title, - ResponseCode: s.ResponseCode, - ResponseDesc: s.ResponseDesc, - CSeqMethod: s.CSeqMethod, - CSeqNumber: s.CSeqNumber, - FromUser: s.FromUsername, - FromHost: s.FromDomain, - ToUser: util.ReverseString(s.ToUsername), // 被叫号码翻转后存储, 方便查询时不需要加前缀 - ToHost: s.ToDomain, - SIPCallID: s.CallID, - SIPProtocol: uint(s.Protocol), - UserAgent: ua, - SrcHost: s.SrcAddr, - DstHost: s.DstAddr, - CreateTime: s.CreateAt, - TimestampMicro: s.TimestampMicro, - RawMsg: RawMsg, - } - - prom.MsgCount.With(prometheus.Labels{"type": "ready_save_to_db"}).Inc() - - batchChan <- &item -} - -func Connect() { - var err error - // dsn := fmt.Sprintf("%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&sql_mode=TRADITIONAL", UserPasswd, Addr, DBName) - dsn := "host=localhost user=wangduanduan dbname=postgres port=5432 sslmode=disable TimeZone=Asia/Shanghai" - - - db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ - SkipDefaultTransaction: true, - PrepareStmt: true, - }) - - if err != nil { - log.Fatalf("connect mysql error: %s", err) - } - - sqlDB, err := db.DB() - - // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. - sqlDB.SetMaxIdleConns(env.Conf.SqlMaxIdleConn) - - // SetMaxOpenConns sets the maximum number of open connections to the database. - sqlDB.SetMaxOpenConns(env.Conf.SqlMaxOpenConn) - - // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. - sqlDB.SetConnMaxLifetime(time.Minute) - - db.AutoMigrate(&Record{}) -} - -func FindBySIPCallID(Date, SIPCallID string) ([]Record, error) { - var re []Record - - tableName := GetTableName(Date) - - sqlRE := db.Table(tableName).Where("sip_call_id = ?", SIPCallID).Order("create_time, timestamp_micro").Find(&re) - - if sqlRE.Error != nil { - return nil, sqlRE.Error - } - - return re, nil -} - -func Search(sql string) ([]CallTable, error) { - rows, err := db.Raw(sql).Rows() - - if err != nil { - return nil, err - } - - table := make([]CallTable, 0, env.Conf.PageLimit) - - defer rows.Close() - - for rows.Next() { - item := CallTable{} - - err := rows.Scan( - &item.ID, - &item.SIPCallID, - &item.CreateTime, - &item.FromUser, - &item.FromHost, - &item.ToUser, - &item.ToHost, - &item.UserAgent, - &item.SIPProtocol, - &item.SIPMethod, - &item.CSeqMethod, - &item.FsCallID, - &item.LegUid, - &item.MsgCount, - ) - - if err != nil { - log.Errorf("sql scan error: %v", err) - } - - table = append(table, item) - } - - return table, nil -} diff --git a/pkg/mysql/util.go b/pkg/mysql/util.go deleted file mode 100644 index 8f09fdc..0000000 --- a/pkg/mysql/util.go +++ /dev/null @@ -1,79 +0,0 @@ -package mysql - -import ( - "fmt" - "sipgrep/pkg/env" - "strings" - - "github.com/golang-module/carbon/v2" -) - -var SearchFields = []string{ - "id", - "sip_call_id", - "create_time", - "from_user", - "from_host", - "to_user", - "to_host", - "user_agent", - "sip_protocol", - "sip_method", - "cseq_method", - "fs_call_Id", - "leg_uid", - "count(*) as msg_count", -} - -type SearchParams struct { - BeginTime string `validate:"required,datetime=2006-01-02 15:04:05,len=19"` - EndTime string `validate:"required,datetime=2006-01-02 15:04:05,len=19"` - Caller string `validate:"max=64"` - CallerDomain string `validate:"max=64"` - Callee string `validate:"max=64"` - CalleeDomain string `validate:"max=64"` -} - -func GetTableName(BeginTime string) string { - if carbon.Parse(BeginTime).IsToday() { - return "records" - } - - // YYYYMMDD - newTable := carbon.Parse(BeginTime).ToShortDateString() - - return "sipgrep_backup_" + newTable -} - -func GetSearchSql(sp SearchParams) string { - conditions := []string{} - - conditions = append(conditions, fmt.Sprintf("create_time between '%s' and '%s'", sp.BeginTime, sp.EndTime)) - - if sp.Caller != "" { - conditions = append(conditions, fmt.Sprintf("from_user='%s'", sp.Caller)) - } - if sp.CallerDomain != "" { - conditions = append(conditions, fmt.Sprintf("from_host='%s'", sp.CallerDomain)) - } - if sp.Callee != "" { - conditions = append(conditions, fmt.Sprintf("to_user like '%s'%%", sp.Callee)) - } - if sp.CalleeDomain != "" { - conditions = append(conditions, fmt.Sprintf("to_host='%s'", sp.CalleeDomain)) - } - - columns := strings.Join(SearchFields, ",") - conds := strings.Join(conditions, ",") - tableName := GetTableName(sp.BeginTime) - - sql := fmt.Sprintf(`select %s from %s where sip_call_id in ( - select sip_call_id from ( - select distinct sip_call_id from %s where %s - limit %d - ) tmp - ) - group by sip_call_id order by create_time desc`, columns, tableName, tableName, conds, env.Conf.PageLimit) - - return sql -} diff --git a/pkg/parser/doc.go b/pkg/parser/doc.go deleted file mode 100644 index 22309c9..0000000 --- a/pkg/parser/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -package parser - -/* - 这并不是一个完整的SIP协议解析包,而仅仅是解析了我需要的一些字段 - 虽然SIP协议对于SIP头是不区分大小写的,但是我是按照大小写敏感的方式去解析的, 因为常见的SIP头都是有约定的写法的 - 例如CSeq, From, To, Call-ID - 我不想为了几个SIP头,而把所有的SIP消息转成小写然后再去处理 -*/ diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go deleted file mode 100644 index 1cf3011..0000000 --- a/pkg/parser/parser.go +++ /dev/null @@ -1,249 +0,0 @@ -package parser - -import ( - "sipgrep/pkg/models" - "sipgrep/pkg/util" - "strings" -) - -var empty = struct{}{} -var acceptMethods map[string]struct{} -var discardMethods map[string]struct{} - -const CRLF = "\r\n" - -const ( - ParseOk = iota - ECanNotFindHeader - EBadHeaderValue -) - -const EmptyStr = "" - -type Parser struct { - models.SIP -} - -// Request : INVITE bob@example.com SIP/2.0 -// Response : SIP/2.0 200 OK -// Response : SIP/2.0 501 Not Implemented -func (p *Parser) ParseFirstLine() { - if p.Raw == nil { - return - } - if *p.Raw == EmptyStr { - return - } - - firstLineIndex := strings.Index(*p.Raw, CRLF) - if firstLineIndex == -1 { - return - } - firstLine := (*p.Raw)[:firstLineIndex] - firstLineMeta := strings.SplitN(firstLine, " ", 3) - - if len(firstLineMeta) != 3 { - return - } - if strings.HasPrefix(firstLineMeta[0], "SIP") { - p.IsRequest = false - p.Title = firstLineMeta[1] - p.ResponseCode = util.StrToInt(firstLineMeta[1]) - p.ResponseDesc = firstLineMeta[2] - return - } - p.IsRequest = true - p.Title = firstLineMeta[0] - p.RequestURL = firstLineMeta[1] -} - -func (p *Parser) ParseRequestURL() { - if p.RequestURL == "" { - return - } - user, domain := ParseSIPURL(p.RequestURL) - p.RequestDomain = domain - p.RequestUsername = user -} - -func (p *Parser) ParseFrom() { - v := p.GetHeaderValue(models.HeaderFrom) - if v == EmptyStr { - return - } - user, domain := ParseSIPURL(v) - p.FromUsername = user - p.FromDomain = domain -} - -func (p *Parser) ParseTo() { - v := p.GetHeaderValue(models.HeaderTo) - if v == EmptyStr { - return - } - user, domain := ParseSIPURL(v) - p.ToUsername = user - p.ToDomain = domain -} - -func (p *Parser) ParseUserAgent() { - v := p.GetHeaderValue(models.HeaderUA) - if v == EmptyStr { - return - } - p.UserAgent = v -} - -func (p *Parser) ParseCallID() { - v := p.GetHeaderValue(models.HeaderCallID) - if v == EmptyStr { - return - } - p.CallID = v -} - -// "Bob" ;tag=a48s -// sip:+12125551212@phone2net.com;tag=887s -// Anonymous ;tag=hyh8 -// Carol -// sip:carol@chicago.com -func ParseSIPURL(s string) (string, string) { - if s == "" { - return "", "" - } - - newURL := s - - if strings.Contains(s, "<") { - start := strings.Index(s, "<") - end := strings.Index(s, ">") - if start > end { - return "", "" - } - newURL = s[start:end] - } - - a := strings.Index(newURL, ":") - b := strings.Index(newURL, "@") - c := strings.Index(newURL, ";") - - if a == -1 { - return "", "" - } - - if b == -1 && b < len(newURL) { - if c == -1 { - return "", newURL[a+1:] - } - if c > b { - return "", newURL[a+1 : c] - } - } - - if c == -1 { - c = len(newURL) - } - - user := newURL[a+1 : b] - domain := newURL[b+1 : c] - return user, domain -} - -func (p *Parser) ParseCseq() { - cseqValue := p.GetHeaderValue(models.HeaderCSeq) - if cseqValue == EmptyStr { - return - } - cs := strings.SplitN(cseqValue, " ", 2) - if len(cs) != 2 { - return - } - p.CSeqNumber = util.StrToInt(cs[0]) - p.CSeqMethod = cs[1] -} - -func (p *Parser) GetHeaderValue(header string) (v string) { - if *p.Raw == EmptyStr || header == EmptyStr { - return EmptyStr - } - - if strings.Contains(header, CRLF) || strings.Contains(header, " ") { - return EmptyStr - } - - startIndex := strings.Index(*p.Raw, header+":") - - if startIndex == -1 { - return EmptyStr - } - - newStr := (*p.Raw)[startIndex:] - - endIndex := strings.Index(newStr, CRLF) - - if endIndex == -1 { - return EmptyStr - } - - if len(header)+1 > endIndex { - return EmptyStr - } - - return strings.TrimSpace(newStr[len(header)+1 : endIndex]) -} - -func (p *Parser) ParseUID(HeaderUIDName string) { - if HeaderUIDName == "" { - return - } - - v := p.GetHeaderValue(HeaderUIDName) - if v == EmptyStr { - return - } - p.UID = v -} - -func (p *Parser) ParseFSCallID(FSCallID string) { - if FSCallID == "" { - return - } - - v := p.GetHeaderValue(FSCallID) - if v == EmptyStr { - return - } - p.FSCallID = v -} - -func init() { - am := map[string]struct{}{ - "INVITE": empty, - "CANCEL": empty, - "ACK": empty, - "BYE": empty, - "INFO": empty, - "OPTIONS": empty, - "UPDATE": empty, - "REGISTER": empty, - "MESSAGE": empty, - "SUBSCRIBE": empty, - "NOTIFY": empty, - "PRACK": empty, - "REFER": empty, - "PUBLISH": empty, - } - - // may be read from env - dm := map[string]struct{}{ - "INFO": empty, - "OPTIONS": empty, - "REGISTER": empty, - "MESSAGE": empty, - "SUBSCRIBE": empty, - "PUBLISH": empty, - } - - acceptMethods = am - discardMethods = dm -} diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go deleted file mode 100644 index 6735bbd..0000000 --- a/pkg/parser/parser_test.go +++ /dev/null @@ -1,371 +0,0 @@ -package parser - -import ( - "testing" - - "sipgrep/pkg/models" - - "github.com/stretchr/testify/assert" -) - -const inviteMsg = "INVITE sip:bob@biloxi.example.com SIP/2.0\r\n" + - "Via: SIP/2.0/TCP client.atlanta.example.com:5060;branch=z9hG4bK74b43\r\n" + - "Max-Forwards: 70\r\n" + - "Route: \r\n" + - "From: Alice ;tag=9fxced76sl\r\n" + - "To: Bob \r\n" + - "Call-ID: 3848276298220188511@atlanta.example.com\r\n" + - "CSeq: 1 INVITE\r\n" + - "Contact: \r\n" + - "Content-Type: application/sdp\r\n" + - "Content-Length: 151\r\n" + - "User-Agent: iphone\r\n" + - "X-UID: uid\r\n" + - "X-FID: fsid\r\n" + - "\r\n" + - "\r\n" + - "v=0\r\n" + - "o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com\r\n" + - "s=-\r\n" + - "c=IN IP4 192.0.2.101\r\n" + - "t=0 0\r\n" + - "m=audio 49172 RTP/AVP 0\r\n" + - "a=rtpmap:0 PCMU/8000\r\n" - -const res2 = "SIP/2.0 200 OK\r\n" + - "Via: SIP/2.0/UDP 192.168.40.216:18627;received=192.168.40.216;branch=z9hG4bKac0f.d8a7e9b2.0\r\n" + - "Call-ID: b546fe7e-c83e-123a-14b2-005056896fef\r\n" + - "From: \"8004\" ;tag=21rK7D7tBjZ5K\r\n" + - "To: ;tag=4255d177dd87458581d581c9f075ac8a\r\n" + - "CSeq: 44350829 NOTIFY\r\n" + - "Content-Length: 0\r\n" - -func TestParseCSeq(t *testing.T) { - successCases := []struct { - in string - expectedCseqNumber int - expectedCseqMethod string - }{ - { - in: res2, - expectedCseqNumber: 44350829, - expectedCseqMethod: "NOTIFY", - }, - { - in: "CSeq: 123 INVITE\r\n", - expectedCseqNumber: 123, - expectedCseqMethod: "INVITE", - }, - { - in: "", - expectedCseqNumber: 0, - expectedCseqMethod: "", - }, - { - in: "CSeq: 123 INVITE\r\n", - expectedCseqNumber: 123, - expectedCseqMethod: "INVITE", - }, - { - in: "CSeq: INVITE\r\n", - expectedCseqNumber: 0, - expectedCseqMethod: "", - }, - { - in: "CSeq: 44350826 INVITE\r\n", - expectedCseqNumber: 44350826, - expectedCseqMethod: "INVITE", - }, - } - - for _, item := range successCases { - sip := Parser{models.SIP{ - Raw: &item.in, - }} - sip.ParseCseq() - assert.Equal(t, item.expectedCseqMethod, sip.CSeqMethod) - assert.Equal(t, item.expectedCseqNumber, sip.CSeqNumber) - } -} - -func TestGetHeaderValue(t *testing.T) { - - successCases := []struct { - in string - header string - expectedValue string - }{ - { - in: "CSeq: 123 INVITE\r\n", - header: "CSeq", - expectedValue: "123 INVITE", - }, - { - in: "Call-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "Call-ID", - expectedValue: "1234", - }, - { - in: "Call-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "Call-ID\r\n", - expectedValue: "", - }, - { - in: "User-Agent: wdd\r\nCall-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "", - expectedValue: "", - }, - { - in: "User-Agent: wdd\r\nCall-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "Call-ID", - expectedValue: "1234", - }, - { - in: "User-Agent: wdd\r\nCall-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "CSeq", - expectedValue: "123 INVITE", - }, - { - in: "User-Agent: wdd\r\nCall-ID: 1234\r\nCSeq: 123 INVITE\r\n", - header: "User-Agent", - expectedValue: "wdd", - }, - { - in: "", - header: "User-Agent", - expectedValue: "", - }, - { - in: inviteMsg, - header: "Via", - expectedValue: "SIP/2.0/TCP client.atlanta.example.com:5060;branch=z9hG4bK74b43", - }, - { - in: inviteMsg, - header: "Max-Forwards", - expectedValue: "70", - }, - { - in: inviteMsg, - header: "Route", - expectedValue: "", - }, - { - in: inviteMsg, - header: "From", - expectedValue: "Alice ;tag=9fxced76sl", - }, - { - in: inviteMsg, - header: "To", - expectedValue: "Bob ", - }, - { - in: inviteMsg, - header: "Call-ID", - expectedValue: "3848276298220188511@atlanta.example.com", - }, - { - in: inviteMsg, - header: "CSeq", - expectedValue: "1 INVITE", - }, - { - in: inviteMsg, - header: "Contact", - expectedValue: "", - }, - { - in: inviteMsg, - header: "Content-Type", - expectedValue: "application/sdp", - }, - { - in: inviteMsg, - header: "Content-Length", - expectedValue: "151", - }, - } - - for _, item := range successCases { - sip := Parser{ - models.SIP{ - Raw: &item.in, - }} - assert.Equal(t, item.expectedValue, sip.GetHeaderValue(item.header)) - } -} - -func TestParseFirstLine(t *testing.T) { - successCases := []struct { - msg string - IsRequest bool - ResponseCode int - Title string - RequestURL string - }{ - {"REGISTER sip:registrar.biloxi.com SIP/2.0\r\nVia: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", true, 0, "REGISTER", "sip:registrar.biloxi.com"}, - {"SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", false, 200, "200", ""}, - {"", false, 0, "", ""}, - } - - for _, c := range successCases { - sip := Parser{models.SIP{ - Raw: &c.msg, - }} - sip.ParseFirstLine() - assert.Equal(t, c.IsRequest, sip.IsRequest) - assert.Equal(t, c.Title, sip.Title) - assert.Equal(t, c.ResponseCode, sip.ResponseCode) - assert.Equal(t, c.RequestURL, sip.RequestURL) - } -} - -func TestParseSIPURL(t *testing.T) { - successCases := []struct { - msg string - user string - domain string - }{ - {";tag=feffa1b1ce68471d8e0a97eb9a1dcb32", "1002", "192.168.159.12"}, - {"", "1002", "192.168.159.12"}, - {"\"800004\" ;tag=v2Gl2kKLlTNNC.Nydij-ri02clU52sTZ", "800004", "001.com"}, - {"sip:800004@001.com", "800004", "001.com"}, - {"Carol ", "carol", "chicago.com"}, - {"sip:+12125551212@phone2net.com;tag=887s", "+12125551212", "phone2net.com"}, - {"", "", ""}, - {">sdfsdf<<", "", ""}, - {"+12125551212@phone2net.com;tag=887s", "", ""}, - {"+12125551212phone2net.com;tag=887s", "", ""}, - {"sip:net.com;tag=887s", "", "net.com"}, - {"sip:net.com", "", "net.com"}, - } - - for _, c := range successCases { - user, domain := ParseSIPURL(c.msg) - assert.Equal(t, c.user, user) - assert.Equal(t, c.domain, domain) - } -} - -func test(t *testing.T) { - successCases := []struct { - msg string - IsRequest bool - Title string - RequestURL string - }{ - {"REGISTER sip:registrar.biloxi.com SIP/2.0\r\nVia: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", true, "REGISTER", "sip:registrar.biloxi.com"}, - {"SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", false, "200", ""}, - {"", false, "", ""}, - } - - for _, c := range successCases { - sip := Parser{models.SIP{ - Raw: &c.msg, - }} - sip.ParseFirstLine() - assert.Equal(t, c.IsRequest, sip.IsRequest) - assert.Equal(t, c.Title, sip.Title) - assert.Equal(t, c.RequestURL, sip.RequestURL) - } -} - -func TestParseFromToUA(t *testing.T) { - - successCases := []struct { - in string - header string - fromUser string - fromDomain string - toUser string - toDomain string - callID string - ua string - }{ - { - in: inviteMsg, - header: "From", - fromUser: "alice", - fromDomain: "atlanta.example.com", - toUser: "bob", - toDomain: "biloxi.example.com", - ua: "iphone", - callID: "3848276298220188511@atlanta.example.com", - }, - } - - for _, item := range successCases { - sip := Parser{ - models.SIP{ - Raw: &item.in, - }} - - sip.ParseFrom() - sip.ParseTo() - sip.ParseFrom() - sip.ParseUserAgent() - sip.ParseCallID() - - assert.Equal(t, item.fromUser, sip.FromUsername) - assert.Equal(t, item.fromDomain, sip.FromDomain) - assert.Equal(t, item.toUser, sip.ToUsername) - assert.Equal(t, item.toDomain, sip.ToDomain) - assert.Equal(t, item.ua, sip.UserAgent) - assert.Equal(t, item.callID, sip.CallID) - } -} - -func TestParseUIDAndFSCallID(t *testing.T) { - - successCases := []struct { - in string - uid string - fid string - }{ - { - in: "X-UID: myuid\r\nX-FID: test-fs-id\r\n", - uid: "myuid", - fid: "test-fs-id", - }, - { - in: inviteMsg, - uid: "uid", - fid: "fsid", - }, - } - - for _, item := range successCases { - sip := Parser{ - models.SIP{ - Raw: &item.in, - }} - - sip.ParseUID("X-UID") - sip.ParseFSCallID("X-FID") - - assert.Equal(t, item.uid, sip.UID) - assert.Equal(t, item.fid, sip.FSCallID) - } -} - -func TestParseCallID(t *testing.T) { - successCases := []struct { - msg string - callID string - }{ - {inviteMsg, "3848276298220188511@atlanta.example.com"}, - {"", ""}, - } - - for _, c := range successCases { - sip := Parser{ - models.SIP{ - Raw: &c.msg, - }} - - sip.ParseCallID() - - assert.Equal(t, c.callID, sip.CallID) - } -} diff --git a/pkg/pg/record.go b/pkg/pg/record.go deleted file mode 100644 index 6723735..0000000 --- a/pkg/pg/record.go +++ /dev/null @@ -1,78 +0,0 @@ -package pg - -import ( - "context" - "database/sql" - "sipgrep/pkg/log" - "sipgrep/pkg/env" - "time" - - "github.com/uptrace/bun" - "github.com/uptrace/bun/dialect/pgdialect" - "github.com/uptrace/bun/driver/pgdriver" -) - -type SIPFlow struct { - bun.BaseModel `bun:"table:sip_flow,alias:s"` - - ID int64 `bun:"id,pk,autoincrement"` - CallID string `bun:"call_id,type:char(64),default:''"` - FSID string `bun:"fs_id,type:char(64),default:''"` - UID string `bun:"uid,type:char(64),default:''"` - CreateAt time.Time `bun:"create_at,pk,type:timestamp,default:current_timestamp"` - CreateAtMS int `bun:"create_at_ms,type:int,default:0"` - SIPMethod string `bun:"sip_method,type:char(16),default:''"` - ToUser string `bun:"to_user,type:char(64),default:''"` - ToDomain string `bun:"to_domain,type:char(64),default:''"` - FromUser string `bun:"from_user,type:char(64),default:''"` - FromDomain string `bun:"from_domain,type:char(64),default:''"` - ResCode int `bun:"res_code,type:int,default:0"` - ResDesc string `bun:"res_desc,type:char(64),default:''"` - CSeqMethod string `bun:"cseq_method,type:char(64),default:''"` - CSeqNo int `bun:"cseq_no,type:int,default:0"` - SrcHost string `bun:"src_host,type:char(32),default:''"` - DstHost string `bun:"dst_host,type:char(32),default:''"` - UA string `bun:"ua,type:char(64),default:''"` - RawMsg string `bun:"raw_msg,type:text,default:''"` -} - -var DB *bun.DB - -func isPartitionExist(){ - re, err := DB.Exec(`SELECT EXISTS ( - SELECT 1 - FROM pg_class c - JOIN pg_inherits i ON c.oid = i.inhrelid - WHERE i.inhparent = 'sip_flow'::regclass - AND c.relname = 'sip_flow_2024_08_26' -);`) - if err != nil { - log.Errorf("%#v", err) - } else { - - } -} - -func init() { - ctx := context.Background() - log.Infof("start connect pgsql") - dsn := "postgres://wangduanduan:@localhost:5432/postgres?sslmode=disable" - sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn))) - DB = bun.NewDB(sqldb, pgdialect.New()) - - DB.SetMaxIdleConns(env.Conf.SqlMaxIdleConn) - DB.SetMaxOpenConns(env.Conf.SqlMaxOpenConn) - DB.SetConnMaxLifetime(time.Minute) - - _, err := DB.NewCreateTable(). - Model((*SIPFlow)(nil)). - PartitionBy("RANGE (create_at)"). - IfNotExists(). - Exec(ctx) - - if err != nil { - log.Errorf("%#v", err) - } else { - log.Infof("创建成功") - } -} diff --git a/pkg/prom/prom.go b/pkg/prom/prom.go deleted file mode 100644 index 766486c..0000000 --- a/pkg/prom/prom.go +++ /dev/null @@ -1,18 +0,0 @@ -package prom - -import ( - "github.com/prometheus/client_golang/prometheus" -) - -var MsgCount = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "sipgrep_msg_count", - }, - []string{"type"}, -) - -func init() { - prometheus.MustRegister( - MsgCount, - ) -} diff --git a/pkg/route/rest.go b/pkg/route/rest.go deleted file mode 100644 index a5ee922..0000000 --- a/pkg/route/rest.go +++ /dev/null @@ -1,64 +0,0 @@ -package route - -import ( - "sipgrep/pkg/log" - "sipgrep/pkg/mysql" - - "github.com/go-playground/validator/v10" - "github.com/gofiber/fiber/v2" -) - -var validate = validator.New() - -func SearchCallID(c *fiber.Ctx) error { - day := c.Params("Day") - callID := c.Params("SIPCallID") - data, err := mysql.FindBySIPCallID(day, callID) - - if err != nil { - log.Errorf("%v", err) - return &fiber.Error{ - Code: fiber.ErrInternalServerError.Code, - Message: "sql query error", - } - } - - return c.JSON(data) -} - -func Search(c *fiber.Ctx) error { - sp := mysql.SearchParams{ - BeginTime: c.Query("BeginTime"), - EndTime: c.Query("EndTime"), - Caller: c.Query("Caller"), - CallerDomain: c.Query("CallerDomain"), - Callee: c.Query("Callee"), - CalleeDomain: c.Query("CalleeDomain"), - } - - log.Infof("%#v", sp) - - if err := validate.Struct(sp); err != nil { - log.Errorf("%v", err) - return &fiber.Error{ - Code: fiber.ErrBadRequest.Code, - Message: "query string error", - } - } - - sql := mysql.GetSearchSql(sp) - - log.Infof("sql %s", sql) - - table, err := mysql.Search(sql) - - if err != nil { - log.Errorf("%v", err) - return &fiber.Error{ - Code: fiber.ErrInternalServerError.Code, - Message: "sql query error", - } - } - - return c.JSON(table) -} diff --git a/pkg/util/util.go b/pkg/util/util.go deleted file mode 100644 index 18fa106..0000000 --- a/pkg/util/util.go +++ /dev/null @@ -1,28 +0,0 @@ -package util - -import ( - "strconv" - "time" -) - -const DayFormat = "2006_01_02" - -func ReverseString(s string) string { - runes := []rune(s) - for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { - runes[i], runes[j] = runes[j], runes[i] - } - return string(runes) -} - -func StrToInt(s string) int { - num, err := strconv.Atoi(s) - if err != nil { - return 0 - } - return num -} - -func GetDay(days int) string { - return time.Now().AddDate(0, 0, days).Format(DayFormat) -} diff --git a/pkg/util/util_test.go b/pkg/util/util_test.go deleted file mode 100644 index 781f2f2..0000000 --- a/pkg/util/util_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package util - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestrEverseString(t *testing.T) { - successCases := []struct { - in string - expected string - }{ - { - in: "abc", - expected: "cba", - }, - { - in: "1234", - expected: "4321", - }, - } - - for _, item := range successCases { - out := ReverseString(item.in) - assert.Equal(t, item.expected, out) - assert.Equal(t, item.expected, out) - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6c12d5..05b445e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2771 +1,882 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - -devDependencies: - '@types/jquery': - specifier: ^3.5.27 - version: 3.5.27 - '@types/react': - specifier: ^18.2.15 - version: 18.2.33 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.14 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.9.0(eslint@8.52.0)(typescript@5.2.2) - '@vitejs/plugin-react': - specifier: ^4.0.3 - version: 4.1.0(vite@4.5.0) - antd: - specifier: ^5.10.2 - version: 5.10.2(react-dom@18.2.0)(react@18.2.0) - axios: - specifier: ^1.6.0 - version: 1.6.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - eslint: - specifier: ^8.45.0 - version: 8.52.0 - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.52.0) - eslint-plugin-react-refresh: - specifier: ^0.4.3 - version: 0.4.3(eslint@8.52.0) - jotai: - specifier: ^2.5.0 - version: 2.5.0(@types/react@18.2.33)(react@18.2.0) - jquery: - specifier: ^3.7.1 - version: 3.7.1 - normalize.css: - specifier: ^8.0.1 - version: 8.0.1 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - react-router-dom: - specifier: ^6.17.0 - version: 6.17.0(react-dom@18.2.0)(react@18.2.0) - svg-sequence-diagram: - specifier: ^1.3.0 - version: 1.3.0 - typescript: - specifier: ^5.0.2 - version: 5.2.2 - vite: - specifier: ^4.4.5 - version: 4.5.0 +importers: -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@ant-design/colors@7.0.0: - resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} - dependencies: - '@ctrl/tinycolor': 3.6.1 - dev: true - - /@ant-design/cssinjs@1.17.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vu7lnfEx4Mf8MPzZxn506Zen3Nt4fRr2uutwvdCuTCN5IiU0lDdQ0tiJ24/rmB8+pefwjluYsbyzbQSbgfJy+A==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + .: dependencies: - '@babel/runtime': 7.23.2 - '@emotion/hash': 0.8.0 - '@emotion/unitless': 0.7.5 - classnames: 2.3.2 - csstype: 3.1.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stylis: 4.3.0 - dev: true - - /@ant-design/icons-svg@4.3.1: - resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==} - dev: true - - /@ant-design/icons@5.2.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==} - engines: {node: '>=8'} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@ant-design/colors': 7.0.0 - '@ant-design/icons-svg': 4.3.1 - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@ant-design/react-slick@1.0.2(react@18.2.0): - resolution: {integrity: sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==} - peerDependencies: - react: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - json2mq: 0.2.0 - react: 18.2.0 - resize-observer-polyfill: 1.5.1 - throttle-debounce: 5.0.0 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.2: - resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.2: - resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + ejs: + specifier: ^3.1.10 + version: 3.1.10 + express: + specifier: ^4.19.2 + version: 4.19.2 + log4js: + specifier: ^6.9.1 + version: 6.9.1 + pg: + specifier: ^8.12.0 + version: 8.12.0 + validator: + specifier: ^13.12.0 + version: 13.12.0 - /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: true +packages: - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - dev: true + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: true + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: true + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true - - /@babel/traverse@7.23.2: - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} - /@ctrl/tinycolor@3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - dev: true - - /@emotion/hash@0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: true - - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: true - - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} - /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.52.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} - /@eslint/js@8.52.0: - resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} - /@rc-component/color-picker@1.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@ctrl/tinycolor': 3.6.1 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@rc-component/context@1.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@rc-component/mini-decimal@1.1.0: - resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} - engines: {node: '>=8.x'} - dependencies: - '@babel/runtime': 7.23.2 - dev: true + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /@rc-component/mutate-observer@1.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@rc-component/portal@1.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@rc-component/tour@1.10.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@rc-component/trigger@1.18.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vloGnWpeTmt7DBw0OHnG9poQ8h1WFh0hebq6fpgVjGYSxm6JU8rLH+kNwVNNvhL6Rg5He4ESjOk6O7uF9dJhxA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@remix-run/router@1.10.0: - resolution: {integrity: sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==} - engines: {node: '>=14.0.0'} - dev: true - - /@types/babel__core@7.20.3: - resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.6 - '@types/babel__template': 7.4.3 - '@types/babel__traverse': 7.20.3 - dev: true - - /@types/babel__generator@7.6.6: - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} - dependencies: - '@babel/types': 7.23.0 - dev: true + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} - /@types/babel__template@7.4.3: - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - /@types/babel__traverse@7.20.3: - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} - dependencies: - '@babel/types': 7.23.0 - dev: true + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /@types/jquery@3.5.27: - resolution: {integrity: sha512-TR28Y8ezIGgfyA02UOh9x+Fy16/1qWYAnvtRd2gTBJuccX/vmddyti0MezLkTv7f+OLofVc2T961VPyKv1tXJQ==} - dependencies: - '@types/sizzle': 2.3.6 - dev: true + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - /@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} - dev: true + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - /@types/prop-types@15.7.9: - resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} - dev: true + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} - /@types/react-dom@18.2.14: - resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} - dependencies: - '@types/react': 18.2.33 - dev: true + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} - /@types/react@18.2.33: - resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} - dependencies: - '@types/prop-types': 15.7.9 - '@types/scheduler': 0.16.5 - csstype: 3.1.2 - dev: true - - /@types/scheduler@0.16.5: - resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} - dev: true - - /@types/semver@7.5.4: - resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} - dev: true - - /@types/sizzle@2.3.6: - resolution: {integrity: sha512-m04Om5Gz6kbjUwAQ7XJJQ30OdEFsSmAVsvn4NYwcTRyMVpKKa1aPuESw1n2CxS5fYkOQv3nHgDKeNa8e76fUkw==} - dev: true - - /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/type-utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4 - eslint: 8.52.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} - /@typescript-eslint/parser@6.9.0(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4 - eslint: 8.52.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} - /@typescript-eslint/scope-manager@6.9.0: - resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - dev: true + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} - /@typescript-eslint/type-utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.52.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /@typescript-eslint/types@6.9.0: - resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} - /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): - resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true - /@typescript-eslint/utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@types/json-schema': 7.0.14 - '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) - eslint: 8.52.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - /@typescript-eslint/visitor-keys@6.9.0: - resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.9.0 - eslint-visitor-keys: 3.4.3 - dev: true + log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} - /@vitejs/plugin-react@4.1.0(vite@4.5.0): - resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) - '@types/babel__core': 7.20.3 - react-refresh: 0.14.0 - vite: 4.5.0 - transitivePeerDependencies: - - supports-color - dev: true + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true + hasBin: true - /antd@5.10.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0kV6PmlJi7vhPmYH9GCAlU62ZhiuLF+gE3REJ/9MZTo++/3i5q6SALNoRgHLMsa+rX50U3RO3wJVY+fPib594Q==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@ant-design/colors': 7.0.0 - '@ant-design/cssinjs': 1.17.2(react-dom@18.2.0)(react@18.2.0) - '@ant-design/icons': 5.2.6(react-dom@18.2.0)(react@18.2.0) - '@ant-design/react-slick': 1.0.2(react@18.2.0) - '@babel/runtime': 7.23.2 - '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 1.4.1(react-dom@18.2.0)(react@18.2.0) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0)(react@18.2.0) - '@rc-component/tour': 1.10.0(react-dom@18.2.0)(react@18.2.0) - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - copy-to-clipboard: 3.3.3 - dayjs: 1.11.10 - qrcode.react: 3.1.0(react@18.2.0) - rc-cascader: 3.18.1(react-dom@18.2.0)(react@18.2.0) - rc-checkbox: 3.1.0(react-dom@18.2.0)(react@18.2.0) - rc-collapse: 3.7.1(react-dom@18.2.0)(react@18.2.0) - rc-dialog: 9.3.4(react-dom@18.2.0)(react@18.2.0) - rc-drawer: 6.5.2(react-dom@18.2.0)(react@18.2.0) - rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) - rc-field-form: 1.39.0(react-dom@18.2.0)(react@18.2.0) - rc-image: 7.3.1(react-dom@18.2.0)(react@18.2.0) - rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0) - rc-input-number: 8.1.0(react-dom@18.2.0)(react@18.2.0) - rc-mentions: 2.8.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-notification: 5.2.0(react-dom@18.2.0)(react@18.2.0) - rc-pagination: 3.6.1(react-dom@18.2.0)(react@18.2.0) - rc-picker: 3.14.6(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) - rc-progress: 3.5.1(react-dom@18.2.0)(react@18.2.0) - rc-rate: 2.12.0(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-segmented: 2.2.2(react-dom@18.2.0)(react@18.2.0) - rc-select: 14.9.2(react-dom@18.2.0)(react@18.2.0) - rc-slider: 10.3.1(react-dom@18.2.0)(react@18.2.0) - rc-steps: 6.0.1(react-dom@18.2.0)(react@18.2.0) - rc-switch: 4.1.0(react-dom@18.2.0)(react@18.2.0) - rc-table: 7.34.4(react-dom@18.2.0)(react@18.2.0) - rc-tabs: 12.12.1(react-dom@18.2.0)(react@18.2.0) - rc-textarea: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-tooltip: 6.1.2(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0) - rc-tree-select: 5.13.0(react-dom@18.2.0)(react@18.2.0) - rc-upload: 4.3.5(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - scroll-into-view-if-needed: 3.1.0 - throttle-debounce: 5.0.0 - transitivePeerDependencies: - - date-fns - - luxon - - moment - dev: true + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} - /array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - dev: true + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /async-validator@4.2.5: - resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - dev: true + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} - /axios@1.6.0: - resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} - dependencies: - follow-redirects: 1.15.3 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001554 - electron-to-chromium: 1.4.567 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /caniuse-lite@1.0.30001554: - resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: true + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - /compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - dev: true + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - dependencies: - toggle-selection: 1.0.6 - dev: true + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: true + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} - /electron-to-chromium@1.4.567: - resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} - dev: true + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} - /eslint-plugin-react-hooks@4.6.0(eslint@8.52.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.52.0 - dev: true + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /eslint-plugin-react-refresh@0.4.3(eslint@8.52.0): - resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==} - peerDependencies: - eslint: '>=7' - dependencies: - eslint: 8.52.0 - dev: true + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.52.0: - resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.52.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true + streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.1 - dev: true + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true +snapshots: - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + accepts@1.3.8: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + negotiator: 0.6.3 - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + ansi-styles@4.3.0: dependencies: - is-glob: 4.0.3 - dev: true + color-convert: 2.0.1 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true + array-flatten@1.1.1: {} - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + async@3.2.6: {} - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + balanced-match@1.0.2: {} - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} + body-parser@1.20.2: dependencies: - type-fest: 0.20.2 - dev: true + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + brace-expansion@1.1.11: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + balanced-match: 1.0.2 + concat-map: 0.0.1 - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true + bytes@3.1.2: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + call-bind@1.0.7: dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + color-convert@2.0.1: dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + color-name: 1.1.4 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + color-name@1.1.4: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + concat-map@0.0.1: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + content-disposition@0.5.4: dependencies: - is-extglob: 2.1.1 - dev: true + safe-buffer: 5.2.1 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + content-type@1.0.5: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + cookie-signature@1.0.6: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + cookie@0.6.0: {} - /jotai@2.5.0(@types/react@18.2.33)(react@18.2.0): - resolution: {integrity: sha512-iPJDFrhNw3KU4o4SSAESeZoW+nM1L/76VULXZWF23qmivBEcbAQjiF5n1W4Hn5dXAol4tmtEYe4HH7d9emEz0Q==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=17.0.0' - react: '>=17.0.0' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - dependencies: - '@types/react': 18.2.33 - react: 18.2.0 - dev: true + date-format@4.0.14: {} - /jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} - dev: true + dayjs@1.11.13: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + debug@2.6.9: + dependencies: + ms: 2.0.0 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + debug@4.3.6: dependencies: - argparse: 2.0.1 - dev: true + ms: 2.1.2 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + depd@2.0.0: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + destroy@1.2.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + ee-first@1.1.1: {} - /json2mq@0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + ejs@3.1.10: dependencies: - string-convert: 0.2.1 - dev: true + jake: 10.9.2 - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + encodeurl@1.0.2: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + es-define-property@1.0.0: dependencies: - json-buffer: 3.0.1 - dev: true + get-intrinsic: 1.2.4 - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true + es-errors@1.3.0: {} - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true + escape-html@1.0.3: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + etag@1.8.1: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + express@4.19.2: dependencies: - js-tokens: 4.0.0 + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + filelist@1.0.4: dependencies: - yallist: 3.1.1 - dev: true + minimatch: 5.1.6 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + finalhandler@1.2.0: dependencies: - yallist: 4.0.0 - dev: true + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + flatted@3.3.1: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + forwarded@0.2.0: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + fresh@0.5.2: {} + + fs-extra@8.1.0: dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + function-bind@1.1.2: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + get-intrinsic@1.2.4: dependencies: - mime-db: 1.52.0 - dev: true + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + gopd@1.0.1: dependencies: - brace-expansion: 1.1.11 - dev: true + get-intrinsic: 1.2.4 - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + graceful-fs@4.2.11: {} - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + has-flag@4.0.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true + has-proto@1.0.3: {} - /normalize.css@8.0.1: - resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} - dev: true + has-symbols@1.0.3: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + hasown@2.0.2: dependencies: - wrappy: 1.0.2 - dev: true + function-bind: 1.1.2 - /opentype.js@1.3.4: - resolution: {integrity: sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==} - engines: {node: '>= 8.0.0'} - hasBin: true + http-errors@2.0.0: dependencies: - string.prototype.codepointat: 0.2.1 - tiny-inflate: 1.0.3 - dev: true + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + iconv-lite@0.4.24: dependencies: - yocto-queue: 0.1.0 - dev: true + safer-buffer: 2.1.2 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + jake@10.9.2: dependencies: - callsites: 3.1.0 - dev: true + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + log4js@6.9.1: + dependencies: + date-format: 4.0.14 + debug: 4.3.6 + flatted: 3.3.1 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + media-typer@0.3.0: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + merge-descriptors@1.0.1: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + methods@1.1.2: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + mime-db@1.52.0: {} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + mime-types@2.1.35: dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - dev: true + mime-db: 1.52.0 - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + mime@1.6.0: {} - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 - /qrcode.react@3.1.0(react@18.2.0): - resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + minimatch@5.1.6: dependencies: - react: 18.2.0 - dev: true + brace-expansion: 2.0.1 - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + ms@2.0.0: {} - /rc-cascader@3.18.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-M7Xr5Fs/E87ZGustfObtBYQjsvBCET0UX2JYXB2GmOP+2fsZgjaRGXK+CJBmmWXQ6o4OFinpBQBXG4wJOQ5MEg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - array-tree-filter: 2.1.0 - classnames: 2.3.2 - rc-select: 14.9.2(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-checkbox@3.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-collapse@3.7.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-dialog@9.3.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-drawer@6.5.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-dropdown@4.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==} - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-field-form@1.39.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-V7Wk7uji1jBsUGGgP788H9rpFy55HLiD4lywTlktUGjK7EgW5dt+mq1MPbtCpPRMzs83vZBW4SOChOmCACz4WA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - async-validator: 4.2.5 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-image@7.3.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Tu3vcUyMHa6zxTiQRzHt1glbGwuNWzeQBG9O6qIdy/+1ue0Qb70it+jUct1YPVNkJa/QfaTfUhmsNsqrw7mgsg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-dialog: 9.3.4(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-input-number@8.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-bdHgduOxuN0lrhzgPmoKbhRD4GLIzVcddVz972/JHPHr7oLwPX5xDb9w4bXhuMzyT2VzQy7nggRCfH3yAl09oA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/mini-decimal': 1.1.0 - classnames: 2.3.2 - rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-input@1.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nQRmBvEFoGi+SNRDavccZ8ueyhFgmxkWqIt4aDyuNJgUZF12HJKIwDhAafUM7N+g7PyuW9FH3pf3zPHzdiCWbA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-mentions@2.8.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-LBMkO6bSGhEvS1CvMK978qGN82tI+mzk7l/uTiQJH+UDiwpvq+pxK4DxU5b6Q1T5LW6bn2pSua9RaZKZrDoBOw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0) - rc-textarea: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-menu@9.12.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-motion@2.9.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-notification@5.2.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HwUSypEW4mfOpiakJ7dm6TAKf+3zuSR2xm0I0XMes493rtA3n4EVMvQyldrp23hUwCE3RFj8oncyU1E8iNC4ag==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-overflow@1.3.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-pagination@3.6.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-R/sUnKKXx1Nm4kZfUKS3YKa7yEPF1ZkVB/AynQaHt+nMER7h9wPTfliDJFdYo+RM/nk2JD4Yc5QpUq8fIQHeug==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-picker@3.14.6(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag==} - engines: {node: '>=8.x'} - peerDependencies: - date-fns: '>= 2.x' - dayjs: '>= 1.x' - luxon: '>= 3.x' - moment: '>= 2.x' - react: '>=16.9.0' - react-dom: '>=16.9.0' - peerDependenciesMeta: - date-fns: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - dayjs: 1.11.10 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-progress@3.5.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-rate@2.12.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-resize-observer@1.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - resize-observer-polyfill: 1.5.1 - dev: true - - /rc-segmented@2.2.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-select@14.9.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VQ15sRFgPURHb8ZcZNSDtb2rAw3+C9xlL0nDziwNHTEW1KvEpZ8y+0v5w24X/Bpl9b3cW1BOyW1F5UqSAq+7Dg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.11.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-slider@10.3.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XszsZLkbjcG9ogQy/zUC0n2kndoKUAnY/Vnk1Go5Gx+JJQBz0Tl15d5IfSiglwBUZPS9vsUJZkfCmkIZSqWbcA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-steps@6.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-switch@4.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-table@7.34.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-os+i88Y2AO/6dNkOgJkKSHgXYaZZGnuOEEe+nyaq5IRgvAQNhLysUjXt2objtBeFDEZR8TqXrajwBNRUwunmdw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/context': 1.4.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.11.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-tabs@12.12.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-e10VBjEkECdPl4XZSs9to81SE+mgclBTM7J8/LMsFqmJoi05Tci91bRnmeeDtrcOCx2PuZdJv57XUlC4d8PEIw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-textarea@1.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CiqK+uyoJlnfufbC0kwfHJpfElhQacuDSNyNQ/xGnA/QMaJLDbgmqRT8QmX0T0KD/ws/hy6qqRaGJSsrRR5uiQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-tooltip@6.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - '@rc-component/trigger': 1.18.0(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-tree-select@5.13.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-g01JU9EdE7j/9KfDKtmvFqJ7ZDNIYDzkpmAXllbTBFoRNhWJBjW1x/dCZLVG+IdZeIz8SKJkgZzCf1CUZrzV/Q==} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-select: 14.9.2(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-tree@5.7.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==} - engines: {node: '>=10.x'} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.11.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-upload@4.3.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /rc-util@5.38.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yV/YBNdFn+edyBpBdCqkPE29Su0jWcHNgwx2dJbRqMrMfrUcMJUjCRV+ZPhcvWyKFJ63GzEerPrz9JIVo0zXmA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.23.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.2.0 - dev: true - - /rc-virtual-list@3.11.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.23.2 - classnames: 2.3.2 - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + ms@2.1.2: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + ms@2.1.3: {} - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true + negotiator@0.6.3: {} - /react-router-dom@6.17.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.10.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.17.0(react@18.2.0) - dev: true - - /react-router@6.17.0(react@18.2.0): - resolution: {integrity: sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.10.0 - react: 18.2.0 - dev: true + object-inspect@1.13.2: {} - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + on-finished@2.4.1: dependencies: - loose-envify: 1.4.0 + ee-first: 1.1.1 - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true + parseurl@1.3.3: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: true + path-to-regexp@0.1.7: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + pg-cloudflare@1.1.1: + optional: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true + pg-connection-string@2.6.4: {} - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true + pg-int8@1.0.1: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + pg-pool@3.6.2(pg@8.12.0): dependencies: - queue-microtask: 1.2.3 - dev: true + pg: 8.12.0 - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 + pg-protocol@1.6.1: {} - /scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + pg-types@2.2.0: dependencies: - compute-scroll-into-view: 3.1.0 - dev: true + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + pg@8.12.0: dependencies: - lru-cache: 6.0.0 - dev: true + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + pgpass@1.0.5: dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + split2: 4.2.0 - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true + postgres-array@2.0.0: {} - /string-convert@0.2.1: - resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} - dev: true + postgres-bytea@1.0.0: {} - /string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - dev: true + postgres-date@1.0.7: {} - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + postgres-interval@1.2.0: dependencies: - ansi-regex: 5.0.1 - dev: true + xtend: 4.0.2 - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /stylis@4.3.0: - resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + proxy-addr@2.0.7: dependencies: - has-flag: 3.0.0 - dev: true + forwarded: 0.2.0 + ipaddr.js: 1.9.1 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + qs@6.11.0: dependencies: - has-flag: 4.0.0 - dev: true + side-channel: 1.0.6 - /svg-sequence-diagram@1.3.0: - resolution: {integrity: sha512-lPio3AOAynu6a7UewvmZWu8fSrx3YLS9GGQy8Fi0ZwWgI5OuKdOY0A6mgSKDnNi7cmV+3ZDsz7axJ5dmR3jndQ==} - hasBin: true - dependencies: - opentype.js: 1.3.4 - dev: true + range-parser@1.2.1: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 - /throttle-debounce@5.0.0: - resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} - engines: {node: '>=12.22'} - dev: true + rfdc@1.4.1: {} - /tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: true + safe-buffer@5.2.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + safer-buffer@2.1.2: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + send@0.18.0: dependencies: - is-number: 7.0.0 - dev: true + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color - /toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - dev: true + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + set-function-length@1.2.2: dependencies: - typescript: 5.2.2 - dev: true + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + setprototypeof@1.2.0: {} + + side-channel@1.0.6: dependencies: - prelude-ls: 1.2.1 - dev: true + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + split2@4.2.0: {} - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + statuses@2.0.1: {} - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + streamroller@3.1.5: dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true + date-format: 4.0.14 + debug: 4.3.6 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + supports-color@7.2.0: dependencies: - punycode: 2.3.0 - dev: true + has-flag: 4.0.0 - /vite@4.5.0: - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.18.20 - postcss: 8.4.31 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true + toidentifier@1.0.1: {} - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + type-is@1.6.18: dependencies: - isexe: 2.0.0 - dev: true + media-typer: 0.3.0 + mime-types: 2.1.35 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + universalify@0.1.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + unpipe@1.0.0: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + utils-merge@1.0.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + validator@13.12.0: {} + + vary@1.1.2: {} + + xtend@4.0.2: {} diff --git a/public/css/diagram.css b/public/css/diagram.css new file mode 100644 index 0000000..ecc8ade --- /dev/null +++ b/public/css/diagram.css @@ -0,0 +1,13 @@ +.region.focus .outline { + stroke-width: 5px; + stroke: rgba(255, 128, 0, 0.5); +} +.region:hover .outline{ + stroke-width: 5px; + stroke: rgba(250, 216, 66, 0.497); + cursor: pointer; +} + +.region:hover{ + cursor: pointer; +} \ No newline at end of file diff --git a/public/htmx-2.0.2/htmx.js b/public/htmx-2.0.2/htmx.js new file mode 100644 index 0000000..c11fbbd --- /dev/null +++ b/public/htmx-2.0.2/htmx.js @@ -0,0 +1 @@ +var htmx=function(){"use strict";const Q={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){const n=cn(e,t||"post");return n.values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:true,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null,disableInheritance:false,responseHandling:[{code:"204",swap:false},{code:"[23]..",swap:true},{code:"[45]..",swap:false,error:true}],allowNestedOobSwaps:true},parseInterval:null,_:null,version:"2.0.2"};Q.onLoad=$;Q.process=Dt;Q.on=be;Q.off=we;Q.trigger=de;Q.ajax=Hn;Q.find=r;Q.findAll=p;Q.closest=g;Q.remove=K;Q.addClass=Y;Q.removeClass=o;Q.toggleClass=W;Q.takeClass=ge;Q.swap=ze;Q.defineExtension=Bn;Q.removeExtension=Un;Q.logAll=z;Q.logNone=J;Q.parseInterval=h;Q._=_;const n={addTriggerHandler:Et,bodyContains:le,canAccessLocalStorage:j,findThisElement:Ee,filterValues:hn,swap:ze,hasAttribute:s,getAttributeValue:te,getClosestAttributeValue:re,getClosestMatch:T,getExpressionVars:Cn,getHeaders:dn,getInputValues:cn,getInternalData:ie,getSwapSpecification:pn,getTriggerSpecs:lt,getTarget:Ce,makeFragment:D,mergeObjects:ue,makeSettleInfo:xn,oobSwap:Te,querySelectorExt:ae,settleImmediately:Gt,shouldCancel:ht,triggerEvent:de,triggerErrorEvent:fe,withExtensions:Bt};const v=["get","post","put","delete","patch"];const O=v.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");const R=e("head");function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function h(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e instanceof Element&&e.getAttribute(t)}function s(e,t){return!!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){const t=e.parentElement;if(!t&&e.parentNode instanceof ShadowRoot)return e.parentNode;return t}function ne(){return document}function H(e,t){return e.getRootNode?e.getRootNode({composed:t}):ne()}function T(e,t){while(e&&!t(e)){e=u(e)}return e||null}function q(e,t,n){const r=te(t,n);const o=te(t,"hx-disinherit");var i=te(t,"hx-inherit");if(e!==t){if(Q.config.disableInheritance){if(i&&(i==="*"||i.split(" ").indexOf(n)>=0)){return r}else{return null}}if(o&&(o==="*"||o.split(" ").indexOf(n)>=0)){return"unset"}}return r}function re(t,n){let r=null;T(t,function(e){return!!(r=q(t,ce(e),n))});if(r!=="unset"){return r}}function f(e,t){const n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return!!n&&n.call(e,t)}function L(e){const t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;const n=t.exec(e);if(n){return n[1].toLowerCase()}else{return""}}function N(e){const t=new DOMParser;return t.parseFromString(e,"text/html")}function A(e,t){while(t.childNodes.length>0){e.append(t.childNodes[0])}}function I(e){const t=ne().createElement("script");se(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}return t}function P(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function k(e){Array.from(e.querySelectorAll("script")).forEach(e=>{if(P(e)){const t=I(e);const n=e.parentNode;try{n.insertBefore(t,e)}catch(e){w(e)}finally{e.remove()}}})}function D(e){const t=e.replace(R,"");const n=L(t);let r;if(n==="html"){r=new DocumentFragment;const i=N(e);A(r,i.body);r.title=i.title}else if(n==="body"){r=new DocumentFragment;const i=N(t);A(r,i.body);r.title=i.title}else{const i=N('");r=i.querySelector("template").content;r.title=i.title;var o=r.querySelector("title");if(o&&o.parentNode===r){o.remove();r.title=o.innerText}}if(r){if(Q.config.allowScriptTags){k(r)}else{r.querySelectorAll("script").forEach(e=>e.remove())}}return r}function oe(e){if(e){e()}}function t(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function M(e){return typeof e==="function"}function X(e){return t(e,"Object")}function ie(e){const t="htmx-internal-data";let n=e[t];if(!n){n=e[t]={}}return n}function F(t){const n=[];if(t){for(let e=0;e=0}function le(e){const t=e.getRootNode&&e.getRootNode();if(t&&t instanceof window.ShadowRoot){return ne().body.contains(t.host)}else{return ne().body.contains(e)}}function U(e){return e.trim().split(/\s+/)}function ue(e,t){for(const n in t){if(t.hasOwnProperty(n)){e[n]=t[n]}}return e}function S(e){try{return JSON.parse(e)}catch(e){w(e);return null}}function j(){const e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function V(t){try{const e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function _(e){return vn(ne().body,function(){return eval(e)})}function $(t){const e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function z(){Q.logger=function(e,t,n){if(console){console.log(t,e,n)}}}function J(){Q.logger=null}function r(e,t){if(typeof e!=="string"){return e.querySelector(t)}else{return r(ne(),e)}}function p(e,t){if(typeof e!=="string"){return e.querySelectorAll(t)}else{return p(ne(),e)}}function E(){return window}function K(e,t){e=y(e);if(t){E().setTimeout(function(){K(e);e=null},t)}else{u(e).removeChild(e)}}function ce(e){return e instanceof Element?e:null}function G(e){return e instanceof HTMLElement?e:null}function Z(e){return typeof e==="string"?e:null}function d(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function Y(e,t,n){e=ce(y(e));if(!e){return}if(n){E().setTimeout(function(){Y(e,t);e=null},n)}else{e.classList&&e.classList.add(t)}}function o(e,t,n){let r=ce(y(e));if(!r){return}if(n){E().setTimeout(function(){o(r,t);r=null},n)}else{if(r.classList){r.classList.remove(t);if(r.classList.length===0){r.removeAttribute("class")}}}}function W(e,t){e=y(e);e.classList.toggle(t)}function ge(e,t){e=y(e);se(e.parentElement.children,function(e){o(e,t)});Y(ce(e),t)}function g(e,t){e=ce(y(e));if(e&&e.closest){return e.closest(t)}else{do{if(e==null||f(e,t)){return e}}while(e=e&&ce(u(e)));return null}}function l(e,t){return e.substring(0,t.length)===t}function pe(e,t){return e.substring(e.length-t.length)===t}function i(e){const t=e.trim();if(l(t,"<")&&pe(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function m(e,t,n){e=y(e);if(t.indexOf("closest ")===0){return[g(ce(e),i(t.substr(8)))]}else if(t.indexOf("find ")===0){return[r(d(e),i(t.substr(5)))]}else if(t==="next"){return[ce(e).nextElementSibling]}else if(t.indexOf("next ")===0){return[me(e,i(t.substr(5)),!!n)]}else if(t==="previous"){return[ce(e).previousElementSibling]}else if(t.indexOf("previous ")===0){return[ye(e,i(t.substr(9)),!!n)]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else if(t==="root"){return[H(e,!!n)]}else if(t.indexOf("global ")===0){return m(e,t.slice(7),true)}else{return F(d(H(e,!!n)).querySelectorAll(i(t)))}}var me=function(t,e,n){const r=d(H(t,n)).querySelectorAll(e);for(let e=0;e=0;e--){const o=r[e];if(o.compareDocumentPosition(t)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}};function ae(e,t){if(typeof e!=="string"){return m(e,t)[0]}else{return m(ne().body,e)[0]}}function y(e,t){if(typeof e==="string"){return r(d(t)||document,e)}else{return e}}function xe(e,t,n){if(M(t)){return{target:ne().body,event:Z(e),listener:t}}else{return{target:y(e),event:Z(t),listener:n}}}function be(t,n,r){_n(function(){const e=xe(t,n,r);e.target.addEventListener(e.event,e.listener)});const e=M(n);return e?n:r}function we(t,n,r){_n(function(){const e=xe(t,n,r);e.target.removeEventListener(e.event,e.listener)});return M(n)?n:r}const ve=ne().createElement("output");function Se(e,t){const n=re(e,t);if(n){if(n==="this"){return[Ee(e,t)]}else{const r=m(e,n);if(r.length===0){w('The selector "'+n+'" on '+t+" returned no matches!");return[ve]}else{return r}}}}function Ee(e,t){return ce(T(e,function(e){return te(ce(e),t)!=null}))}function Ce(e){const t=re(e,"hx-target");if(t){if(t==="this"){return Ee(e,"hx-target")}else{return ae(e,t)}}else{const n=ie(e);if(n.boosted){return ne().body}else{return e}}}function Oe(t){const n=Q.config.attributesToSettle;for(let e=0;e0){s=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{s=e}const n=ne().querySelectorAll(t);if(n){se(n,function(e){let t;const n=o.cloneNode(true);t=ne().createDocumentFragment();t.appendChild(n);if(!He(s,e)){t=d(n)}const r={shouldSwap:true,target:e,fragment:t};if(!de(e,"htmx:oobBeforeSwap",r))return;e=r.target;if(r.shouldSwap){_e(s,e,e,t,i)}se(i.elts,function(e){de(e,"htmx:oobAfterSwap",r)})});o.parentNode.removeChild(o)}else{o.parentNode.removeChild(o);fe(ne().body,"htmx:oobErrorNoTarget",{content:o})}return e}function qe(e){se(p(e,"[hx-preserve], [data-hx-preserve]"),function(e){const t=te(e,"id");const n=ne().getElementById(t);if(n!=null){e.parentNode.replaceChild(n,e)}})}function Le(l,e,u){se(e.querySelectorAll("[id]"),function(t){const n=ee(t,"id");if(n&&n.length>0){const r=n.replace("'","\\'");const o=t.tagName.replace(":","\\:");const e=d(l);const i=e&&e.querySelector(o+"[id='"+r+"']");if(i&&i!==e){const s=t.cloneNode();Re(t,i);u.tasks.push(function(){Re(t,s)})}}})}function Ne(e){return function(){o(e,Q.config.addedClass);Dt(ce(e));Ae(d(e));de(e,"htmx:load")}}function Ae(e){const t="[autofocus]";const n=G(f(e,t)?e:e.querySelector(t));if(n!=null){n.focus()}}function c(e,t,n,r){Le(e,n,r);while(n.childNodes.length>0){const o=n.firstChild;Y(ce(o),Q.config.addedClass);e.insertBefore(o,t);if(o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE){r.tasks.push(Ne(o))}}}function Ie(e,t){let n=0;while(n0}function ze(e,t,r,o){if(!o){o={}}e=y(e);const n=document.activeElement;let i={};try{i={elt:n,start:n?n.selectionStart:null,end:n?n.selectionEnd:null}}catch(e){}const s=xn(e);if(r.swapStyle==="textContent"){e.textContent=t}else{let n=D(t);s.title=n.title;if(o.selectOOB){const u=o.selectOOB.split(",");for(let t=0;t0){E().setTimeout(l,r.settleDelay)}else{l()}}function Je(e,t,n){const r=e.getResponseHeader(t);if(r.indexOf("{")===0){const o=S(r);for(const i in o){if(o.hasOwnProperty(i)){let e=o[i];if(X(e)){n=e.target!==undefined?e.target:n}else{e={value:e}}de(n,i,e)}}}else{const s=r.split(",");for(let e=0;e0){const s=o[0];if(s==="]"){e--;if(e===0){if(n===null){t=t+"true"}o.shift();t+=")})";try{const l=vn(r,function(){return Function(t)()},function(){return true});l.source=t;return l}catch(e){fe(ne().body,"htmx:syntax:error",{error:e,source:t});return null}}}else if(s==="["){e++}if(nt(s,n,i)){t+="(("+i+"."+s+") ? ("+i+"."+s+") : (window."+s+"))"}else{t=t+s}n=o.shift()}}}function b(e,t){let n="";while(e.length>0&&!t.test(e[0])){n+=e.shift()}return n}function ot(e){let t;if(e.length>0&&Qe.test(e[0])){e.shift();t=b(e,et).trim();e.shift()}else{t=b(e,x)}return t}const it="input, textarea, select";function st(e,t,n){const r=[];const o=tt(t);do{b(o,We);const l=o.length;const u=b(o,/[,\[\s]/);if(u!==""){if(u==="every"){const c={trigger:"every"};b(o,We);c.pollInterval=h(b(o,/[,\[\s]/));b(o,We);var i=rt(e,o,"event");if(i){c.eventFilter=i}r.push(c)}else{const a={trigger:u};var i=rt(e,o,"event");if(i){a.eventFilter=i}while(o.length>0&&o[0]!==","){b(o,We);const f=o.shift();if(f==="changed"){a.changed=true}else if(f==="once"){a.once=true}else if(f==="consume"){a.consume=true}else if(f==="delay"&&o[0]===":"){o.shift();a.delay=h(b(o,x))}else if(f==="from"&&o[0]===":"){o.shift();if(Qe.test(o[0])){var s=ot(o)}else{var s=b(o,x);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();const d=ot(o);if(d.length>0){s+=" "+d}}}a.from=s}else if(f==="target"&&o[0]===":"){o.shift();a.target=ot(o)}else if(f==="throttle"&&o[0]===":"){o.shift();a.throttle=h(b(o,x))}else if(f==="queue"&&o[0]===":"){o.shift();a.queue=b(o,x)}else if(f==="root"&&o[0]===":"){o.shift();a[f]=ot(o)}else if(f==="threshold"&&o[0]===":"){o.shift();a[f]=b(o,x)}else{fe(e,"htmx:syntax:error",{token:o.shift()})}}r.push(a)}}if(o.length===l){fe(e,"htmx:syntax:error",{token:o.shift()})}b(o,We)}while(o[0]===","&&o.shift());if(n){n[t]=r}return r}function lt(e){const t=te(e,"hx-trigger");let n=[];if(t){const r=Q.config.triggerSpecsCache;n=r&&r[t]||st(e,t,r)}if(n.length>0){return n}else if(f(e,"form")){return[{trigger:"submit"}]}else if(f(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(f(e,it)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function ut(e){ie(e).cancelled=true}function ct(e,t,n){const r=ie(e);r.timeout=E().setTimeout(function(){if(le(e)&&r.cancelled!==true){if(!pt(n,e,Xt("hx:poll:trigger",{triggerSpec:n,target:e}))){t(e)}ct(e,t,n)}},n.pollInterval)}function at(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function ft(e){return g(e,Q.config.disableSelector)}function dt(t,n,e){if(t instanceof HTMLAnchorElement&&at(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"&&String(ee(t,"method")).toLowerCase()!=="dialog"){n.boosted=true;let r,o;if(t.tagName==="A"){r="get";o=ee(t,"href")}else{const i=ee(t,"method");r=i?i.toLowerCase():"get";if(r==="get"){}o=ee(t,"action")}e.forEach(function(e){mt(t,function(e,t){const n=ce(e);if(ft(n)){a(n);return}he(r,o,n,t)},n,e,true)})}}function ht(e,t){const n=ce(t);if(!n){return false}if(e.type==="submit"||e.type==="click"){if(n.tagName==="FORM"){return true}if(f(n,'input[type="submit"], button')&&g(n,"form")!==null){return true}if(n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0)){return true}}return false}function gt(e,t){return ie(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function pt(e,t,n){const r=e.eventFilter;if(r){try{return r.call(t,n)!==true}catch(e){const o=r.source;fe(ne().body,"htmx:eventFilter:error",{error:e,source:o});return true}}return false}function mt(s,l,e,u,c){const a=ie(s);let t;if(u.from){t=m(s,u.from)}else{t=[s]}if(u.changed){t.forEach(function(e){const t=ie(e);t.lastValue=e.value})}se(t,function(o){const i=function(e){if(!le(s)){o.removeEventListener(u.trigger,i);return}if(gt(s,e)){return}if(c||ht(e,s)){e.preventDefault()}if(pt(u,s,e)){return}const t=ie(e);t.triggerSpec=u;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(s)<0){t.handledFor.push(s);if(u.consume){e.stopPropagation()}if(u.target&&e.target){if(!f(ce(e.target),u.target)){return}}if(u.once){if(a.triggeredOnce){return}else{a.triggeredOnce=true}}if(u.changed){const n=ie(o);const r=o.value;if(n.lastValue===r){return}n.lastValue=r}if(a.delayed){clearTimeout(a.delayed)}if(a.throttle){return}if(u.throttle>0){if(!a.throttle){de(s,"htmx:trigger");l(s,e);a.throttle=E().setTimeout(function(){a.throttle=null},u.throttle)}}else if(u.delay>0){a.delayed=E().setTimeout(function(){de(s,"htmx:trigger");l(s,e)},u.delay)}else{de(s,"htmx:trigger");l(s,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:u.trigger,listener:i,on:o});o.addEventListener(u.trigger,i)})}let yt=false;let xt=null;function bt(){if(!xt){xt=function(){yt=true};window.addEventListener("scroll",xt);setInterval(function(){if(yt){yt=false;se(ne().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){wt(e)})}},200)}}function wt(e){if(!s(e,"data-hx-revealed")&&B(e)){e.setAttribute("data-hx-revealed","true");const t=ie(e);if(t.initHash){de(e,"revealed")}else{e.addEventListener("htmx:afterProcessNode",function(){de(e,"revealed")},{once:true})}}}function vt(e,t,n,r){const o=function(){if(!n.loaded){n.loaded=true;t(e)}};if(r>0){E().setTimeout(o,r)}else{o()}}function St(t,n,e){let i=false;se(v,function(r){if(s(t,"hx-"+r)){const o=te(t,"hx-"+r);i=true;n.path=o;n.verb=r;e.forEach(function(e){Et(t,e,n,function(e,t){const n=ce(e);if(g(n,Q.config.disableSelector)){a(n);return}he(r,o,n,t)})})}});return i}function Et(r,e,t,n){if(e.trigger==="revealed"){bt();mt(r,n,t,e);wt(ce(r))}else if(e.trigger==="intersect"){const o={};if(e.root){o.root=ae(r,e.root)}if(e.threshold){o.threshold=parseFloat(e.threshold)}const i=new IntersectionObserver(function(t){for(let e=0;e0){t.polling=true;ct(ce(r),n,e)}else{mt(r,n,t,e)}}function Ct(e){const t=ce(e);if(!t){return false}const n=t.attributes;for(let e=0;e", "+e).join(""));return o}else{return[]}}function qt(e){const t=g(ce(e.target),"button, input[type='submit']");const n=Nt(e);if(n){n.lastButtonClicked=t}}function Lt(e){const t=Nt(e);if(t){t.lastButtonClicked=null}}function Nt(e){const t=g(ce(e.target),"button, input[type='submit']");if(!t){return}const n=y("#"+ee(t,"form"),t.getRootNode())||g(t,"form");if(!n){return}return ie(n)}function At(e){e.addEventListener("click",qt);e.addEventListener("focusin",qt);e.addEventListener("focusout",Lt)}function It(t,e,n){const r=ie(t);if(!Array.isArray(r.onHandlers)){r.onHandlers=[]}let o;const i=function(e){vn(t,function(){if(ft(t)){return}if(!o){o=new Function("event",n)}o.call(t,e)})};t.addEventListener(e,i);r.onHandlers.push({event:e,listener:i})}function Pt(t){ke(t);for(let e=0;eQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(ne().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function _t(t){if(!j()){return null}t=V(t);const n=S(localStorage.getItem("htmx-history-cache"))||[];for(let e=0;e=200&&this.status<400){de(ne().body,"htmx:historyCacheMissLoad",i);const e=D(this.response);const t=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;const n=jt();const r=xn(n);Dn(e.title);Ve(n,t,r);Gt(r.tasks);Ut=o;de(ne().body,"htmx:historyRestore",{path:o,cacheMiss:true,serverResponse:this.response})}else{fe(ne().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function Yt(e){zt();e=e||location.pathname+location.search;const t=_t(e);if(t){const n=D(t.content);const r=jt();const o=xn(r);Dn(n.title);Ve(r,n,o);Gt(o.tasks);E().setTimeout(function(){window.scrollTo(0,t.scroll)},0);Ut=e;de(ne().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{Zt(e)}}}function Wt(e){let t=Se(e,"hx-indicator");if(t==null){t=[e]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.classList.add.call(e.classList,Q.config.requestClass)});return t}function Qt(e){let t=Se(e,"hx-disabled-elt");if(t==null){t=[]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","");e.setAttribute("data-disabled-by-htmx","")});return t}function en(e,t){se(e,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList.remove.call(e.classList,Q.config.requestClass)}});se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled");e.removeAttribute("data-disabled-by-htmx")}})}function tn(t,n){for(let e=0;en.indexOf(e)<0)}else{e=e.filter(e=>e!==n)}r.delete(t);se(e,e=>r.append(t,e))}}function sn(t,n,r,o,i){if(o==null||tn(t,o)){return}else{t.push(o)}if(nn(o)){const s=ee(o,"name");let e=o.value;if(o instanceof HTMLSelectElement&&o.multiple){e=F(o.querySelectorAll("option:checked")).map(function(e){return e.value})}if(o instanceof HTMLInputElement&&o.files){e=F(o.files)}rn(s,e,n);if(i){ln(o,r)}}if(o instanceof HTMLFormElement){se(o.elements,function(e){if(t.indexOf(e)>=0){on(e.name,e.value,n)}else{t.push(e)}if(i){ln(e,r)}});new FormData(o).forEach(function(e,t){if(e instanceof File&&e.name===""){return}rn(t,e,n)})}}function ln(e,t){const n=e;if(n.willValidate){de(n,"htmx:validation:validate");if(!n.checkValidity()){t.push({elt:n,message:n.validationMessage,validity:n.validity});de(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})}}}function un(n,e){for(const t of e.keys()){n.delete(t)}e.forEach(function(e,t){n.append(t,e)});return n}function cn(e,t){const n=[];const r=new FormData;const o=new FormData;const i=[];const s=ie(e);if(s.lastButtonClicked&&!le(s.lastButtonClicked)){s.lastButtonClicked=null}let l=e instanceof HTMLFormElement&&e.noValidate!==true||te(e,"hx-validate")==="true";if(s.lastButtonClicked){l=l&&s.lastButtonClicked.formNoValidate!==true}if(t!=="get"){sn(n,o,i,g(e,"form"),l)}sn(n,r,i,e,l);if(s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&ee(e,"type")==="submit"){const c=s.lastButtonClicked||e;const a=ee(c,"name");rn(a,c.value,o)}const u=Se(e,"hx-include");se(u,function(e){sn(n,r,i,ce(e),l);if(!f(e,"form")){se(d(e).querySelectorAll(it),function(e){sn(n,r,i,e,l)})}});un(r,o);return{errors:i,formData:r,values:An(r)}}function an(e,t,n){if(e!==""){e+="&"}if(String(n)==="[object Object]"){n=JSON.stringify(n)}const r=encodeURIComponent(n);e+=encodeURIComponent(t)+"="+r;return e}function fn(e){e=Ln(e);let n="";e.forEach(function(e,t){n=an(n,t,e)});return n}function dn(e,t,n){const r={"HX-Request":"true","HX-Trigger":ee(e,"id"),"HX-Trigger-Name":ee(e,"name"),"HX-Target":te(t,"id"),"HX-Current-URL":ne().location.href};wn(e,"hx-headers",false,r);if(n!==undefined){r["HX-Prompt"]=n}if(ie(e).boosted){r["HX-Boosted"]="true"}return r}function hn(n,e){const t=re(e,"hx-params");if(t){if(t==="none"){return new FormData}else if(t==="*"){return n}else if(t.indexOf("not ")===0){se(t.substr(4).split(","),function(e){e=e.trim();n.delete(e)});return n}else{const r=new FormData;se(t.split(","),function(t){t=t.trim();if(n.has(t)){n.getAll(t).forEach(function(e){r.append(t,e)})}});return r}}else{return n}}function gn(e){return!!ee(e,"href")&&ee(e,"href").indexOf("#")>=0}function pn(e,t){const n=t||re(e,"hx-swap");const r={swapStyle:ie(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ie(e).boosted&&!gn(e)){r.show="top"}if(n){const s=U(n);if(s.length>0){for(let e=0;e0?o.join(":"):null;r.scroll=c;r.scrollTarget=i}else if(l.indexOf("show:")===0){const a=l.substr(5);var o=a.split(":");const f=o.pop();var i=o.length>0?o.join(":"):null;r.show=f;r.showTarget=i}else if(l.indexOf("focus-scroll:")===0){const d=l.substr("focus-scroll:".length);r.focusScroll=d=="true"}else if(e==0){r.swapStyle=l}else{w("Unknown modifier in hx-swap: "+l)}}}}return r}function mn(e){return re(e,"hx-encoding")==="multipart/form-data"||f(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function yn(t,n,r){let o=null;Bt(n,function(e){if(o==null){o=e.encodeParameters(t,r,n)}});if(o!=null){return o}else{if(mn(n)){return un(new FormData,Ln(r))}else{return fn(r)}}}function xn(e){return{tasks:[],elts:[e]}}function bn(e,t){const n=e[0];const r=e[e.length-1];if(t.scroll){var o=null;if(t.scrollTarget){o=ce(ae(n,t.scrollTarget))}if(t.scroll==="top"&&(n||o)){o=o||n;o.scrollTop=0}if(t.scroll==="bottom"&&(r||o)){o=o||r;o.scrollTop=o.scrollHeight}}if(t.show){var o=null;if(t.showTarget){let e=t.showTarget;if(t.showTarget==="window"){e="body"}o=ce(ae(n,e))}if(t.show==="top"&&(n||o)){o=o||n;o.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(r||o)){o=o||r;o.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function wn(r,e,o,i){if(i==null){i={}}if(r==null){return i}const s=te(r,e);if(s){let e=s.trim();let t=o;if(e==="unset"){return null}if(e.indexOf("javascript:")===0){e=e.substr(11);t=true}else if(e.indexOf("js:")===0){e=e.substr(3);t=true}if(e.indexOf("{")!==0){e="{"+e+"}"}let n;if(t){n=vn(r,function(){return Function("return ("+e+")")()},{})}else{n=S(e)}for(const l in n){if(n.hasOwnProperty(l)){if(i[l]==null){i[l]=n[l]}}}}return wn(ce(u(r)),e,o,i)}function vn(e,t,n){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return n}}function Sn(e,t){return wn(e,"hx-vars",true,t)}function En(e,t){return wn(e,"hx-vals",false,t)}function Cn(e){return ue(Sn(e),En(e))}function On(t,n,r){if(r!==null){try{t.setRequestHeader(n,r)}catch(e){t.setRequestHeader(n,encodeURIComponent(r));t.setRequestHeader(n+"-URI-AutoEncoded","true")}}}function Rn(t){if(t.responseURL&&typeof URL!=="undefined"){try{const e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(ne().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function C(e,t){return t.test(e.getAllResponseHeaders())}function Hn(e,t,n){e=e.toLowerCase();if(n){if(n instanceof Element||typeof n==="string"){return he(e,t,null,null,{targetOverride:y(n),returnPromise:true})}else{return he(e,t,y(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:y(n.target),swapOverride:n.swap,select:n.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Tn(e){const t=[];while(e){t.push(e);e=e.parentElement}return t}function qn(e,t,n){let r;let o;if(typeof URL==="function"){o=new URL(t,document.location.href);const i=document.location.origin;r=i===o.origin}else{o=t;r=l(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!r){return false}}return de(e,"htmx:validateUrl",ue({url:o,sameHost:r},n))}function Ln(e){if(e instanceof FormData)return e;const t=new FormData;for(const n in e){if(e.hasOwnProperty(n)){if(typeof e[n].forEach==="function"){e[n].forEach(function(e){t.append(n,e)})}else if(typeof e[n]==="object"&&!(e[n]instanceof Blob)){t.append(n,JSON.stringify(e[n]))}else{t.append(n,e[n])}}}return t}function Nn(r,o,e){return new Proxy(e,{get:function(t,e){if(typeof e==="number")return t[e];if(e==="length")return t.length;if(e==="push"){return function(e){t.push(e);r.append(o,e)}}if(typeof t[e]==="function"){return function(){t[e].apply(t,arguments);r.delete(o);t.forEach(function(e){r.append(o,e)})}}if(t[e]&&t[e].length===1){return t[e][0]}else{return t[e]}},set:function(e,t,n){e[t]=n;r.delete(o);e.forEach(function(e){r.append(o,e)});return true}})}function An(r){return new Proxy(r,{get:function(e,t){if(typeof t==="symbol"){return Reflect.get(e,t)}if(t==="toJSON"){return()=>Object.fromEntries(r)}if(t in e){if(typeof e[t]==="function"){return function(){return r[t].apply(r,arguments)}}else{return e[t]}}const n=r.getAll(t);if(n.length===0){return undefined}else if(n.length===1){return n[0]}else{return Nn(e,t,n)}},set:function(t,n,e){if(typeof n!=="string"){return false}t.delete(n);if(typeof e.forEach==="function"){e.forEach(function(e){t.append(n,e)})}else if(typeof e==="object"&&!(e instanceof Blob)){t.append(n,JSON.stringify(e))}else{t.append(n,e)}return true},deleteProperty:function(e,t){if(typeof t==="string"){e.delete(t)}return true},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function he(t,n,r,o,i,D){let s=null;let l=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var e=new Promise(function(e,t){s=e;l=t})}if(r==null){r=ne().body}const M=i.handler||Mn;const X=i.select||null;if(!le(r)){oe(s);return e}const u=i.targetOverride||ce(Ce(r));if(u==null||u==ve){fe(r,"htmx:targetError",{target:te(r,"hx-target")});oe(l);return e}let c=ie(r);const a=c.lastButtonClicked;if(a){const L=ee(a,"formaction");if(L!=null){n=L}const N=ee(a,"formmethod");if(N!=null){if(N.toLowerCase()!=="dialog"){t=N}}}const f=re(r,"hx-confirm");if(D===undefined){const K=function(e){return he(t,n,r,o,i,!!e)};const G={target:u,elt:r,path:n,verb:t,triggeringEvent:o,etc:i,issueRequest:K,question:f};if(de(r,"htmx:confirm",G)===false){oe(s);return e}}let d=r;let h=re(r,"hx-sync");let g=null;let F=false;if(h){const A=h.split(":");const I=A[0].trim();if(I==="this"){d=Ee(r,"hx-sync")}else{d=ce(ae(r,I))}h=(A[1]||"drop").trim();c=ie(d);if(h==="drop"&&c.xhr&&c.abortable!==true){oe(s);return e}else if(h==="abort"){if(c.xhr){oe(s);return e}else{F=true}}else if(h==="replace"){de(d,"htmx:abort")}else if(h.indexOf("queue")===0){const Z=h.split(" ");g=(Z[1]||"last").trim()}}if(c.xhr){if(c.abortable){de(d,"htmx:abort")}else{if(g==null){if(o){const P=ie(o);if(P&&P.triggerSpec&&P.triggerSpec.queue){g=P.triggerSpec.queue}}if(g==null){g="last"}}if(c.queuedRequests==null){c.queuedRequests=[]}if(g==="first"&&c.queuedRequests.length===0){c.queuedRequests.push(function(){he(t,n,r,o,i)})}else if(g==="all"){c.queuedRequests.push(function(){he(t,n,r,o,i)})}else if(g==="last"){c.queuedRequests=[];c.queuedRequests.push(function(){he(t,n,r,o,i)})}oe(s);return e}}const p=new XMLHttpRequest;c.xhr=p;c.abortable=F;const m=function(){c.xhr=null;c.abortable=false;if(c.queuedRequests!=null&&c.queuedRequests.length>0){const e=c.queuedRequests.shift();e()}};const B=re(r,"hx-prompt");if(B){var y=prompt(B);if(y===null||!de(r,"htmx:prompt",{prompt:y,target:u})){oe(s);m();return e}}if(f&&!D){if(!confirm(f)){oe(s);m();return e}}let x=dn(r,u,y);if(t!=="get"&&!mn(r)){x["Content-Type"]="application/x-www-form-urlencoded"}if(i.headers){x=ue(x,i.headers)}const U=cn(r,t);let b=U.errors;const j=U.formData;if(i.values){un(j,Ln(i.values))}const V=Ln(Cn(r));const w=un(j,V);let v=hn(w,r);if(Q.config.getCacheBusterParam&&t==="get"){v.set("org.htmx.cache-buster",ee(u,"id")||"true")}if(n==null||n===""){n=ne().location.href}const S=wn(r,"hx-request");const _=ie(r).boosted;let E=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;const C={boosted:_,useUrlParams:E,formData:v,parameters:An(v),unfilteredFormData:w,unfilteredParameters:An(w),headers:x,target:u,verb:t,errors:b,withCredentials:i.credentials||S.credentials||Q.config.withCredentials,timeout:i.timeout||S.timeout||Q.config.timeout,path:n,triggeringEvent:o};if(!de(r,"htmx:configRequest",C)){oe(s);m();return e}n=C.path;t=C.verb;x=C.headers;v=Ln(C.parameters);b=C.errors;E=C.useUrlParams;if(b&&b.length>0){de(r,"htmx:validation:halted",C);oe(s);m();return e}const $=n.split("#");const z=$[0];const O=$[1];let R=n;if(E){R=z;const Y=!v.keys().next().done;if(Y){if(R.indexOf("?")<0){R+="?"}else{R+="&"}R+=fn(v);if(O){R+="#"+O}}}if(!qn(r,R,C)){fe(r,"htmx:invalidPath",C);oe(l);return e}p.open(t.toUpperCase(),R,true);p.overrideMimeType("text/html");p.withCredentials=C.withCredentials;p.timeout=C.timeout;if(S.noHeaders){}else{for(const k in x){if(x.hasOwnProperty(k)){const W=x[k];On(p,k,W)}}}const H={xhr:p,target:u,requestConfig:C,etc:i,boosted:_,select:X,pathInfo:{requestPath:n,finalRequestPath:R,responsePath:null,anchor:O}};p.onload=function(){try{const t=Tn(r);H.pathInfo.responsePath=Rn(p);M(r,H);if(H.keepIndicators!==true){en(T,q)}de(r,"htmx:afterRequest",H);de(r,"htmx:afterOnLoad",H);if(!le(r)){let e=null;while(t.length>0&&e==null){const n=t.shift();if(le(n)){e=n}}if(e){de(e,"htmx:afterRequest",H);de(e,"htmx:afterOnLoad",H)}}oe(s);m()}catch(e){fe(r,"htmx:onLoadError",ue({error:e},H));throw e}};p.onerror=function(){en(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:sendError",H);oe(l);m()};p.onabort=function(){en(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:sendAbort",H);oe(l);m()};p.ontimeout=function(){en(T,q);fe(r,"htmx:afterRequest",H);fe(r,"htmx:timeout",H);oe(l);m()};if(!de(r,"htmx:beforeRequest",H)){oe(s);m();return e}var T=Wt(r);var q=Qt(r);se(["loadstart","loadend","progress","abort"],function(t){se([p,p.upload],function(e){e.addEventListener(t,function(e){de(r,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});de(r,"htmx:beforeSend",H);const J=E?null:yn(p,r,v);p.send(J);return e}function In(e,t){const n=t.xhr;let r=null;let o=null;if(C(n,/HX-Push:/i)){r=n.getResponseHeader("HX-Push");o="push"}else if(C(n,/HX-Push-Url:/i)){r=n.getResponseHeader("HX-Push-Url");o="push"}else if(C(n,/HX-Replace-Url:/i)){r=n.getResponseHeader("HX-Replace-Url");o="replace"}if(r){if(r==="false"){return{}}else{return{type:o,path:r}}}const i=t.pathInfo.finalRequestPath;const s=t.pathInfo.responsePath;const l=re(e,"hx-push-url");const u=re(e,"hx-replace-url");const c=ie(e).boosted;let a=null;let f=null;if(l){a="push";f=l}else if(u){a="replace";f=u}else if(c){a="push";f=s||i}if(f){if(f==="false"){return{}}if(f==="true"){f=s||i}if(t.pathInfo.anchor&&f.indexOf("#")===-1){f=f+"#"+t.pathInfo.anchor}return{type:a,path:f}}else{return{}}}function Pn(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function kn(e){for(var t=0;t0){E().setTimeout(e,y.swapDelay)}else{e()}}if(f){fe(o,"htmx:responseError",ue({error:"Response Status Error Code "+s.status+" from "+i.pathInfo.requestPath},i))}}const Xn={};function Fn(){return{init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,n,r){return false},encodeParameters:function(e,t,n){return null}}}function Bn(e,t){if(t.init){t.init(n)}Xn[e]=ue(Fn(),t)}function Un(e){delete Xn[e]}function jn(e,n,r){if(n==undefined){n=[]}if(e==undefined){return n}if(r==undefined){r=[]}const t=te(e,"hx-ext");if(t){se(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){r.push(e.slice(7));return}if(r.indexOf(e)<0){const t=Xn[e];if(t&&n.indexOf(t)<0){n.push(t)}}})}return jn(ce(u(e)),n,r)}var Vn=false;ne().addEventListener("DOMContentLoaded",function(){Vn=true});function _n(e){if(Vn||ne().readyState==="complete"){e()}else{ne().addEventListener("DOMContentLoaded",e)}}function $n(){if(Q.config.includeIndicatorStyles!==false){const e=Q.config.inlineStyleNonce?` nonce="${Q.config.inlineStyleNonce}"`:"";ne().head.insertAdjacentHTML("beforeend"," ."+Q.config.indicatorClass+"{opacity:0} ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ")}}function zn(){const e=ne().querySelector('meta[name="htmx-config"]');if(e){return S(e.content)}else{return null}}function Jn(){const e=zn();if(e){Q.config=ue(Q.config,e)}}_n(function(){Jn();$n();let e=ne().body;Dt(e);const t=ne().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){const t=e.target;const n=ie(t);if(n&&n.xhr){n.xhr.abort()}});const n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){Yt();se(t,function(e){de(e,"htmx:restored",{document:ne(),triggerEvent:de})})}else{if(n){n(e)}}};E().setTimeout(function(){de(e,"htmx:load",{});e=null},0)});return Q}(); \ No newline at end of file diff --git a/public/img/oval.svg b/public/img/oval.svg new file mode 100644 index 0000000..004a356 --- /dev/null +++ b/public/img/oval.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/spinner.gif b/public/img/spinner.gif new file mode 100644 index 0000000..99c5cd1 Binary files /dev/null and b/public/img/spinner.gif differ diff --git a/public/img/tail-spin.svg b/public/img/tail-spin.svg new file mode 100644 index 0000000..075a399 --- /dev/null +++ b/public/img/tail-spin.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/lib/jquery.min.js b/public/lib/jquery.min.js new file mode 100644 index 0000000..0de648e --- /dev/null +++ b/public/lib/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.4",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssHas=ce(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssHas||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 this.svg.el("filter").add(this.svg.el("feMorphology").attrs({ in: "SourceAlpha", operator: "dilate", radius: "4" }), this.svg.el("feGaussianBlur").attrs({ edgeMode: "none", stdDeviation: "3, 1.5" }), this.svg.el("feComponentTransfer").add(this.svg.el("feFuncA").attrs({ intercept: -70, slope: 100, type: "linear" })), this.svg.el("feComponentTransfer").add(this.svg.el("feFuncR").attrs({ intercept: 1, slope: 0, type: "linear" }), this.svg.el("feFuncG").attrs({ intercept: .875, slope: 0, type: "linear" }), this.svg.el("feFuncB").attrs({ intercept: 0, slope: 0, type: "linear" }), this.svg.el("feFuncA").attrs({ slope: .8, type: "linear" })), this.svg.el("feMerge").add(this.svg.el("feMergeNode"), this.svg.el("feMergeNode").attr("in", "SourceGraphic"))))) } getTitleAttrs() { return Object.assign({}, this.baseFontAttrs, { "font-size": 2.5 * this.fontSize, "text-anchor": "middle" }) } getConnectLine(t) { const e = this.connectLines; return e.get(t) || e.get("solid") } getBlock(t) { return this.blocks[t] || this.blocks[""] } getNote(t) { return this.notes[t] || this.notes[""] } getDivider(t) { return this.dividers[t] || this.dividers[""] } optionsAttributes(t, e) { return function (t, e) { const n = Object.assign({}, t[""]); return e.forEach((e => { Object.assign(n, t[e] || {}) })), n }(t, e) } renderAgentLine({ className: t, options: e, width: n, x: s, y0: r, y1: i }) { const a = this.optionsAttributes(this.agentLineAttrs, e); return n > 0 ? this.svg.box(a, { height: i - r, width: n, x: s - n / 2, y: r }).addClass(t) : this.svg.line(a, { x1: s, x2: s, y1: r, y2: i }).addClass(t) } renderArrowHead(t, { dir: e, height: n, width: s, x: r, y: i }) { const a = s * e.dx, o = s * e.dy, l = .5 * n * e.dx, h = .5 * -n * e.dy; return this.svg.el("none" === t.fill ? "polyline" : "polygon").attr("points", r + a - h + " " + (i + o - l) + " " + r + " " + i + " " + (r + a + h) + " " + (i + o + l)).attrs(t) } renderTag(t, { height: e, width: n, x: s, y: r }) { const { rx: i, ry: a } = t, o = s + n, l = r + e, h = "M" + o + " " + r + "L" + o + " " + (l - a) + "L" + (o - i) + " " + l + "L" + s + " " + l, d = this.svg.el("g"); return "none" !== t.fill && d.add(this.svg.el("path").attr("d", h + "L" + s + " " + r).attrs(t).attr("stroke", "none")), "none" !== t.stroke && d.add(this.svg.el("path").attr("d", h).attrs(t).attr("fill", "none")), d } renderPerson({ iconHeight: t, iconWidth: e }, n, s, r) { const i = r.x + r.width / 2, a = e / 2, o = t; return this.svg.el("g").add(this.svg.el("path").attr("d", "M" + (i - a) + " " + (r.y + t) + "a" + a + " " + .3 * o + " 0 0 1 " + 2 * a + " 0").attrs(n), this.svg.el("path").attr("d", "M" + i + " " + r.y + "c" + .224 * a + " 0 " + .4 * a + " " + .1 * o + " " + .4 * a + " " + .275 * o + "s" + .176 * -a + " " + .35 * o + " " + .4 * -a + " " + .35 * o + "s" + .4 * -a + " " + .175 * -o + " " + .4 * -a + " " + .35 * -o + "s" + .176 * a + " " + .275 * -o + " " + .4 * a + " " + .275 * -o).attrs(n), this.svg.box(s, { height: r.height - t, width: r.width, x: r.x, y: r.y + t })) } renderDB({ tilt: t }, e, n) { return this.svg.el("g").add(this.svg.box({ rx: n.width / 2, ry: t }, n).attrs(e), this.svg.el("path").attr("d", "M" + n.x + " " + (n.y + t) + "a" + n.width / 2 + " " + t + " 0 0 0 " + n.width + " 0").attrs(e).attr("fill", "none")) } renderRef(t, e) { return { fill: this.svg.box(t, e).attrs({ stroke: "none" }), mask: this.svg.box(t, e).attrs({ fill: "#000000", stroke: "none" }), shape: this.svg.box(t, e).attrs({ fill: "none" }) } } renderFlatConnect(t, e, { x1: n, y1: s, x2: r, y2: i }) { return { p1: { x: n, y: s }, p2: { x: r, y: i }, shape: this.svg.el("path").attr("d", this.svg.patternedLine(t).move(n, s).line(r, i).cap().asPath()).attrs(e) } } renderRevConnect(t, e, { rad: n, x1: s, x2: r, xR: i, y1: a, y2: o }) { const l = (o - a) / 2, h = this.svg.patternedLine(t).move(s, a).line(i, a); return n < l ? h.arc(i, a + n, Math.PI / 2).line(i + n, o - n).arc(i, o - n, Math.PI / 2) : h.arc(i, (a + o) / 2, Math.PI), { p1: { x: s, y: a }, p2: { x: r, y: o }, shape: this.svg.el("path").attr("d", h.line(r, o).cap().asPath()).attrs(e) } } renderLineDivider({ lineAttrs: t }, { height: e, labelWidth: n, width: s, x: r, y: i }) { let a = null; const o = i + e / 2; return a = n > 0 ? this.svg.el("g").add(this.svg.line({ fill: "none" }, { x1: r, x2: r + (s - n) / 2, y1: o, y2: o }).attrs(t), this.svg.line({ fill: "none" }, { x1: r + (s + n) / 2, x2: r + s, y1: o, y2: o }).attrs(t)) : this.svg.line({ fill: "none" }, { x1: r, x2: r + s, y1: o, y2: o }).attrs(t), { shape: a } } renderDelayDivider({ dotSize: t, gapSize: e }, { height: n, width: s, x: r, y: i }) { const a = this.svg.el("g"); for (let o = 0; o + e <= n; o += t + e)a.add(this.svg.box({ fill: "#000000" }, { height: e, width: s, x: r, y: i + o })); return { mask: a } } renderTearDivider({ fadeBegin: e, fadeSize: n, lineAttrs: s, pattern: r, zigHeight: i, zigWidth: a }, { env: o, height: l, labelHeight: h, labelWidth: d, width: g, x: c, y: u }) { const p = o.addDef("tear-grad", (() => { const t = 100 / g; return this.svg.linearGradient({}, [{ offset: e * t + "%", "stop-color": "#000000" }, { offset: (e + n) * t + "%", "stop-color": "#FFFFFF" }, { offset: 100 - (e + n) * t + "%", "stop-color": "#FFFFFF" }, { offset: 100 - e * t + "%", "stop-color": "#000000" }]) })), f = this.svg.el("mask").attr("maskUnits", "userSpaceOnUse").add(this.svg.box({ fill: "url(#" + p + ")" }, { height: l + 10, width: g, x: c, y: u - 5 })), m = o.addDef(f); d > 0 && f.add(this.svg.box({ fill: "#000000", rx: 2, ry: 2 }, { height: h + 2, width: d, x: c + (g - d) / 2, y: u + (l - h) / 2 - 1 })); const b = r || new t(a, [i, -i]); let y = null; const x = this.svg.patternedLine(b).move(c, u).line(c + g, u), k = this.svg.el("g").attr("mask", "url(#" + m + ")").add(this.svg.el("path").attrs({ d: x.asPath(), fill: "none" }).attrs(s)); if (l > 0) { const t = this.svg.patternedLine(b).move(c, u + l).line(c + g, u + l); k.add(this.svg.el("path").attrs({ d: t.asPath(), fill: "none" }).attrs(s)), x.line(t.x, t.y, { patterned: !1 }).cap(), x.points.push(...t.points.reverse()), y = this.svg.el("path").attrs({ d: x.asPath(), fill: "#000000" }) } return { mask: y, shape: k } } } const n = "Helvetica,Arial,Liberation Sans,sans-serif", s = 1.3, r = { "font-family": n, "font-size": 8, "line-height": s }, i = { "font-family": n, "font-size": 8, "line-height": s, "text-anchor": "middle" }; class a extends e { constructor(e) { super(e, { "font-family": n, "font-size": 8, "line-height": s }); const a = { padding: { top: 3, bottom: 2 }, tag: { padding: { top: 1, left: 3, right: 3, bottom: 0 }, boxRenderer: this.renderTag.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1, rx: 2, ry: 2 }), labelAttrs: { "font-family": n, "font-weight": "bold", "font-size": 9, "line-height": s, "text-anchor": "left" } }, label: { minHeight: 4, padding: { top: 1, left: 5, right: 3, bottom: 1 }, labelAttrs: { "font-family": n, "font-size": 8, "line-height": s, "text-anchor": "left" } } }; Object.assign(this, { titleMargin: 10, outerMargin: 5, agentMargin: 10, actionMargin: 10, minActionMargin: 3, agentLineActivationRadius: 4, agentCap: { box: { padding: { top: 5, left: 10, right: 10, bottom: 5 }, arrowBottom: 12.8, boxAttrs: { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }, labelAttrs: { "font-family": n, "font-size": 12, "line-height": s, "text-anchor": "middle" } }, person: { padding: { top: 20, left: 10, right: 10, bottom: 5 }, arrowBottom: 12.8, boxRenderer: this.renderPerson.bind(this, { iconHeight: 15, iconWidth: 18 }, { fill: "#000000" }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }), labelAttrs: { "font-family": n, "font-size": 12, "line-height": s, "text-anchor": "middle" } }, database: { padding: { top: 12, left: 10, right: 10, bottom: 3 }, arrowBottom: 12.8, boxRenderer: this.renderDB.bind(this, { tilt: 5 }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }), labelAttrs: { "font-family": n, "font-size": 12, "line-height": s, "text-anchor": "middle" } }, cross: { size: 20, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 1 }) }, bar: { height: 4, render: e.boxFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 1 }) }, fade: { width: 5, height: 6, extend: 1 }, none: { height: 10 } }, connect: { loopbackRadius: 6, arrow: { single: { width: 5, height: 10, render: this.renderArrowHead.bind(this), attrs: { fill: "#000000", "stroke-width": 0, "stroke-linejoin": "miter" } }, double: { width: 4, height: 6, render: this.renderArrowHead.bind(this), attrs: { fill: "none", stroke: "#000000", "stroke-width": 1, "stroke-linejoin": "miter" } }, fade: { short: 2, size: 16 }, cross: { short: 7, radius: 3, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 1 }) } }, label: { padding: 6, margin: { top: 2, bottom: 1 }, attrs: { "font-family": n, "font-size": 8, "line-height": s, "text-anchor": "middle" }, loopbackAttrs: { "font-family": n, "font-size": 8, "line-height": s } }, source: { radius: 2, render: e.circleFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 1 }) }, mask: { padding: { top: 0, left: 3, right: 3, bottom: 1 } } }, agentLineAttrs: { "": { fill: "none", stroke: "#000000", "stroke-width": 1 }, red: { stroke: "#CC0000" } }, blocks: { ref: { margin: { top: 0, bottom: 0 }, boxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1.5, rx: 2, ry: 2 }), section: a }, "": { margin: { top: 0, bottom: 0 }, boxRenderer: e.boxFactory({ fill: "none", stroke: "#000000", "stroke-width": 1.5, rx: 2, ry: 2 }), collapsedBoxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1.5, rx: 2, ry: 2 }), section: a, sepRenderer: e.lineFactory({ stroke: "#000000", "stroke-width": 1.5, "stroke-dasharray": "4, 2" }) } }, notes: { text: { margin: { top: 0, left: 2, right: 2, bottom: 0 }, padding: { top: 2, left: 2, right: 2, bottom: 2 }, overlap: { left: 10, right: 10 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF" }), labelAttrs: r }, note: { margin: { top: 0, left: 5, right: 5, bottom: 0 }, padding: { top: 5, left: 5, right: 10, bottom: 5 }, overlap: { left: 10, right: 10 }, boxRenderer: e.noteFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }, { fill: "none", stroke: "#000000", "stroke-width": 1 }), labelAttrs: r }, state: { margin: { top: 0, left: 5, right: 5, bottom: 0 }, padding: { top: 7, left: 7, right: 7, bottom: 7 }, overlap: { left: 10, right: 10 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1, rx: 10, ry: 10 }), labelAttrs: r } }, dividers: { "": { labelAttrs: i, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: () => ({}) }, line: { labelAttrs: i, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 10, margin: 0, render: this.renderLineDivider.bind(this, { lineAttrs: { stroke: "#000000" } }) }, delay: { labelAttrs: i, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: this.renderDelayDivider.bind(this, { dotSize: 1, gapSize: 2 }) }, tear: { labelAttrs: i, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 10, margin: 10, render: this.renderTearDivider.bind(this, { fadeBegin: 5, fadeSize: 10, zigWidth: 6, zigHeight: 1, lineAttrs: { stroke: "#000000" } }) } } }), this.addConnectLine("solid", { attrs: { stroke: "#000000", "stroke-width": 1 } }), this.addConnectLine("dash", { attrs: { "stroke-dasharray": "4, 2" } }), this.addConnectLine("wave", { attrs: { "stroke-linejoin": "round", "stroke-linecap": "round" }, pattern: new t(6, .5) }) } } const o = "Helvetica,Arial,Liberation Sans,sans-serif", l = 1.3, h = { "font-family": o, "font-size": 8, "line-height": l }, d = { "font-family": o, "font-size": 8, "line-height": l, "text-anchor": "middle" }; class g extends e { constructor(e) { super(e, { "font-family": o, "font-size": 8, "line-height": l }); const n = { padding: { top: 3, bottom: 4 }, tag: { padding: { top: 2, left: 5, right: 5, bottom: 1 }, boxRenderer: this.renderTag.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 2, rx: 3, ry: 3 }), labelAttrs: { "font-family": o, "font-weight": "bold", "font-size": 9, "line-height": l, "text-anchor": "left" } }, label: { minHeight: 5, padding: { top: 2, left: 5, right: 3, bottom: 1 }, labelAttrs: { "font-family": o, "font-size": 8, "line-height": l, "text-anchor": "left" } } }; Object.assign(this, { titleMargin: 12, outerMargin: 5, agentMargin: 8, actionMargin: 5, minActionMargin: 5, agentLineActivationRadius: 4, agentCap: { box: { padding: { top: 1, left: 3, right: 3, bottom: 1 }, arrowBottom: 11.1, boxAttrs: { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 3, rx: 4, ry: 4 }, labelAttrs: { "font-family": o, "font-weight": "bold", "font-size": 14, "line-height": l, "text-anchor": "middle" } }, person: { padding: { top: 16, left: 3, right: 3, bottom: 1 }, arrowBottom: 11.1, boxRenderer: this.renderPerson.bind(this, { iconHeight: 15, iconWidth: 18 }, { fill: "#000000" }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 3, rx: 4, ry: 4 }), labelAttrs: { "font-family": o, "font-weight": "bold", "font-size": 14, "line-height": l, "text-anchor": "middle" } }, database: { padding: { top: 4, left: 3, right: 3, bottom: 0 }, arrowBottom: 11.1, boxRenderer: this.renderDB.bind(this, { tilt: 2 }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 3 }), labelAttrs: { "font-family": o, "font-weight": "bold", "font-size": 14, "line-height": l, "text-anchor": "middle" } }, cross: { size: 20, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 3, "stroke-linecap": "round" }) }, bar: { height: 4, render: e.boxFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 3, rx: 2, ry: 2 }) }, fade: { width: 5, height: 10, extend: 1 }, none: { height: 10 } }, connect: { loopbackRadius: 8, arrow: { single: { width: 10, height: 12, render: this.renderArrowHead.bind(this), attrs: { fill: "#000000", stroke: "#000000", "stroke-width": 3, "stroke-linejoin": "round" } }, double: { width: 10, height: 12, render: this.renderArrowHead.bind(this), attrs: { fill: "none", stroke: "#000000", "stroke-width": 3, "stroke-linejoin": "round", "stroke-linecap": "round" } }, fade: { short: 3, size: 12 }, cross: { short: 10, radius: 5, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 3, "stroke-linejoin": "round", "stroke-linecap": "round" }) } }, label: { padding: 7, margin: { top: 2, bottom: 3 }, attrs: { "font-family": o, "font-size": 8, "line-height": l, "text-anchor": "middle" }, loopbackAttrs: { "font-family": o, "font-size": 8, "line-height": l } }, source: { radius: 5, render: e.circleFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 3 }) }, mask: { padding: { top: 1, left: 5, right: 5, bottom: 3 } } }, agentLineAttrs: { "": { fill: "none", stroke: "#000000", "stroke-width": 3 }, red: { stroke: "#DD0000" } }, blocks: { ref: { margin: { top: 0, bottom: 0 }, boxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 4, rx: 5, ry: 5 }), section: n }, "": { margin: { top: 0, bottom: 0 }, boxRenderer: e.boxFactory({ fill: "none", stroke: "#000000", "stroke-width": 4, rx: 5, ry: 5 }), collapsedBoxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 4, rx: 5, ry: 5 }), section: n, sepRenderer: e.lineFactory({ stroke: "#000000", "stroke-width": 2, "stroke-dasharray": "5, 3" }) } }, notes: { text: { margin: { top: 0, left: 2, right: 2, bottom: 0 }, padding: { top: 2, left: 2, right: 2, bottom: 2 }, overlap: { left: 10, right: 10 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF" }), labelAttrs: h }, note: { margin: { top: 0, left: 5, right: 5, bottom: 0 }, padding: { top: 3, left: 3, right: 10, bottom: 3 }, overlap: { left: 10, right: 10 }, boxRenderer: e.noteFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 2, "stroke-linejoin": "round" }, { fill: "none", stroke: "#000000", "stroke-width": 1 }), labelAttrs: h }, state: { margin: { top: 0, left: 5, right: 5, bottom: 0 }, padding: { top: 5, left: 7, right: 7, bottom: 5 }, overlap: { left: 10, right: 10 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 3, rx: 10, ry: 10 }), labelAttrs: h } }, dividers: { "": { labelAttrs: d, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: () => ({}) }, line: { labelAttrs: d, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 10, margin: 0, render: this.renderLineDivider.bind(this, { lineAttrs: { stroke: "#000000", "stroke-width": 2, "stroke-linecap": "round" } }) }, delay: { labelAttrs: d, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: this.renderDelayDivider.bind(this, { dotSize: 3, gapSize: 3 }) }, tear: { labelAttrs: d, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 10, margin: 10, render: this.renderTearDivider.bind(this, { fadeBegin: 5, fadeSize: 10, zigWidth: 6, zigHeight: 1, lineAttrs: { stroke: "#000000", "stroke-width": 2, "stroke-linejoin": "round" } }) } } }), this.addConnectLine("solid", { attrs: { stroke: "#000000", "stroke-width": 3 } }), this.addConnectLine("dash", { attrs: { "stroke-dasharray": "10, 4" } }), this.addConnectLine("wave", { attrs: { "stroke-linejoin": "round", "stroke-linecap": "round" }, pattern: new t(10, 1) }) } getTitleAttrs() { return Object.assign(super.getTitleAttrs(), { "font-weight": "bolder" }) } } class c { constructor() { this.listeners = new Map, this.forwards = new Set } addEventListener(t, e) { const n = this.listeners.get(t); n ? n.push(e) : this.listeners.set(t, [e]) } removeEventListener(t, e) { const n = this.listeners.get(t); if (!n) return; const s = n.indexOf(e); -1 !== s && n.splice(s, 1) } on(t, e) { return this.addEventListener(t, e), this } off(t, e) { return this.removeEventListener(t, e), this } countEventListeners(t) { return (this.listeners.get(t) || []).length } removeAllEventListeners(t) { t ? this.listeners.delete(t) : this.listeners.clear() } addEventForwarding(t) { this.forwards.add(t) } removeEventForwarding(t) { this.forwards.delete(t) } removeAllEventForwardings() { this.forwards.clear() } trigger(t, e = []) { (this.listeners.get(t) || []).forEach((t => t(...e))), this.forwards.forEach((n => n.trigger(t, e))) } } const u = "undefined" == typeof window, p = !u && /^((?!chrome|android).)*safari/i.test(window.navigator.userAgent), f = !u && void 0 !== window.InstallTrigger, m = /' + e } getSVGBlob(t) { return new Blob([this.getSVGContent(t)], { type: "image/svg+xml" }) } getSVGURL(t) { const e = this.getSVGBlob(t); return this.latestSVG && URL.revokeObjectURL(this.latestSVG), this.latestSVG = URL.createObjectURL(e), this.latestSVG } getCanvas(t, e, n) { this.canvas || (window.devicePixelRatio = 1, this.canvas = document.createElement("canvas"), this.context = this.canvas.getContext("2d")); const s = (t.width || 1) * e, r = (t.height || 1) * e, i = new Image(s, r); let a = null; p && (a = document.createElement("div"), a.style.position = "absolute", a.style.visibility = "hidden", a.appendChild(i), document.body.appendChild(a)); const o = () => { this.canvas.width = s, this.canvas.height = r, this.context.drawImage(i, 0, 0, s, r), a && document.body.removeChild(a), n(this.canvas) }; i.addEventListener("load", (() => { a ? setTimeout(o, 50) : o() }), { once: !0 }), i.src = this.getSVGURL(t) } getPNGBlob(t, e, n) { this.getCanvas(t, e, (t => { t.toBlob(n, "image/png") })) } getPNGURL(t, e, n) { ++this.indexPNG; const s = this.indexPNG; this.getPNGBlob(t, e, (t => { const e = URL.createObjectURL(t); s >= this.latestPNGIndex ? (this.latestPNG && URL.revokeObjectURL(this.latestPNG), this.latestPNG = e, this.latestPNGIndex = s, n(e, !0)) : (n(e, !1), URL.revokeObjectURL(e)) })) } } function y(t, e, n = null) { if (null === n) return t.indexOf(e); for (let s = 0; s < t.length; ++s)if (n(t[s], e)) return s; return -1 } function x(t, e = null, n = null) { if (e) for (let s = 0; s < e.length; ++s)-1 === y(t, e[s], n) && t.push(e[s]) } function k(t, e, n = null) { for (let s = 0; s < e.length; ++s)if (-1 !== y(t, e[s], n)) return !0; return !1 } function w(t, e = null, n = null) { if (e) for (let s = 0; s < e.length; ++s) { const r = y(t, e[s], n); -1 !== r && t.splice(r, 1) } } function v(t, e, n = null) { const s = y(t, e, n); -1 !== s && t.splice(s, 1) } function A(t) { return t[t.length - 1] } function F(t, e, n, s) { if (e >= t.length) return void s.push(n.slice()); const r = t[e]; if (!Array.isArray(r)) return n.push(r), F(t, e + 1, n, s), void n.pop(); for (let i = 0; i < r.length; ++i)n.push(r[i]), F(t, e + 1, n, s), n.pop() } function M(t) { const e = []; return F(t, 0, [], e), e } function S(t, e) { const n = []; return t.forEach((t => { n.push(...e(t)) })), n } class R { constructor({ blocked: t = !1, covered: e = !1, group: n = null, activation: s = 0, locked: r = !1, visible: i = !1 } = {}) { this.blocked = t, this.covered = e, this.group = n, this.activation = s, this.locked = r, this.visible = i } } R.LOCKED = new R({ locked: !0 }), R.DEFAULT = new R; const C = (t, e = !0) => n => n.flags.includes(t) === e, I = { addNearby: (t, e, n, s) => { const r = y(t, e, I.equals); -1 === r ? t.push(n) : t.splice(r + s, 0, n) }, equals: (t, e) => t.id === e.id, hasIntersection: (t, e) => k(t, e, I.equals), indexOf: (t, e) => y(t, e, I.equals), make: (t, { anchorRight: e = !1, isVirtualSource: n = !1 } = {}) => ({ anchorRight: e, id: t, isVirtualSource: n, options: [] }) }; const E = { "note left": [I.make("[")], "note over": [I.make("["), I.make("]")], "note right": [I.make("]")] }, G = ["[", "]"], D = { "agent activation": { check: ["delta"], checkDistinct: ["agentIDs"], merge: ["agentIDs"], siblings: new Set(["agent begin", "agent end"]) }, "agent begin": { check: ["mode"], checkDistinct: [], merge: ["agentIDs"], siblings: new Set(["agent activation"]) }, "agent end": { check: ["mode"], checkDistinct: [], merge: ["agentIDs"], siblings: new Set(["agent activation"]) } }; function L(t, e) { const n = D[t.type]; return !(!n || t.type !== e.type) && (!n.check.some((n => t[n] !== e[n])) && !n.checkDistinct.some((n => k(t[n], e[n])))) } function N(t, e) { D[t.type].merge.forEach((n => { x(t[n], e[n]) })) } function z(t, e) { for (let n = 0; n < t.length;) { e(t[n], n) ? t.splice(n, 1) : ++n } } function O(t) { z(t, ((e, n) => { for (let s = 0; s < n; ++s)if (L(t[s], e)) return N(t[s], e), !0; return !1 })) } function T(t) { const e = new Set, n = t.map((({ type: t }) => t)); return n.forEach((t => { const s = D[t]; s && n.every((e => t === e || s.siblings.has(e))) && e.add(t) })), e } function B(t, e, n, s) { z(s, (s => { if (!t.has(s.type) || !e.has(s.type)) return !1; for (let t = 0; t < n.length; ++t)if (L(n[t], s)) return N(n[t], s), !0; return !1 })) } function V(t, e) { for (const n of e) n && ("parallel" === n.type ? V(t, n.stages) : t.push(n)) } const P = ["agent begin", "agent end", "agent activation", "block begin", "block end", "connect", "connect-delay-begin", "connect-delay-end", "note over", "note right", "note left", "note between"]; function j(t, e) { if (!t) return "Nothing to run statement in parallel with"; const n = []; return V(n, [t]), V(n, [e]), n.some((t => !P.includes(t.type))) ? "Cannot use parallel here" : function (t) { const e = S(t.filter((t => "agent begin" === t.type)), (t => t.agentIDs)); for (const n of t) if ("agent end" === n.type) for (const t of n.agentIDs) if (-1 !== e.indexOf(t)) return "Cannot create and destroy " + t + " simultaneously"; return null }(n) || function (t) { const e = t.filter((t => "block begin" === t.type || "block end" === t.type)).length; if (!e) return null; if (e !== t.length) return "Cannot use parallel here"; const n = t.filter((t => "block begin" === t.type)).map((t => t.left)); for (const e of t) if ("block end" === e.type && -1 !== n.indexOf(e.left)) return "Cannot create and destroy reference simultaneously"; return null }(n) || function (t) { const e = t.filter((t => "connect-delay-begin" === t.type)).map((t => t.tag)); for (const n of t) if ("connect-delay-end" === n.type && -1 !== e.indexOf(n.tag)) return "Cannot start and finish delayed connection simultaneously"; return null }(n) || function (t) { const e = new Set; for (const n of t) if ("agent activation" === n.type) for (const t of n.agentIDs) { if (e.has(t)) return "Conflicting agent activation"; e.add(t) } return null }(n) } function H(t, e) { if ("agent begin" === t.type) return t.mode = e, !0; if ("parallel" === t.type) { let n = !1; return t.stages.forEach((t => { "agent begin" === t.type && (t.mode = e, n = !0) })), n } return !1 } function q(t, e, n, s = null) { v(t, e, I.equals), v(t, n, I.equals); let r = 0, i = t.length; if (s) { const e = s.map((e => I.indexOf(t, e))).filter((t => -1 !== t)); r = e.reduce(((t, e) => Math.min(t, e)), t.length), i = e.reduce(((t, e) => Math.max(t, e)), r) + 1 } return t.splice(r, 0, e), t.splice(i + 1, 0, n), { indexL: r, indexR: i + 1 } } class Y { constructor() { this.agentStates = new Map, this.agentAliases = new Map, this.activeGroups = new Map, this.gAgents = [], this.labelPattern = null, this.nextID = 0, this.nesting = [], this.markers = new Set, this.currentSection = null, this.currentNest = null, this.stageHandlers = { "agent activation": this.handleAgentActivation.bind(this), "agent begin": this.handleAgentBegin.bind(this), "agent define": this.handleAgentDefine.bind(this), "agent end": this.handleAgentEnd.bind(this), "agent options": this.handleAgentOptions.bind(this), "agent relabel": this.handleAgentRelabel.bind(this), async: this.handleAsync.bind(this), "block begin": this.handleBlockBegin.bind(this), "block end": this.handleBlockEnd.bind(this), "block split": this.handleBlockSplit.bind(this), connect: this.handleConnect.bind(this), "connect-delay-begin": this.handleConnectDelayBegin.bind(this), "connect-delay-end": this.handleConnectDelayEnd.bind(this), divider: this.handleDivider.bind(this), "group begin": this.handleGroupBegin.bind(this), "label pattern": this.handleLabelPattern.bind(this), mark: this.handleMark.bind(this), "note between": this.handleNote.bind(this), "note left": this.handleNote.bind(this), "note over": this.handleNote.bind(this), "note right": this.handleNote.bind(this) }, this.expandGroupedGAgent = this.expandGroupedGAgent.bind(this), this.handleStage = this.handleStage.bind(this), this.toGAgent = this.toGAgent.bind(this), this.endGroup = this.endGroup.bind(this) } _aliasInUse(t) { const e = this.agentAliases.get(t); return !(!e || e === t) || this.gAgents.some((e => e.id === t)) } toGAgent({ name: t, alias: e, flags: n }) { if (e) { if (this.agentAliases.has(t)) throw new Error("Cannot alias " + t + "; it is already an alias"); if (this._aliasInUse(e)) throw new Error("Cannot use " + e + " as an alias; it is already in use"); this.agentAliases.set(e, t) } return I.make(this.agentAliases.get(t) || t, { isVirtualSource: n.includes("source") }) } addStage(t, { isVisible: e = !0, parallel: n = !1 } = {}) { if (!t) return; e && (this.currentNest.hasContent = !0), void 0 === t.ln && (t.ln = this.latestLine); const { stages: s } = this.currentSection; if (n) { const e = A(s), n = j(e, t); if (n) throw new Error(n); const r = this.makeParallel([e, t]); r.ln = t.ln, --s.length, s.push(r) } else s.push(t) } addImpStage(t, { parallel: e = !1 } = {}) { if (!t) return; void 0 === t.ln && (t.ln = this.latestLine); const { stages: n } = this.currentSection; if (e) { const e = n[n.length - 2]; if (0 === n.length) throw new Error("Nothing to run statement in parallel with"); if (j(e, t)) n.splice(n.length - 1, 0, t); else { const s = this.makeParallel([e, t]); s.ln = t.ln, n.splice(n.length - 2, 1, s) } } else n.push(t) } makeParallel(t) { const e = []; return V(e, t), 0 === e.length ? null : 1 === e.length ? e[0] : (e.forEach((t => { void 0 === t.ln && (t.ln = this.latestLine) })), { stages: e, type: "parallel" }) } defineGAgents(t) { x(this.currentNest.gAgents, t.filter((t => !G.includes(t.id))), I.equals), x(this.gAgents, t, I.equals) } getGAgentState(t) { return this.agentStates.get(t.id) || R.DEFAULT } updateGAgentState(t, e) { const n = this.agentStates.get(t.id); n ? Object.assign(n, e) : this.agentStates.set(t.id, new R(e)) } replaceGAgentState(t, e) { this.agentStates.set(t.id, e) } validateGAgents(t, { allowGrouped: e = !1, allowCovered: n = !1, allowVirtual: s = !1 } = {}) { t.forEach((t => { const r = this.getGAgentState(t), i = t.id; if (function (t) { return t.blocked && null === t.group }(r)) throw new Error("Duplicate agent name: " + i); if (!n && r.covered) throw new Error("Agent " + i + " is hidden behind group"); if (!e && null !== r.group) throw new Error("Agent " + i + " is in a group"); if (!s && t.isVirtualSource) throw new Error("Cannot use message source here"); if (function (t) { return t.startsWith("__") }(i)) throw new Error(i + " is a reserved name") })) } setGAgentVis(t, e, n, s = !1) { const r = new Set, i = "begin" !== e, a = t.filter((t => { if (r.has(t.id)) return !1; r.add(t.id); const e = this.getGAgentState(t); if (e.locked || e.blocked) { if (s) throw new Error("Cannot begin/end agent: " + t.id); return !1 } return e.visible === i })); return 0 === a.length ? null : ("relabel" !== e && (a.forEach((t => { this.updateGAgentState(t, { visible: "begin" === e }) })), this.defineGAgents(a)), { agentIDs: a.map((t => t.id)), mode: n, type: "agent " + e }) } setGAgentActivation(t, e, n = !1) { const s = t.filter((t => { const s = this.getGAgentState(t); if (s.locked || s.blocked) { if (n) throw new Error("Cannot activate agent: " + t.id); return !1 } return !(e < 0 && 0 === s.activation) && s.visible })); return 0 === s.length ? null : (s.forEach((t => { const n = this.getGAgentState(t); this.updateGAgentState(t, { activation: Math.max(0, n.activation + e) }) })), { agentIDs: s.map((t => t.id)), delta: e, type: "agent activation" }) } _makeSection(t, e) { return { delayedConnections: new Map, header: t, stages: e } } _checkSectionEnd() { const t = this.currentSection.delayedConnections; if (t.size > 0) { const e = t.values().next().value; throw new Error('Unused delayed connection "' + e.tag + '" at line ' + (e.ln + 1)) } } beginNested(t, { tag: e, label: n, name: s, ln: r }) { const i = I.make(s + "[", { anchorRight: !0 }), a = I.make(s + "]"), o = [i, a], l = []; return this.currentSection = this._makeSection({ blockType: t, canHide: !0, label: this.textFormatter(n), left: i.id, ln: r, right: a.id, tag: this.textFormatter(e), type: "block begin" }, l), this.currentNest = { blockType: t, gAgents: o, hasContent: !1, leftGAgent: i, rightGAgent: a, sections: [this.currentSection] }, this.replaceGAgentState(i, R.LOCKED), this.replaceGAgentState(a, R.LOCKED), this.nesting.push(this.currentNest), { stages: l } } nextBlockName() { const t = "__BLOCK" + this.nextID; return ++this.nextID, t } nextVirtualAgentName() { const t = "__" + this.nextID; return ++this.nextID, t } handleBlockBegin({ ln: t, blockType: e, tag: n, label: s, parallel: r }) { if (r) throw new Error("Cannot use parallel here"); this.beginNested(e, { label: s, ln: t, name: this.nextBlockName(), tag: n }) } handleBlockSplit({ ln: t, blockType: e, tag: n, label: s, parallel: r }) { if (r) throw new Error("Cannot use parallel here"); if ("if" !== this.currentNest.blockType) throw new Error('Invalid block nesting ("else" inside ' + this.currentNest.blockType + ")"); this._checkSectionEnd(), this.currentSection = this._makeSection({ blockType: e, label: this.textFormatter(s), left: this.currentNest.leftGAgent.id, ln: t, right: this.currentNest.rightGAgent.id, tag: this.textFormatter(n), type: "block split" }, []), this.currentNest.sections.push(this.currentSection) } handleBlockEnd({ parallel: t }) { if (this.nesting.length <= 1) throw new Error('Invalid block nesting (too many "end"s)'); this._checkSectionEnd(); const e = this.nesting.pop(); if (this.currentNest = A(this.nesting), this.currentSection = A(this.currentNest.sections), !e.hasContent) throw new Error("Empty block"); this.defineGAgents(e.gAgents), q(this.gAgents, e.leftGAgent, e.rightGAgent, e.gAgents), e.sections.forEach((t => { this.currentSection.stages.push(t.header), this.currentSection.stages.push(...t.stages) })), this.addStage({ left: e.leftGAgent.id, right: e.rightGAgent.id, type: "block end" }, { parallel: t }) } makeGroupDetails(t, e) { const n = t.map(this.toGAgent); if (this.validateGAgents(n), this.agentStates.has(e)) throw new Error("Duplicate agent name: " + e); const s = this.nextBlockName(), r = I.make(s + "[", { anchorRight: !0 }), i = I.make(s + "]"); this.replaceGAgentState(r, R.LOCKED), this.replaceGAgentState(i, R.LOCKED), this.updateGAgentState(I.make(e), { blocked: !0, group: e }), this.defineGAgents([...n, r, i]); const { indexL: a, indexR: o } = q(this.gAgents, r, i, n), l = [], h = n.slice(); for (let t = a + 1; t < o; ++t)l.push(this.gAgents[t]); return w(l, h, I.equals), { gAgents: n, gAgentsContained: h, gAgentsCovered: l, leftGAgent: r, rightGAgent: i } } handleGroupBegin({ agents: t, blockType: e, tag: n, label: s, alias: r, parallel: i }) { const a = this.makeGroupDetails(t, r); a.gAgentsContained.forEach((t => { this.updateGAgentState(t, { group: r }) })), a.gAgentsCovered.forEach((t => { this.updateGAgentState(t, { covered: !0 }) })), this.activeGroups.set(r, a), this.addImpStage(this.setGAgentVis(a.gAgents, "begin", "box"), { parallel: i }), this.addStage({ blockType: e, canHide: !1, label: this.textFormatter(s), left: a.leftGAgent.id, right: a.rightGAgent.id, tag: this.textFormatter(n), type: "block begin" }, { parallel: i }) } endGroup({ name: t }) { const e = this.activeGroups.get(t); return e ? (this.activeGroups.delete(t), e.gAgentsContained.forEach((t => { this.updateGAgentState(t, { group: null }) })), e.gAgentsCovered.forEach((t => { this.updateGAgentState(t, { covered: !1 }) })), this.updateGAgentState(I.make(t), { group: null }), { left: e.leftGAgent.id, right: e.rightGAgent.id, type: "block end" }) : null } handleMark({ name: t, parallel: e }) { this.markers.add(t), this.addStage({ name: t, type: "mark" }, { isVisible: !1, parallel: e }) } handleDivider({ mode: t, height: e, label: n, parallel: s }) { this.addStage({ formattedLabel: this.textFormatter(n), height: e, mode: t, type: "divider" }, { isVisible: !1, parallel: s }) } handleAsync({ target: t, parallel: e }) { if ("" !== t && !this.markers.has(t)) throw new Error("Unknown marker: " + t); this.addStage({ target: t, type: "async" }, { isVisible: !1, parallel: e }) } handleLabelPattern({ pattern: t }) { this.labelPattern = t.slice(); for (let t = 0; t < this.labelPattern.length; ++t) { const e = this.labelPattern[t]; "object" == typeof e && void 0 !== e.start && (this.labelPattern[t] = Object.assign({ current: e.start }, e)) } } applyLabelPattern(t) { let e = ""; const n = { label: t }; return this.labelPattern.forEach((t => { "string" == typeof t ? e += t : void 0 !== t.token ? e += n[t.token] : void 0 !== t.current && (e += t.current.toFixed(t.dp), t.current += t.inc) })), e } expandGroupedGAgent(t) { const { group: e } = this.getGAgentState(t); if (!e) return [t]; const n = this.activeGroups.get(e); return [n.leftGAgent, n.rightGAgent] } expandGroupedGAgentConnection(t) { const e = this.expandGroupedGAgent(t[0]), n = this.expandGroupedGAgent(t[1]); let s = I.indexOf(this.gAgents, e[0]), r = I.indexOf(this.gAgents, n[0]); return -1 === s && (s = e[0].isVirtualSource ? -1 : this.gAgents.length), -1 === r && (r = this.gAgents.length), s === r ? [A(e), A(n)] : s < r ? [A(e), n[0]] : [e[0], A(n)] } filterConnectFlags(t) { const e = t.filter(C("begin")).map(this.toGAgent), n = t.filter(C("end")).map(this.toGAgent); if (I.hasIntersection(e, n)) throw new Error("Cannot set agent visibility multiple times"); const s = t.filter(C("start")).map(this.toGAgent), r = t.filter(C("stop")).map(this.toGAgent); if (x(r, n), I.hasIntersection(s, r)) throw new Error("Cannot set agent activation multiple times"); return this.validateGAgents(e), this.validateGAgents(n), this.validateGAgents(s), this.validateGAgents(r), { beginGAgents: e, endGAgents: n, startGAgents: s, stopGAgents: r } } makeVirtualAgent(t) { const e = I.make(this.nextVirtualAgentName(), { anchorRight: t, isVirtualSource: !0 }); return this.replaceGAgentState(e, R.LOCKED), e } addNearbyAgent(t, e, n) { I.addNearby(this.currentNest.gAgents, t, e, n), I.addNearby(this.gAgents, t, e, n) } expandVirtualSourceAgents(t) { if (t[0].isVirtualSource) { if (t[1].isVirtualSource) throw new Error("Cannot connect found messages"); if (G.includes(t[1].id)) throw new Error("Cannot connect found messages to special agents"); const e = this.makeVirtualAgent(!0); return this.addNearbyAgent(t[1], e, 0), [e, t[1]] } if (t[1].isVirtualSource) { if (G.includes(t[0].id)) throw new Error("Cannot connect found messages to special agents"); const e = this.makeVirtualAgent(!1); return this.addNearbyAgent(t[0], e, 1), [t[0], e] } return t } _handlePartialConnect(t, e) { const n = this.filterConnectFlags(t), s = t.map(this.toGAgent); this.validateGAgents(s, { allowGrouped: !0, allowVirtual: !0 }), this.defineGAgents(S(s, this.expandGroupedGAgent).filter((t => !t.isVirtualSource))); const r = t.filter(C("begin", !1)).map(this.toGAgent).filter((t => !t.isVirtualSource)); return this.addImpStage(this.setGAgentVis(r, "begin", "box"), { parallel: e }), { flags: n, gAgents: s } } _makeConnectParallelStages(t, e) { return this.makeParallel([this.setGAgentVis(t.beginGAgents, "begin", "box", !0), this.setGAgentActivation(t.startGAgents, 1, !0), e, this.setGAgentActivation(t.stopGAgents, -1, !0), this.setGAgentVis(t.endGAgents, "end", "cross", !0)]) } _isSelfConnect(t) { const e = t.map(this.toGAgent), n = this.expandGroupedGAgentConnection(e); return n[0].id === n[1].id && !n.some((t => t.isVirtualSource)) } handleConnect({ agents: t, label: e, options: n, parallel: s }) { if (this._isSelfConnect(t)) { const r = {}; return this.handleConnectDelayBegin({ agent: t[0], ln: 0, options: n, parallel: s, tag: r }), void this.handleConnectDelayEnd({ agent: t[1], label: e, options: n, tag: r }) } let { flags: r, gAgents: i } = this._handlePartialConnect(t, s); i = this.expandGroupedGAgentConnection(i), i = this.expandVirtualSourceAgents(i); const a = { agentIDs: i.map((t => t.id)), label: this.textFormatter(this.applyLabelPattern(e)), options: n, type: "connect" }; this.addStage(this._makeConnectParallelStages(r, a), { parallel: s }) } handleConnectDelayBegin({ agent: t, tag: e, options: n, ln: s, parallel: r }) { const i = this.currentSection.delayedConnections; if (i.has(e)) throw new Error('Duplicate delayed connection "' + e + '"'); const { flags: a, gAgents: o } = this._handlePartialConnect([t], r), l = this.nextVirtualAgentName(), h = { agentIDs: null, label: null, options: n, tag: l, type: "connect-delay-begin" }; i.set(e, { connectStage: h, gAgents: o, ln: s, tag: e, uniqueTag: l }), this.addStage(this._makeConnectParallelStages(a, h), { parallel: r }) } handleConnectDelayEnd({ agent: t, tag: e, label: n, options: s, parallel: r }) { const i = this.currentSection.delayedConnections, a = i.get(e); if (!a) throw new Error('Unknown delayed connection "' + e + '"'); let { flags: o, gAgents: l } = this._handlePartialConnect([t], r); l = this.expandGroupedGAgentConnection([...a.gAgents, ...l]), l = this.expandVirtualSourceAgents(l); let h = a.connectStage.options; if (h.line !== s.line) throw new Error("Mismatched delayed connection arrows"); s.right && (h = Object.assign({}, h, { right: s.right })), Object.assign(a.connectStage, { agentIDs: l.map((t => t.id)), label: this.textFormatter(this.applyLabelPattern(n)), options: h }); const d = { tag: a.uniqueTag, type: "connect-delay-end" }; this.addStage(this._makeConnectParallelStages(o, d), { parallel: r }), i.delete(e) } handleNote({ type: t, agents: e, mode: n, label: s, parallel: r }) { let i = null; i = 0 === e.length ? E[t] || [] : e.map(this.toGAgent), this.validateGAgents(i, { allowGrouped: !0 }), i = S(i, this.expandGroupedGAgent); const a = i.map((t => t.id)), o = new Set(a).size; if ("note between" === t && o < 2) throw new Error("note between requires at least 2 agents"); this.defineGAgents(i), this.addImpStage(this.setGAgentVis(i, "begin", "box"), { parallel: r }), this.addStage({ agentIDs: a, label: this.textFormatter(s), mode: n, type: t }, { parallel: r }) } handleAgentDefine({ agents: t }) { const e = t.map(this.toGAgent); this.validateGAgents(e, { allowCovered: !0, allowGrouped: !0 }), x(this.gAgents, e, I.equals) } handleAgentOptions({ agent: t, options: e }) { const n = this.toGAgent(t), s = [n]; this.validateGAgents(s, { allowCovered: !0, allowGrouped: !0 }), x(this.gAgents, s, I.equals), this.gAgents.filter((({ id: t }) => t === n.id)).forEach((t => { x(t.options, e) })) } handleAgentActivation({ agents: t, delta: e, parallel: n }) { const s = t.map(this.toGAgent); this.validateGAgents(s), this.defineGAgents(s), this.addImpStage(this.setGAgentVis(s, "begin", "box"), { parallel: n }), this.addStage(this.setGAgentActivation(s, e), { parallel: n }) } handleAgentBegin({ agents: t, mode: e, parallel: n }) { const s = t.map(this.toGAgent); this.validateGAgents(s), this.addStage(this.setGAgentVis(s, "begin", e, !0), { parallel: n }) } handleAgentRelabel({ agents: t, parallel: e }) { let n = null; 0 === t.length ? n = this.gAgents.filter((t => { const e = this.getGAgentState(t); return !(e.covered || e.group || e.locked || e.blocked || t.isVirtualSource) })) : (n = t.map(this.toGAgent), this.validateGAgents(n)), this.addStage(this.setGAgentVis(n, "relabel", "box"), { parallel: e }) } handleAgentEnd({ agents: t, mode: e, parallel: n }) { const s = t.filter((t => this.activeGroups.has(t.name))), r = t.filter((t => !this.activeGroups.has(t.name))).map(this.toGAgent); this.validateGAgents(r), this.addStage(this.makeParallel([this.setGAgentActivation(r, Number.NEGATIVE_INFINITY), this.setGAgentVis(r, "end", e, !0), ...s.map(this.endGroup)]), { parallel: n }) } handleStage(t) { this.latestLine = t.ln; try { const e = this.stageHandlers[t.type]; if (!e) throw new Error("Unknown command: " + t.type); e(t) } catch (e) { if ("object" == typeof e && e.message) throw e.message += " at line " + (t.ln + 1), e } } _reset() { this.agentStates.clear(), this.markers.clear(), this.agentAliases.clear(), this.activeGroups.clear(), this.gAgents.length = 0, this.nextID = 0, this.nesting.length = 0, this.labelPattern = [{ token: "label" }] } _finalise(t) { q(this.gAgents, this.currentNest.leftGAgent, this.currentNest.rightGAgent), function (t) { let e = [], n = new Set; for (let s = 0; s < t.length;) { const r = t[s]; let i = null; i = "parallel" === r.type ? r.stages : [r], O(i); const a = T(i); B(n, a, e, i), 0 === i.length ? t.splice(s, 1) : ("parallel" === r.type && 1 === i.length && t.splice(s, 1, i[0]), n = a, e = i, ++s) } }(t.stages), this.gAgents.forEach((t => { t.formattedLabel = this.textFormatter(t.id) })) } generate({ stages: t, meta: e = {} }) { this._reset(), this.textFormatter = e.textFormatter; const n = this.beginNested("global", { label: "", ln: 0, name: "", tag: "" }); if (t.forEach(this.handleStage), 1 !== this.nesting.length) throw new Error("Unterminated section at line " + (this.currentSection.header.ln + 1)); if (this.activeGroups.size > 0) throw new Error("Unterminated group"); this._checkSectionEnd(); const s = e.terminators || "none"; return this.addStage(this.makeParallel([this.setGAgentActivation(this.gAgents, Number.NEGATIVE_INFINITY), this.setGAgentVis(this.gAgents, "end", s)])), this._finalise(n), function (t, e) { for (let n = 0; n < t.length && !H(t[n], e); ++n); }(n.stages, e.headers || "box"), { agents: this.gAgents.slice(), meta: { code: e.code, theme: e.theme, title: this.textFormatter(e.title) }, stages: n.stages } } } const U = "Courier New,Liberation Mono,monospace", W = 1.3, X = { "font-family": U, "font-size": 8, "line-height": W }, Q = { "font-family": U, "font-size": 8, "line-height": W, "text-anchor": "middle" }; class J extends e { constructor(e) { super(e, { "font-family": U, "font-size": 8, "line-height": W }); const n = { padding: { top: 3, bottom: 2 }, tag: { padding: { top: 2, left: 4, right: 4, bottom: 2 }, boxRenderer: this.renderTag.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1, rx: 3, ry: 3 }), labelAttrs: { "font-family": U, "font-weight": "bold", "font-size": 9, "line-height": W, "text-anchor": "left" } }, label: { minHeight: 8, padding: { top: 2, left: 8, right: 8, bottom: 2 }, labelAttrs: { "font-family": U, "font-size": 8, "line-height": W, "text-anchor": "left" } } }; Object.assign(this, { titleMargin: 8, outerMargin: 4, agentMargin: 12, actionMargin: 12, minActionMargin: 4, agentLineActivationRadius: 4, agentCap: { box: { padding: { top: 4, left: 8, right: 8, bottom: 4 }, arrowBottom: 12, boxAttrs: { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }, labelAttrs: { "font-family": U, "font-size": 12, "line-height": W, "text-anchor": "middle" } }, person: { padding: { top: 16, left: 8, right: 8, bottom: 4 }, arrowBottom: 12, boxRenderer: this.renderPerson.bind(this, { iconHeight: 12, iconWidth: 14 }, { fill: "#000000" }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }), labelAttrs: { "font-family": U, "font-size": 12, "line-height": W, "text-anchor": "middle" } }, database: { padding: { top: 9, left: 8, right: 8, bottom: 3 }, arrowBottom: 12, boxRenderer: this.renderDB.bind(this, { tilt: 4 }, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }), labelAttrs: { "font-family": U, "font-size": 12, "line-height": W, "text-anchor": "middle" } }, cross: { size: 16, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 1 }) }, bar: { height: 4, render: e.boxFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 1 }) }, fade: { width: 5, height: 8, extend: 1 }, none: { height: 8 } }, connect: { loopbackRadius: 4, arrow: { single: { width: 4, height: 8, render: this.renderArrowHead.bind(this), attrs: { fill: "#000000", "stroke-width": 0, "stroke-linejoin": "miter" } }, double: { width: 3, height: 6, render: this.renderArrowHead.bind(this), attrs: { fill: "none", stroke: "#000000", "stroke-width": 1, "stroke-linejoin": "miter" } }, fade: { short: 2, size: 10 }, cross: { short: 8, radius: 4, render: e.crossFactory({ fill: "none", stroke: "#000000", "stroke-width": 1 }) } }, label: { padding: 4, margin: { top: 2, bottom: 1 }, attrs: { "font-family": U, "font-size": 8, "line-height": W, "text-anchor": "middle" }, loopbackAttrs: { "font-family": U, "font-size": 8, "line-height": W } }, source: { radius: 2, render: e.circleFactory({ fill: "#000000", stroke: "#000000", "stroke-width": 1 }) }, mask: { padding: { top: 0, left: 3, right: 3, bottom: 1 } } }, agentLineAttrs: { "": { fill: "none", stroke: "#000000", "stroke-width": 1 }, red: { stroke: "#AA0000" } }, blocks: { ref: { margin: { top: 0, bottom: 0 }, boxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 2 }), section: n }, "": { margin: { top: 0, bottom: 0 }, boxRenderer: e.boxFactory({ fill: "none", stroke: "#000000", "stroke-width": 2 }), collapsedBoxRenderer: this.renderRef.bind(this, { fill: "#FFFFFF", stroke: "#000000", "stroke-width": 2 }), section: n, sepRenderer: e.lineFactory({ stroke: "#000000", "stroke-width": 2, "stroke-dasharray": "8, 4" }) } }, notes: { text: { margin: { top: 0, left: 8, right: 8, bottom: 0 }, padding: { top: 4, left: 4, right: 4, bottom: 4 }, overlap: { left: 8, right: 8 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF" }), labelAttrs: X }, note: { margin: { top: 0, left: 8, right: 8, bottom: 0 }, padding: { top: 8, left: 8, right: 8, bottom: 8 }, overlap: { left: 8, right: 8 }, boxRenderer: e.noteFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1 }, { fill: "none", stroke: "#000000", "stroke-width": 1 }), labelAttrs: X }, state: { margin: { top: 0, left: 8, right: 8, bottom: 0 }, padding: { top: 8, left: 8, right: 8, bottom: 8 }, overlap: { left: 8, right: 8 }, boxRenderer: e.boxFactory({ fill: "#FFFFFF", stroke: "#000000", "stroke-width": 1, rx: 8, ry: 8 }), labelAttrs: X } }, dividers: { "": { labelAttrs: Q, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: () => ({}) }, line: { labelAttrs: Q, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 8, margin: 0, render: this.renderLineDivider.bind(this, { lineAttrs: { stroke: "#000000" } }) }, delay: { labelAttrs: Q, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 0, margin: 0, render: this.renderDelayDivider.bind(this, { dotSize: 2, gapSize: 2 }) }, tear: { labelAttrs: Q, padding: { top: 2, left: 5, right: 5, bottom: 2 }, extend: 8, margin: 8, render: this.renderTearDivider.bind(this, { fadeBegin: 4, fadeSize: 4, zigWidth: 4, zigHeight: 1, lineAttrs: { stroke: "#000000" } }) } } }), this.addConnectLine("solid", { attrs: { stroke: "#000000", "stroke-width": 1 } }), this.addConnectLine("dash", { attrs: { "stroke-dasharray": "4, 4" } }), this.addConnectLine("wave", { pattern: new t(6, [0, -.25, -.5, -.25, 0, .25, .5, .25]) }) } } const Z = { type: "error line-error", suggest: [], then: { "": 0 } }; function K(t, e = []) { return { type: "string", suggest: e, then: Object.assign({ "": 0 }, t) } } function _(t, e) { return t.v === e.v && t.prefix === e.prefix && t.suffix === e.suffix && t.q === e.q } const $ = ["person", "database", "red"], tt = ["activate", "begin", "deactivate", "end", "note", "state", "text"], et = (() => { function t(t, e = 1) { return { type: "variable", suggest: [{ known: "Agent" }], then: Object.assign({}, t, { "": 0, ",": { type: "operator", then: { "": e } } }) } } const e = { type: "", suggest: ["\n"], then: {} }, n = { type: "", suggest: [], then: {} }, s = K({ "\n": e }), r = { type: "operator", then: { "": s, "\n": n } }, i = t({ "\n": e, as: { type: "keyword", then: { "": { type: "variable", suggest: [{ known: "Agent" }], then: { "": 0, ",": { type: "operator", then: { "": 3 } }, "\n": e } } } } }), a = t({ ":": r }), o = { type: "variable", suggest: [{ known: "Agent" }], then: { "": 0, ":": { type: "operator", then: { "": s, "\n": n } }, "\n": e } }, l = { ":": { type: "operator", then: { "": K({ as: { type: "keyword", then: { "": { type: "variable", suggest: [{ known: "Agent" }], then: { "": 0, "\n": e } } } } }) } } }, h = { type: "keyword", then: Object.assign({ over: { type: "keyword", then: { "": t(l) } } }, l) }, d = { "\n": e, ":": { type: "operator", then: { "": s, "\n": n } }, with: { type: "keyword", suggest: ["with height "], then: { height: { type: "keyword", then: { "": { type: "number", suggest: ["6 ", "30 "], then: { "\n": e, ":": { type: "operator", then: { "": s, "\n": n } } } } } } } } }; const g = function (t, e, n) { const s = Object.assign({}, n); return e.forEach((e => { s[e] = { type: t, then: n } })), s }("keyword", ["a", "an"], function (t, e, n) { const s = {}, r = Object.assign({}, n); return e.forEach((e => { s[e] = { type: t, then: r }, r[e] = 0 })), s }("keyword", $, { "\n": e })); function c(t) { return { type: "keyword", suggest: [t + " of ", t + ": "], then: { of: { type: "keyword", then: { "": a } }, ":": { type: "operator", then: { "": s } }, "": a } } } function u({ exit: t, sourceExit: e, blankExit: n }) { const s = { type: "operator", then: { "+": Z, "-": Z, "*": Z, "!": Z, "": t } }; return { "+": { type: "operator", then: { "+": Z, "-": Z, "*": s, "!": Z, "": t } }, "-": { type: "operator", then: { "+": Z, "-": Z, "*": s, "!": { type: "operator", then: { "+": Z, "-": Z, "*": Z, "!": Z, "": t } }, "": t } }, "*": { type: "operator", then: Object.assign({ "+": s, "-": s, "*": Z, "!": Z, "": t }, e || t) }, "!": s, "": n || t } } const p = { type: "keyword", then: { "": s, ":": { type: "operator", then: { "": s } }, "\n": e } }, f = { title: { type: "keyword", then: { "": s } }, theme: { type: "keyword", then: { "": { type: "string", suggest: [{ global: "themes", suffix: "\n" }], then: { "": 0, "\n": e } } } }, headers: { type: "keyword", then: { none: { type: "keyword", then: {} }, cross: { type: "keyword", then: {} }, box: { type: "keyword", then: {} }, fade: { type: "keyword", then: {} }, bar: { type: "keyword", then: {} } } }, terminators: { type: "keyword", then: { none: { type: "keyword", then: {} }, cross: { type: "keyword", then: {} }, box: { type: "keyword", then: {} }, fade: { type: "keyword", then: {} }, bar: { type: "keyword", then: {} } } }, divider: { type: "keyword", then: Object.assign({ line: { type: "keyword", then: d }, space: { type: "keyword", then: d }, delay: { type: "keyword", then: d }, tear: { type: "keyword", then: d } }, d) }, define: { type: "keyword", then: { "": i, as: Z } }, begin: { type: "keyword", then: { "": i, reference: h, as: Z } }, relabel: { type: "keyword", then: { "": t({ "\n": e }), as: Z, "\n": e } }, end: { type: "keyword", then: { "": t({ "\n": e }), as: Z, "\n": e } }, activate: { type: "keyword", then: { "": t({ "\n": e }) } }, deactivate: { type: "keyword", then: { "": t({ "\n": e }) } }, if: p, else: { type: "keyword", suggest: ["else\n", "else if: "], then: { if: { type: "keyword", suggest: ["if: "], then: { "": s, ":": { type: "operator", then: { "": s } } } }, "\n": e } }, repeat: p, group: p, note: { type: "keyword", then: { over: { type: "keyword", then: { "": a } }, left: c("left"), right: c("right"), between: { type: "keyword", then: { "": t({ ":": Z }, a) } } } }, state: { type: "keyword", suggest: ["state over "], then: { over: { type: "keyword", then: { "": { type: "variable", suggest: [{ known: "Agent" }], then: { "": 0, ",": Z, ":": r } } } } } }, text: { type: "keyword", then: { left: c("left"), right: c("right") } }, autolabel: { type: "keyword", then: { off: { type: "keyword", then: {} }, "": K({ "\n": e }, [{ v: "/g, skip: 0 }, end: { matcher: /<\/i>/g, skip: 0 } }, { attrs: { "font-style": "italic" }, begin: { matcher: /[\s_~`>]\*(?=\S)/g, skip: 1 }, end: { matcher: /\S\*(?=[\s_~`<])/g, skip: 1 } }, { attrs: { "font-style": "italic" }, begin: { matcher: /[\s*~`>]_(?=\S)/g, skip: 1 }, end: { matcher: /\S_(?=[\s*~`<])/g, skip: 1 } }, { attrs: { "font-weight": "bolder" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/b>/g, skip: 0 } }, { attrs: { "font-weight": "bolder" }, begin: { matcher: /[\s_~`>]\*\*(?=\S)/g, skip: 1 }, end: { matcher: /\S\*\*(?=[\s_~`<])/g, skip: 1 } }, { attrs: { "font-weight": "bolder" }, begin: { matcher: /[\s*~`>]__(?=\S)/g, skip: 1 }, end: { matcher: /\S__(?=[\s*~`<])/g, skip: 1 } }, { attrs: { "text-decoration": "line-through" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/s>/g, skip: 0 } }, { attrs: { "text-decoration": "line-through" }, begin: { matcher: /[\s_*`>]~(?=\S)/g, skip: 1 }, end: { matcher: /\S~(?=[\s_*`<])/g, skip: 1 } }, { attrs: { "text-decoration": "overline" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/o>/g, skip: 0 } }, { attrs: { "font-family": "Courier New,Liberation Mono,monospace" }, begin: { matcher: /[\s_*~.>]`(?=\S)/g, skip: 1 }, end: { matcher: /\S`(?=[\s_*~.<])/g, skip: 1 } }, { attrs: { "text-decoration": "underline" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/u>/g, skip: 0 } }, { attrs: { "baseline-shift": "70%", "font-size": "0.6em" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/sup>/g, skip: 0 } }, { attrs: { "baseline-shift": "-20%", "font-size": "0.6em" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/sub>/g, skip: 0 } }, { attrs: { fill: "#DD0000" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/red>/g, skip: 0 } }, { attrs: { filter: "mark" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/mark>/g, skip: 0 } }, { attrs: { filter: "mark" }, begin: { matcher: //g, skip: 0 }, end: { matcher: /<\/highlight>/g, skip: 0 } }, { all: { matcher: /\[([^\]]+)\]\(([^)]+?)(?: "([^"]+)")?\)/g, skip: 0 }, attrs: t => ({ href: t[2].replace(xt, ""), "text-decoration": "underline" }), text: t => t[1].replace(xt, "") }, { all: { matcher: /<([a-z]+:\/\/[^>]*)>/g, skip: 0 }, attrs: t => ({ href: t[1].replace(xt, ""), "text-decoration": "underline" }), text: t => t[1].replace(xt, "") }], wt = /[\f\n\r\t\v ]+/g, vt = /^[\t-\r ]+|[\t-\r ]+$/g, At = -2; function Ft(t, e, n) { const s = " " + t + " ", r = e + 1; let i = { end: 0, match: null, start: s.length, styleIndex: -1 }; const a = s.indexOf("", r); return -1 !== a && (i = { end: a + 1, match: null, start: a, styleIndex: At }), kt.forEach((({ all: t, begin: e, end: a }, o) => { const l = t || (null === n[o] ? e : a); l.matcher.lastIndex = r - l.skip, i = function (t, e, n, s) { if (!s) return t; const r = s.index + n.skip, i = n.matcher.lastIndex; return r < t.start || r === t.start && i > t.end ? { end: i, match: s, start: r, styleIndex: e } : t }(i, o, l, l.matcher.exec(s)) })), -1 === i.styleIndex ? null : (--i.end, --i.start, i) } function Mt(t) { const e = {}, n = []; let s = !1; return t.forEach((t => { if (!t) return; const r = t["text-decoration"]; r && !n.includes(r) && n.push(r), Object.assign(e, t), s = !0 })), n.length > 1 && (e["text-decoration"] = n.join(" ")), s ? e : null } function St(t) { return t.replace(vt, "") } function Rt(t, e) { return "function" == typeof t ? t(...e) : t } function Ct(t) { if (!t) return []; const e = kt.map((() => null)); return St(t).split("\n").map((t => { const n = []; return function (t, e, n) { let s = t, r = 0, i = 0; for (let t = null; t = Ft(s, r, e);) { const { styleIndex: a, start: o, end: l, match: h } = t; if (a !== At) { if (n(s.substring(i, o)), null === e[a]) { const t = kt[a]; e[a] = Rt(t.attrs, [h]), t.all && (n(Rt(t.text, [h])), e[a] = null) } else e[a] = null; i = l, r = l } else s = s.substr(0, o) + s.substr(l), r = o + 1 } n(s.substr(i)) }(St(t).replace(wt, " "), e, (t => { t && n.push({ attrs: Mt(e), text: t }) })), n })) } const It = new Map; It.set("if", { blockType: "if", skip: [], tag: "if", type: "block begin" }), It.set("else", { blockType: "else", skip: ["if"], tag: "else", type: "block split" }), It.set("repeat", { blockType: "repeat", skip: [], tag: "repeat", type: "block begin" }), It.set("group", { blockType: "group", skip: [], tag: "", type: "block begin" }); const Et = { agentFlags: { "!": { flag: "end" }, "*": { allowBlankName: !0, blankNameFlag: "source", flag: "begin" }, "+": { flag: "start" }, "-": { flag: "stop" } }, types: (() => { const t = new Map; return M([[{ tok: "", type: 0 }, { tok: "<", type: 1 }, { tok: "<<", type: 2 }, { tok: "~", type: 3 }], [{ tok: "-", type: "solid" }, { tok: "--", type: "dash" }, { tok: "~", type: "wave" }], [{ tok: "", type: 0 }, { tok: ">", type: 1 }, { tok: ">>", type: 2 }, { tok: "~", type: 3 }, { tok: "x", type: 4 }]]).forEach((e => { const [n, s, r] = e; 0 === n.type && 0 === r.type || 3 === n.type && "wave" === s.type && 0 === r.type || t.set(e.map((t => t.tok)).join(""), { left: n.type, line: s.type, right: r.type }) })), t })() }, Gt = ["none", "box", "cross", "fade", "bar"], Dt = new Map; Dt.set("text", { mode: "text", types: { left: { max: Number.POSITIVE_INFINITY, min: 0, skip: ["of"], type: "note left" }, right: { max: Number.POSITIVE_INFINITY, min: 0, skip: ["of"], type: "note right" } } }), Dt.set("note", { mode: "note", types: { between: { max: Number.POSITIVE_INFINITY, min: 2, skip: [], type: "note between" }, left: { max: Number.POSITIVE_INFINITY, min: 0, skip: ["of"], type: "note left" }, over: { max: Number.POSITIVE_INFINITY, min: 0, skip: [], type: "note over" }, right: { max: Number.POSITIVE_INFINITY, min: 0, skip: ["of"], type: "note right" } } }), Dt.set("state", { mode: "state", types: { over: { max: 1, min: 1, skip: [], type: "note over" } } }); const Lt = new Map; Lt.set("line", { defaultHeight: 6 }), Lt.set("space", { defaultHeight: 6 }), Lt.set("delay", { defaultHeight: 30 }), Lt.set("tear", { defaultHeight: 6 }); const Nt = new Map; function zt(t, e = null) { let n = ""; return e && (n = " at line " + (e.b.ln + 1) + ", character " + e.b.ch), new Error(t + n) } function Ot(t, e = null) { return null === e ? t.length : e } function Tt(t, e = 0, n = null) { const s = Ot(t, n); if (s <= e) return ""; let r = t[e].v; for (let n = e + 1; n < s; ++n)r += t[n].s + t[n].v; return r } function Bt(t) { return !t || t.q ? null : t.v } function Vt(t, e, n, s = null) { for (let r = 0; r < n.length; ++r) { const i = n[r], a = t[e + r]; if (Bt(a) !== i) { if (s) throw zt(s + '; expected "' + i + '"', a); return e } } return e + n.length } function Pt(t, e, { start: n = 0, limit: s = null, orEnd: r = !1 } = {}) { const i = Ot(t, s); for (let s = n; s <= i - e.length; ++s)if (Vt(t, s, e) !== s) return s; return r ? i : -1 } function jt(t, e, n, { flagTypes: s = {}, aliases: r = !1 } = {}) { const i = [], a = []; let o = e, l = !1; for (; o < n; ++o) { const e = t[o], n = Bt(e), r = s[n]; if (!r) break; if (i.includes(r.flag)) throw zt("Duplicate agent flag: " + n, e); l = l || Boolean(r.allowBlankName), i.push(r.flag), a.push(r.blankNameFlag) } const { name: h, alias: d } = function (t, e, n, { enableAlias: s, allowBlankName: r }) { let i = n; if (s && (i = Pt(t, ["as"], { limit: n, orEnd: !0, start: e })), e >= i && !r) { let n = t[e]; throw n || (n = { b: A(t).e }), zt("Missing agent name", n) } return { alias: Tt(t, i + 1, n), name: Tt(t, e, i) } }(t, o, n, { allowBlankName: l, enableAlias: r }); return { alias: d, flags: h ? i : a, name: h } } function Ht(t, e, n, s) { const r = []; let i = -1; for (let a = e; a < n; ++a) { "," === Bt(t[a]) ? -1 !== i && (r.push(jt(t, i, a, s)), i = -1) : -1 === i && (i = a) } return -1 !== i && r.push(jt(t, i, n, s)), r } Nt.set("define", { alias: !0, base: { type: "agent define" }, min: 1 }), Nt.set("begin", { alias: !0, base: { mode: "box", type: "agent begin" }, min: 1 }), Nt.set("relabel", { alias: !1, base: { type: "agent relabel" }, min: 0 }), Nt.set("end", { alias: !1, base: { mode: "cross", type: "agent end" }, min: 1 }), Nt.set("activate", { alias: !1, base: { delta: 1, type: "agent activation" }, min: 1 }), Nt.set("deactivate", { alias: !1, base: { delta: -1, type: "agent activation" }, min: 1 }); const qt = [{ begin: ["title"], fn: (t, e) => (e.title = Tt(t, 1), !0) }, { begin: ["theme"], fn: (t, e) => (e.theme = Tt(t, 1), !0) }, { begin: ["terminators"], fn: (t, e) => { const n = Bt(t[1]); if (!n) throw zt("Unspecified termination", t[0]); if (-1 === Gt.indexOf(n)) throw zt('Unknown termination "' + n + '"', t[1]); return e.terminators = n, !0 } }, { begin: ["headers"], fn: (t, e) => { const n = Bt(t[1]); if (!n) throw zt("Unspecified header", t[0]); if (-1 === Gt.indexOf(n)) throw zt('Unknown header "' + n + '"', t[1]); return e.headers = n, !0 } }, { begin: ["divider"], fn: t => { const e = Pt(t, [":"], { orEnd: !0 }), n = Pt(t, ["with", "height"], { limit: e, orEnd: !0 }), s = Tt(t, 1, n) || "line"; if (!Lt.has(s)) throw zt("Unknown divider type", t[1]); const r = function (t, e = 0, n = null, s = Number.NAN) { const r = Tt(t, e, n); return Number(r || s) }(t, n + 2, e, Lt.get(s).defaultHeight); if (Number.isNaN(r) || r < 0) throw zt("Invalid divider height", t[n + 2]); return { height: r, label: Tt(t, e + 1), mode: s, type: "divider" } } }, { begin: ["autolabel"], fn: t => { let e = null; return e = "off" === Bt(t[1]) ? "