From 9e88b47bc33fdeaa930231ac4cc64c2ef976a343 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 22 Aug 2023 22:19:26 +0300 Subject: [PATCH 01/74] deprecated protobuf fix --- Dockerfile | 2 +- example/well_known_types/client/main.go | 2 +- go.mod | 8 +++--- go.sum | 12 +++------ gripmock.go | 3 ++- protoc-gen-gripmock/generator.go | 6 ++--- protoc-gen-gripmock/go.mod | 1 - protoc-gen-gripmock/go.sum | 27 --------------------- protoc-gen-gripmock/server.tmpl | 12 +++++---- protogen/example/well_known_types/wkt.pb.go | 2 +- 10 files changed, 23 insertions(+), 52 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5ba88350..29a5b4bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM golang:${BUILD_ARG_GO_VERSION}-alpine${BUILD_ARG_ALPINE_VERSION} AS builder # install tools (bash, git, protobuf, protoc-gen-go, protoc-grn-go-grpc) RUN apk -U --no-cache add bash git protobuf &&\ - go install -v github.com/golang/protobuf/protoc-gen-go@latest &&\ + go install -v google.golang.org/protobuf/cmd/protoc-gen-go@latest &&\ go install -v google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest # cloning well-known-types diff --git a/example/well_known_types/client/main.go b/example/well_known_types/client/main.go index 348367d5..4b21eb0f 100644 --- a/example/well_known_types/client/main.go +++ b/example/well_known_types/client/main.go @@ -5,10 +5,10 @@ import ( "log" "time" - "github.com/golang/protobuf/ptypes/empty" pb "github.com/tokopedia/gripmock/protogen/example/well_known_types" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + empty "google.golang.org/protobuf/types/known/emptypb" ) // in order to generate this .pb.go you need to have https://github.com/google/protobuf.git cloned diff --git a/go.mod b/go.mod index b8a71a2d..4a1e3ed1 100644 --- a/go.mod +++ b/go.mod @@ -4,24 +4,24 @@ go 1.21 require ( github.com/go-chi/chi v4.1.2+incompatible - github.com/golang/protobuf v1.5.3 github.com/lithammer/fuzzysearch v1.1.8 github.com/stretchr/testify v1.8.4 github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 google.golang.org/grpc v1.57.0 + google.golang.org/protobuf v1.31.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/kr/pretty v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/tokopedia/gripmock/protogen v0.0.0 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.11.0 // indirect - google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230821184602-ccc8af3d0e93 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1fa027ed..7bf6fd36 100644 --- a/go.sum +++ b/go.sum @@ -57,14 +57,10 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJgEqUQYGDGgbwmhjoAOz8kO/ajxefY= -google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93 h1:zv6ieVm8jNcN33At1+APsRISkRgynuWUxUhv6G123jY= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230821184602-ccc8af3d0e93 h1:OpqhBqmDJdwQbcZeN2G+wAjNq6xnmZHrmS+//OOUxT8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= diff --git a/gripmock.go b/gripmock.go index 8ef35f93..d78f0521 100644 --- a/gripmock.go +++ b/gripmock.go @@ -141,7 +141,8 @@ func generateProtoc(param protocParam) { pbOutput := os.Getenv("GOPATH") + "/src" args = append(args, param.protoPath...) - args = append(args, "--go_out=plugins=grpc:"+pbOutput) + args = append(args, "--go_out="+pbOutput) + args = append(args, "--go-grpc_out="+pbOutput) args = append(args, fmt.Sprintf("--gripmock_out=admin-port=%s,grpc-address=%s,grpc-port=%s:%s", param.adminPort, param.grpcAddress, param.grpcPort, param.output)) protoc := exec.Command("protoc", args...) diff --git a/protoc-gen-gripmock/generator.go b/protoc-gen-gripmock/generator.go index 8c4b7074..634a5128 100644 --- a/protoc-gen-gripmock/generator.go +++ b/protoc-gen-gripmock/generator.go @@ -10,12 +10,12 @@ import ( "strings" "text/template" - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/protoc-gen-go/descriptor" "golang.org/x/text/cases" "golang.org/x/text/language" "golang.org/x/tools/imports" "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/proto" + descriptor "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" ) @@ -203,7 +203,7 @@ func getGoPackage(proto *descriptor.FileDescriptorProto) (alias string, goPackag } // support go_package alias declaration - // https://github.com/golang/protobuf/issues/139 + // https://google.golang.org/protobuf/issues/139 if splits := strings.Split(goPackage, ";"); len(splits) > 1 { goPackage = splits[0] alias = splits[1] diff --git a/protoc-gen-gripmock/go.mod b/protoc-gen-gripmock/go.mod index 185ac170..9a63d14b 100644 --- a/protoc-gen-gripmock/go.mod +++ b/protoc-gen-gripmock/go.mod @@ -3,7 +3,6 @@ module github.com/tokopedia/gripmock/protoc-gen-gripmock go 1.21 require ( - github.com/golang/protobuf v1.5.3 golang.org/x/text v0.12.0 golang.org/x/tools v0.12.0 google.golang.org/protobuf v1.31.0 diff --git a/protoc-gen-gripmock/go.sum b/protoc-gen-gripmock/go.sum index e0fc11ae..a9a6e455 100644 --- a/protoc-gen-gripmock/go.sum +++ b/protoc-gen-gripmock/go.sum @@ -1,44 +1,17 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 0d31bf4f..1eebb96f 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -11,11 +11,11 @@ import ( "net" "net/http" - "github.com/golang/protobuf/jsonpb" + jsonpb "google.golang.org/protobuf/encoding/protojson" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/reflection" - "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" ) {{ range $package, $alias := .Dependencies }} import {{$alias}} "{{$package}}" @@ -50,7 +50,9 @@ func main() { {{ template "find_stub" }} {{ define "services" }} -type {{.Name}} struct{} +type {{.Name}} struct{ + {{.Package}}Unsafe{{.Name}}Server +} {{ template "methods" .}} {{ end }} @@ -146,7 +148,7 @@ type response struct { Error string `json:"error"` } -func findStub(service, method string, in, out protoiface.MessageV1) error { +func findStub(service, method string, in, out protoreflect.ProtoMessage) error { url := fmt.Sprintf("http://localhost%s/find", HTTP_PORT) pyl := payload{ Service: service, @@ -181,6 +183,6 @@ func findStub(service, method string, in, out protoiface.MessageV1) error { } data, _ := json.Marshal(respRPC.Data) - return jsonpb.Unmarshal(bytes.NewReader(data), out) + return jsonpb.Unmarshal(data, out) } {{ end }} \ No newline at end of file diff --git a/protogen/example/well_known_types/wkt.pb.go b/protogen/example/well_known_types/wkt.pb.go index 6ff88407..6a1652ac 100644 --- a/protogen/example/well_known_types/wkt.pb.go +++ b/protogen/example/well_known_types/wkt.pb.go @@ -8,13 +8,13 @@ package well_known_types import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" api "google.golang.org/genproto/protobuf/api" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + empty "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" ) From bcb36f68d65bcb4ee19c40f5ccf7ee389101f8f3 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 07:16:31 +0300 Subject: [PATCH 02/74] fix --- protoc-gen-gripmock/server.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 1eebb96f..a1c9fb73 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -51,7 +51,7 @@ func main() { {{ define "services" }} type {{.Name}} struct{ - {{.Package}}Unsafe{{.Name}}Server + proto.Unsafe{{.Name}}Server } {{ template "methods" .}} From 3bcc0b8768244c06816d9a07ea2c7dd28968316e Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 18:20:20 +0300 Subject: [PATCH 03/74] fix package unsafe server --- Dockerfile | 2 +- Makefile | 5 +++- deployments/docker-compose/docker-compose.yml | 23 +++++++++++++++++++ example/stub-subfolders/entrypoint.sh | 3 +++ go.mod | 1 - protoc-gen-gripmock/server.tmpl | 2 +- 6 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 deployments/docker-compose/docker-compose.yml diff --git a/Dockerfile b/Dockerfile index 29a5b4bb..66d28e0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BUILD_ARG_GO_VERSION=1.21.0 +ARG BUILD_ARG_GO_VERSION=1.21 ARG BUILD_ARG_ALPINE_VERSION=3.18 FROM golang:${BUILD_ARG_GO_VERSION}-alpine${BUILD_ARG_ALPINE_VERSION} AS builder diff --git a/Makefile b/Makefile index 27b6d524..02e71eaf 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GOLANGCI_LING_IMAGE="golangci/golangci-lint:v1.54.0-alpine" +GOLANGCI_LING_IMAGE="golangci/golangci-lint:v1.54.2-alpine" .PHONY: * @@ -15,3 +15,6 @@ lint: lint-fix: make lint args=--fix + +test: build + docker compose -f deployments/docker-compose/docker-compose.yml up diff --git a/deployments/docker-compose/docker-compose.yml b/deployments/docker-compose/docker-compose.yml new file mode 100644 index 00000000..2043ad98 --- /dev/null +++ b/deployments/docker-compose/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3.8' +services: + simple: + image: bavix/gripmock:latest + entrypoint: example/simple/entrypoint.sh + stream: + image: bavix/gripmock:latest + entrypoint: example/stream/entrypoint.sh + well_known_types: + image: bavix/gripmock:latest + entrypoint: example/well_known_types/entrypoint.sh + multi-package: + image: bavix/gripmock:latest + entrypoint: example/multi-package/entrypoint.sh + multi-files: + image: bavix/gripmock:latest + entrypoint: example/multi-files/entrypoint.sh + one-of: + image: bavix/gripmock:latest + entrypoint: example/one-of/entrypoint.sh + stub-subfolders: + image: bavix/gripmock:latest + entrypoint: example/stub-subfolders/entrypoint.sh diff --git a/example/stub-subfolders/entrypoint.sh b/example/stub-subfolders/entrypoint.sh index 3a9e75f6..73b34e69 100755 --- a/example/stub-subfolders/entrypoint.sh +++ b/example/stub-subfolders/entrypoint.sh @@ -4,4 +4,7 @@ gripmock --stub=example/stub-subfolders/stub example/stub-subfolders/stub-subfolders.proto & +# wait for generated files to be available and gripmock is up +sleep 2 + go run example/stub-subfolders/client/*.go \ No newline at end of file diff --git a/go.mod b/go.mod index 4a1e3ed1..674e3d0d 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,6 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/kr/pretty v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/tokopedia/gripmock/protogen v0.0.0 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.11.0 // indirect google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index a1c9fb73..1eebb96f 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -51,7 +51,7 @@ func main() { {{ define "services" }} type {{.Name}} struct{ - proto.Unsafe{{.Name}}Server + {{.Package}}Unsafe{{.Name}}Server } {{ template "methods" .}} From a69d9fed9b2bbd9a14370b6a1d2cfbdbe8d4da0e Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 18:27:35 +0300 Subject: [PATCH 04/74] test --- example/multi-files/entrypoint.sh | 2 +- example/multi-package/entrypoint.sh | 2 +- example/one-of/entrypoint.sh | 2 +- example/simple/entrypoint.sh | 2 +- example/stream/entrypoint.sh | 2 +- example/stub-subfolders/entrypoint.sh | 2 +- example/well_known_types/entrypoint.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/example/multi-files/entrypoint.sh b/example/multi-files/entrypoint.sh index fc3ac7f0..52b463cc 100755 --- a/example/multi-files/entrypoint.sh +++ b/example/multi-files/entrypoint.sh @@ -6,6 +6,6 @@ gripmock --stub=example/multi-files/stub example/multi-files/file1.proto \ example/multi-files/file2.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/multi-files/client/*.go \ No newline at end of file diff --git a/example/multi-package/entrypoint.sh b/example/multi-package/entrypoint.sh index d168dbb3..0cb491f8 100755 --- a/example/multi-package/entrypoint.sh +++ b/example/multi-package/entrypoint.sh @@ -9,6 +9,6 @@ gripmock --stub=example/multi-package/stub --imports=example/multi-package/ \ example/multi-package/foo.proto example/multi-package/hello.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/multi-package/client/*.go \ No newline at end of file diff --git a/example/one-of/entrypoint.sh b/example/one-of/entrypoint.sh index 44eae91e..d641a631 100755 --- a/example/one-of/entrypoint.sh +++ b/example/one-of/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/one-of/stub example/one-of/oneof.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/one-of/client/*.go \ No newline at end of file diff --git a/example/simple/entrypoint.sh b/example/simple/entrypoint.sh index d9977069..d8bddd1e 100755 --- a/example/simple/entrypoint.sh +++ b/example/simple/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/simple/stub example/simple/simple.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/simple/client/*.go \ No newline at end of file diff --git a/example/stream/entrypoint.sh b/example/stream/entrypoint.sh index e4e180e3..c13aabd0 100755 --- a/example/stream/entrypoint.sh +++ b/example/stream/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/stream/stub example/stream/stream.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/stream/client/*.go \ No newline at end of file diff --git a/example/stub-subfolders/entrypoint.sh b/example/stub-subfolders/entrypoint.sh index 73b34e69..6429030b 100755 --- a/example/stub-subfolders/entrypoint.sh +++ b/example/stub-subfolders/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/stub-subfolders/stub example/stub-subfolders/stub-subfolders.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/stub-subfolders/client/*.go \ No newline at end of file diff --git a/example/well_known_types/entrypoint.sh b/example/well_known_types/entrypoint.sh index bfe10827..165e6c67 100755 --- a/example/well_known_types/entrypoint.sh +++ b/example/well_known_types/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/well_known_types/stub example/well_known_types/wkt.proto & # wait for generated files to be available and gripmock is up -sleep 2 +sleep 5 go run example/well_known_types/client/*.go \ No newline at end of file From ce9ed1298cafdc00343072edd89ba1c33da4a0d1 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 18:29:37 +0300 Subject: [PATCH 05/74] Revert "test" This reverts commit a69d9fed9b2bbd9a14370b6a1d2cfbdbe8d4da0e. --- example/multi-files/entrypoint.sh | 2 +- example/multi-package/entrypoint.sh | 2 +- example/one-of/entrypoint.sh | 2 +- example/simple/entrypoint.sh | 2 +- example/stream/entrypoint.sh | 2 +- example/stub-subfolders/entrypoint.sh | 2 +- example/well_known_types/entrypoint.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/example/multi-files/entrypoint.sh b/example/multi-files/entrypoint.sh index 52b463cc..fc3ac7f0 100755 --- a/example/multi-files/entrypoint.sh +++ b/example/multi-files/entrypoint.sh @@ -6,6 +6,6 @@ gripmock --stub=example/multi-files/stub example/multi-files/file1.proto \ example/multi-files/file2.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/multi-files/client/*.go \ No newline at end of file diff --git a/example/multi-package/entrypoint.sh b/example/multi-package/entrypoint.sh index 0cb491f8..d168dbb3 100755 --- a/example/multi-package/entrypoint.sh +++ b/example/multi-package/entrypoint.sh @@ -9,6 +9,6 @@ gripmock --stub=example/multi-package/stub --imports=example/multi-package/ \ example/multi-package/foo.proto example/multi-package/hello.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/multi-package/client/*.go \ No newline at end of file diff --git a/example/one-of/entrypoint.sh b/example/one-of/entrypoint.sh index d641a631..44eae91e 100755 --- a/example/one-of/entrypoint.sh +++ b/example/one-of/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/one-of/stub example/one-of/oneof.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/one-of/client/*.go \ No newline at end of file diff --git a/example/simple/entrypoint.sh b/example/simple/entrypoint.sh index d8bddd1e..d9977069 100755 --- a/example/simple/entrypoint.sh +++ b/example/simple/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/simple/stub example/simple/simple.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/simple/client/*.go \ No newline at end of file diff --git a/example/stream/entrypoint.sh b/example/stream/entrypoint.sh index c13aabd0..e4e180e3 100755 --- a/example/stream/entrypoint.sh +++ b/example/stream/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/stream/stub example/stream/stream.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/stream/client/*.go \ No newline at end of file diff --git a/example/stub-subfolders/entrypoint.sh b/example/stub-subfolders/entrypoint.sh index 6429030b..73b34e69 100755 --- a/example/stub-subfolders/entrypoint.sh +++ b/example/stub-subfolders/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/stub-subfolders/stub example/stub-subfolders/stub-subfolders.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/stub-subfolders/client/*.go \ No newline at end of file diff --git a/example/well_known_types/entrypoint.sh b/example/well_known_types/entrypoint.sh index 165e6c67..bfe10827 100755 --- a/example/well_known_types/entrypoint.sh +++ b/example/well_known_types/entrypoint.sh @@ -5,6 +5,6 @@ gripmock --stub=example/well_known_types/stub example/well_known_types/wkt.proto & # wait for generated files to be available and gripmock is up -sleep 5 +sleep 2 go run example/well_known_types/client/*.go \ No newline at end of file From c3b9d7b6a5d4ff5515a81a2bb87b978b69b6606f Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 19:04:55 +0300 Subject: [PATCH 06/74] test --- gripmock.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gripmock.go b/gripmock.go index d78f0521..eaf0001e 100644 --- a/gripmock.go +++ b/gripmock.go @@ -171,6 +171,12 @@ func fixGoPackage(protoPaths []string) []string { } func runGrpcServer(output string) (*exec.Cmd, <-chan error) { + run1 := exec.Command("cat", output+"server.go") + run1.Stdout = os.Stdout + run1.Stderr = os.Stderr + if err := run1.Start(); err != nil { + log.Fatal(err) + } run := exec.Command("go", "run", output+"server.go") run.Stdout = os.Stdout run.Stderr = os.Stderr From e769330cffc10471149e7897f4e350744b729378 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 20:18:23 +0300 Subject: [PATCH 07/74] remove --- gripmock.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gripmock.go b/gripmock.go index eaf0001e..d78f0521 100644 --- a/gripmock.go +++ b/gripmock.go @@ -171,12 +171,6 @@ func fixGoPackage(protoPaths []string) []string { } func runGrpcServer(output string) (*exec.Cmd, <-chan error) { - run1 := exec.Command("cat", output+"server.go") - run1.Stdout = os.Stdout - run1.Stderr = os.Stderr - if err := run1.Start(); err != nil { - log.Fatal(err) - } run := exec.Command("go", "run", output+"server.go") run.Stdout = os.Stdout run.Stderr = os.Stderr From 9ae7cfad2a93e2e529faf8affb768e297161f40a Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 20:54:36 +0300 Subject: [PATCH 08/74] remove *.pb.go --- .github/workflows/integration-test.yml | 2 - protogen/example/multi-files/file1.pb.go | 311 ------------ protogen/example/multi-files/file2.pb.go | 311 ------------ protogen/example/multi-package/bar/bar.pb.go | 144 ------ protogen/example/multi-package/foo.pb.go | 147 ------ protogen/example/multi-package/hello.pb.go | 160 ------ protogen/example/one-of/oneof.pb.go | 478 ----------------- protogen/example/simple/simple.pb.go | 310 ------------ protogen/example/stream/stream.pb.go | 479 ------------------ .../stub-subfolders/stub-subfolders.pb.go | 312 ------------ protogen/example/well_known_types/wkt.pb.go | 170 ------- 11 files changed, 2824 deletions(-) delete mode 100644 protogen/example/multi-files/file1.pb.go delete mode 100644 protogen/example/multi-files/file2.pb.go delete mode 100644 protogen/example/multi-package/bar/bar.pb.go delete mode 100644 protogen/example/multi-package/foo.pb.go delete mode 100644 protogen/example/multi-package/hello.pb.go delete mode 100644 protogen/example/one-of/oneof.pb.go delete mode 100644 protogen/example/simple/simple.pb.go delete mode 100644 protogen/example/stream/stream.pb.go delete mode 100644 protogen/example/stub-subfolders/stub-subfolders.pb.go delete mode 100644 protogen/example/well_known_types/wkt.pb.go diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 2678594a..88af8896 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -16,12 +16,10 @@ jobs: uses: ./ with: entrypoint: example/simple/entrypoint.sh - args: simple - name: Run Stream Example uses: ./ with: entrypoint: example/stream/entrypoint.sh - args: stream - name: Run WKT Example uses: ./ with: diff --git a/protogen/example/multi-files/file1.pb.go b/protogen/example/multi-files/file1.pb.go deleted file mode 100644 index d113a55a..00000000 --- a/protogen/example/multi-files/file1.pb.go +++ /dev/null @@ -1,311 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: file1.proto - -package multi_files - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request1 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request1) Reset() { - *x = Request1{} - if protoimpl.UnsafeEnabled { - mi := &file_file1_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request1) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request1) ProtoMessage() {} - -func (x *Request1) ProtoReflect() protoreflect.Message { - mi := &file_file1_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request1.ProtoReflect.Descriptor instead. -func (*Request1) Descriptor() ([]byte, []int) { - return file_file1_proto_rawDescGZIP(), []int{0} -} - -func (x *Request1) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The response message containing the greetings -type Reply1 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` -} - -func (x *Reply1) Reset() { - *x = Reply1{} - if protoimpl.UnsafeEnabled { - mi := &file_file1_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply1) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply1) ProtoMessage() {} - -func (x *Reply1) ProtoReflect() protoreflect.Message { - mi := &file_file1_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply1.ProtoReflect.Descriptor instead. -func (*Reply1) Descriptor() ([]byte, []int) { - return file_file1_proto_rawDescGZIP(), []int{1} -} - -func (x *Reply1) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Reply1) GetReturnCode() int32 { - if x != nil { - return x.ReturnCode - } - return 0 -} - -var File_file1_proto protoreflect.FileDescriptor - -var file_file1_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x08, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x41, - 0x0a, 0x09, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x31, 0x12, 0x34, 0x0a, 0x08, 0x53, - 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x31, 0x1a, 0x12, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x31, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, - 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_file1_proto_rawDescOnce sync.Once - file_file1_proto_rawDescData = file_file1_proto_rawDesc -) - -func file_file1_proto_rawDescGZIP() []byte { - file_file1_proto_rawDescOnce.Do(func() { - file_file1_proto_rawDescData = protoimpl.X.CompressGZIP(file_file1_proto_rawDescData) - }) - return file_file1_proto_rawDescData -} - -var file_file1_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_file1_proto_goTypes = []interface{}{ - (*Request1)(nil), // 0: multifiles.Request1 - (*Reply1)(nil), // 1: multifiles.Reply1 -} -var file_file1_proto_depIdxs = []int32{ - 0, // 0: multifiles.Gripmock1.SayHello:input_type -> multifiles.Request1 - 1, // 1: multifiles.Gripmock1.SayHello:output_type -> multifiles.Reply1 - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_file1_proto_init() } -func file_file1_proto_init() { - if File_file1_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_file1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request1); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_file1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply1); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_file1_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_file1_proto_goTypes, - DependencyIndexes: file_file1_proto_depIdxs, - MessageInfos: file_file1_proto_msgTypes, - }.Build() - File_file1_proto = out.File - file_file1_proto_rawDesc = nil - file_file1_proto_goTypes = nil - file_file1_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// Gripmock1Client is the client API for Gripmock1 service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type Gripmock1Client interface { - // simple unary method - SayHello(ctx context.Context, in *Request1, opts ...grpc.CallOption) (*Reply1, error) -} - -type gripmock1Client struct { - cc grpc.ClientConnInterface -} - -func NewGripmock1Client(cc grpc.ClientConnInterface) Gripmock1Client { - return &gripmock1Client{cc} -} - -func (c *gripmock1Client) SayHello(ctx context.Context, in *Request1, opts ...grpc.CallOption) (*Reply1, error) { - out := new(Reply1) - err := c.cc.Invoke(ctx, "/multifiles.Gripmock1/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Gripmock1Server is the server API for Gripmock1 service. -type Gripmock1Server interface { - // simple unary method - SayHello(context.Context, *Request1) (*Reply1, error) -} - -// UnimplementedGripmock1Server can be embedded to have forward compatible implementations. -type UnimplementedGripmock1Server struct { -} - -func (*UnimplementedGripmock1Server) SayHello(context.Context, *Request1) (*Reply1, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} - -func RegisterGripmock1Server(s *grpc.Server, srv Gripmock1Server) { - s.RegisterService(&_Gripmock1_serviceDesc, srv) -} - -func _Gripmock1_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request1) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(Gripmock1Server).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/multifiles.Gripmock1/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(Gripmock1Server).SayHello(ctx, req.(*Request1)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock1_serviceDesc = grpc.ServiceDesc{ - ServiceName: "multifiles.Gripmock1", - HandlerType: (*Gripmock1Server)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Gripmock1_SayHello_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "file1.proto", -} diff --git a/protogen/example/multi-files/file2.pb.go b/protogen/example/multi-files/file2.pb.go deleted file mode 100644 index 236f19e8..00000000 --- a/protogen/example/multi-files/file2.pb.go +++ /dev/null @@ -1,311 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: file2.proto - -package multi_files - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request2) Reset() { - *x = Request2{} - if protoimpl.UnsafeEnabled { - mi := &file_file2_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request2) ProtoMessage() {} - -func (x *Request2) ProtoReflect() protoreflect.Message { - mi := &file_file2_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request2.ProtoReflect.Descriptor instead. -func (*Request2) Descriptor() ([]byte, []int) { - return file_file2_proto_rawDescGZIP(), []int{0} -} - -func (x *Request2) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The response message containing the greetings -type Reply2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` -} - -func (x *Reply2) Reset() { - *x = Reply2{} - if protoimpl.UnsafeEnabled { - mi := &file_file2_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply2) ProtoMessage() {} - -func (x *Reply2) ProtoReflect() protoreflect.Message { - mi := &file_file2_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply2.ProtoReflect.Descriptor instead. -func (*Reply2) Descriptor() ([]byte, []int) { - return file_file2_proto_rawDescGZIP(), []int{1} -} - -func (x *Reply2) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Reply2) GetReturnCode() int32 { - if x != nil { - return x.ReturnCode - } - return 0 -} - -var File_file2_proto protoreflect.FileDescriptor - -var file_file2_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x08, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x32, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x41, - 0x0a, 0x09, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x32, 0x12, 0x34, 0x0a, 0x08, 0x53, - 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x12, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x32, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, - 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_file2_proto_rawDescOnce sync.Once - file_file2_proto_rawDescData = file_file2_proto_rawDesc -) - -func file_file2_proto_rawDescGZIP() []byte { - file_file2_proto_rawDescOnce.Do(func() { - file_file2_proto_rawDescData = protoimpl.X.CompressGZIP(file_file2_proto_rawDescData) - }) - return file_file2_proto_rawDescData -} - -var file_file2_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_file2_proto_goTypes = []interface{}{ - (*Request2)(nil), // 0: multifiles.Request2 - (*Reply2)(nil), // 1: multifiles.Reply2 -} -var file_file2_proto_depIdxs = []int32{ - 0, // 0: multifiles.Gripmock2.SayHello:input_type -> multifiles.Request2 - 1, // 1: multifiles.Gripmock2.SayHello:output_type -> multifiles.Reply2 - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_file2_proto_init() } -func file_file2_proto_init() { - if File_file2_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_file2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_file2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_file2_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_file2_proto_goTypes, - DependencyIndexes: file_file2_proto_depIdxs, - MessageInfos: file_file2_proto_msgTypes, - }.Build() - File_file2_proto = out.File - file_file2_proto_rawDesc = nil - file_file2_proto_goTypes = nil - file_file2_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// Gripmock2Client is the client API for Gripmock2 service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type Gripmock2Client interface { - // simple unary method - SayHello(ctx context.Context, in *Request2, opts ...grpc.CallOption) (*Reply2, error) -} - -type gripmock2Client struct { - cc grpc.ClientConnInterface -} - -func NewGripmock2Client(cc grpc.ClientConnInterface) Gripmock2Client { - return &gripmock2Client{cc} -} - -func (c *gripmock2Client) SayHello(ctx context.Context, in *Request2, opts ...grpc.CallOption) (*Reply2, error) { - out := new(Reply2) - err := c.cc.Invoke(ctx, "/multifiles.Gripmock2/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Gripmock2Server is the server API for Gripmock2 service. -type Gripmock2Server interface { - // simple unary method - SayHello(context.Context, *Request2) (*Reply2, error) -} - -// UnimplementedGripmock2Server can be embedded to have forward compatible implementations. -type UnimplementedGripmock2Server struct { -} - -func (*UnimplementedGripmock2Server) SayHello(context.Context, *Request2) (*Reply2, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} - -func RegisterGripmock2Server(s *grpc.Server, srv Gripmock2Server) { - s.RegisterService(&_Gripmock2_serviceDesc, srv) -} - -func _Gripmock2_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request2) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(Gripmock2Server).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/multifiles.Gripmock2/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(Gripmock2Server).SayHello(ctx, req.(*Request2)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock2_serviceDesc = grpc.ServiceDesc{ - ServiceName: "multifiles.Gripmock2", - HandlerType: (*Gripmock2Server)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Gripmock2_SayHello_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "file2.proto", -} diff --git a/protogen/example/multi-package/bar/bar.pb.go b/protogen/example/multi-package/bar/bar.pb.go deleted file mode 100644 index 8df453f4..00000000 --- a/protogen/example/multi-package/bar/bar.pb.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: bar/bar.proto - -package bar - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Bar struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Bar) Reset() { - *x = Bar{} - if protoimpl.UnsafeEnabled { - mi := &file_bar_bar_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Bar) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Bar) ProtoMessage() {} - -func (x *Bar) ProtoReflect() protoreflect.Message { - mi := &file_bar_bar_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Bar.ProtoReflect.Descriptor instead. -func (*Bar) Descriptor() ([]byte, []int) { - return file_bar_bar_proto_rawDescGZIP(), []int{0} -} - -func (x *Bar) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_bar_bar_proto protoreflect.FileDescriptor - -var file_bar_bar_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x62, 0x61, 0x72, 0x2f, 0x62, 0x61, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x03, 0x62, 0x61, 0x72, 0x22, 0x19, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, - 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2f, - 0x62, 0x61, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_bar_bar_proto_rawDescOnce sync.Once - file_bar_bar_proto_rawDescData = file_bar_bar_proto_rawDesc -) - -func file_bar_bar_proto_rawDescGZIP() []byte { - file_bar_bar_proto_rawDescOnce.Do(func() { - file_bar_bar_proto_rawDescData = protoimpl.X.CompressGZIP(file_bar_bar_proto_rawDescData) - }) - return file_bar_bar_proto_rawDescData -} - -var file_bar_bar_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_bar_bar_proto_goTypes = []interface{}{ - (*Bar)(nil), // 0: bar.Bar -} -var file_bar_bar_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_bar_bar_proto_init() } -func file_bar_bar_proto_init() { - if File_bar_bar_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_bar_bar_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bar); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_bar_bar_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_bar_bar_proto_goTypes, - DependencyIndexes: file_bar_bar_proto_depIdxs, - MessageInfos: file_bar_bar_proto_msgTypes, - }.Build() - File_bar_bar_proto = out.File - file_bar_bar_proto_rawDesc = nil - file_bar_bar_proto_goTypes = nil - file_bar_bar_proto_depIdxs = nil -} diff --git a/protogen/example/multi-package/foo.pb.go b/protogen/example/multi-package/foo.pb.go deleted file mode 100644 index 0419397a..00000000 --- a/protogen/example/multi-package/foo.pb.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: foo.proto - -// simulating neighboring .proto file -// but different package - -package multi_package - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Response struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Response string `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` -} - -func (x *Response) Reset() { - *x = Response{} - if protoimpl.UnsafeEnabled { - mi := &file_foo_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Response) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Response) ProtoMessage() {} - -func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_foo_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Response.ProtoReflect.Descriptor instead. -func (*Response) Descriptor() ([]byte, []int) { - return file_foo_proto_rawDescGZIP(), []int{0} -} - -func (x *Response) GetResponse() string { - if x != nil { - return x.Response - } - return "" -} - -var File_foo_proto protoreflect.FileDescriptor - -var file_foo_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x66, 0x6f, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x66, 0x6f, 0x6f, - 0x22, 0x26, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, - 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, - 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x2d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_foo_proto_rawDescOnce sync.Once - file_foo_proto_rawDescData = file_foo_proto_rawDesc -) - -func file_foo_proto_rawDescGZIP() []byte { - file_foo_proto_rawDescOnce.Do(func() { - file_foo_proto_rawDescData = protoimpl.X.CompressGZIP(file_foo_proto_rawDescData) - }) - return file_foo_proto_rawDescData -} - -var file_foo_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_foo_proto_goTypes = []interface{}{ - (*Response)(nil), // 0: foo.Response -} -var file_foo_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_foo_proto_init() } -func file_foo_proto_init() { - if File_foo_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_foo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Response); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_foo_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_foo_proto_goTypes, - DependencyIndexes: file_foo_proto_depIdxs, - MessageInfos: file_foo_proto_msgTypes, - }.Build() - File_foo_proto = out.File - file_foo_proto_rawDesc = nil - file_foo_proto_goTypes = nil - file_foo_proto_depIdxs = nil -} diff --git a/protogen/example/multi-package/hello.pb.go b/protogen/example/multi-package/hello.pb.go deleted file mode 100644 index 00ffa6d8..00000000 --- a/protogen/example/multi-package/hello.pb.go +++ /dev/null @@ -1,160 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: hello.proto - -package multi_package - -import ( - context "context" - bar "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -var File_hello_proto protoreflect.FileDescriptor - -var file_hello_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x62, 0x61, - 0x72, 0x2f, 0x62, 0x61, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x66, 0x6f, 0x6f, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2c, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, - 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x05, 0x47, 0x72, 0x65, 0x65, 0x74, 0x12, 0x08, 0x2e, 0x62, 0x61, - 0x72, 0x2e, 0x42, 0x61, 0x72, 0x1a, 0x0d, 0x2e, 0x66, 0x6f, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, - 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_hello_proto_goTypes = []interface{}{ - (*bar.Bar)(nil), // 0: bar.Bar - (*Response)(nil), // 1: foo.Response -} -var file_hello_proto_depIdxs = []int32{ - 0, // 0: multi_package.Gripmock.Greet:input_type -> bar.Bar - 1, // 1: multi_package.Gripmock.Greet:output_type -> foo.Response - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_hello_proto_init() } -func file_hello_proto_init() { - if File_hello_proto != nil { - return - } - file_foo_proto_init() - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_hello_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_hello_proto_goTypes, - DependencyIndexes: file_hello_proto_depIdxs, - }.Build() - File_hello_proto = out.File - file_hello_proto_rawDesc = nil - file_hello_proto_goTypes = nil - file_hello_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - Greet(ctx context.Context, in *bar.Bar, opts ...grpc.CallOption) (*Response, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) Greet(ctx context.Context, in *bar.Bar, opts ...grpc.CallOption) (*Response, error) { - out := new(Response) - err := c.cc.Invoke(ctx, "/multi_package.Gripmock/Greet", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - Greet(context.Context, *bar.Bar) (*Response, error) -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) Greet(context.Context, *bar.Bar) (*Response, error) { - return nil, status.Errorf(codes.Unimplemented, "method Greet not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_Greet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(bar.Bar) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GripmockServer).Greet(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/multi_package.Gripmock/Greet", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GripmockServer).Greet(ctx, req.(*bar.Bar)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "multi_package.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Greet", - Handler: _Gripmock_Greet_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "hello.proto", -} diff --git a/protogen/example/one-of/oneof.pb.go b/protogen/example/one-of/oneof.pb.go deleted file mode 100644 index a19e5f75..00000000 --- a/protogen/example/one-of/oneof.pb.go +++ /dev/null @@ -1,478 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: oneof.proto - -package one_of - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request) Reset() { - *x = Request{} - if protoimpl.UnsafeEnabled { - mi := &file_oneof_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request) ProtoMessage() {} - -func (x *Request) ProtoReflect() protoreflect.Message { - mi := &file_oneof_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request.ProtoReflect.Descriptor instead. -func (*Request) Descriptor() ([]byte, []int) { - return file_oneof_proto_rawDescGZIP(), []int{0} -} - -func (x *Request) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type Reply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to ReplyType: - // *Reply_Reply1 - // *Reply_Reply2 - ReplyType isReply_ReplyType `protobuf_oneof:"replyType"` -} - -func (x *Reply) Reset() { - *x = Reply{} - if protoimpl.UnsafeEnabled { - mi := &file_oneof_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply) ProtoMessage() {} - -func (x *Reply) ProtoReflect() protoreflect.Message { - mi := &file_oneof_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply.ProtoReflect.Descriptor instead. -func (*Reply) Descriptor() ([]byte, []int) { - return file_oneof_proto_rawDescGZIP(), []int{1} -} - -func (m *Reply) GetReplyType() isReply_ReplyType { - if m != nil { - return m.ReplyType - } - return nil -} - -func (x *Reply) GetReply1() *Reply1 { - if x, ok := x.GetReplyType().(*Reply_Reply1); ok { - return x.Reply1 - } - return nil -} - -func (x *Reply) GetReply2() *Reply2 { - if x, ok := x.GetReplyType().(*Reply_Reply2); ok { - return x.Reply2 - } - return nil -} - -type isReply_ReplyType interface { - isReply_ReplyType() -} - -type Reply_Reply1 struct { - Reply1 *Reply1 `protobuf:"bytes,1,opt,name=reply1,proto3,oneof"` -} - -type Reply_Reply2 struct { - Reply2 *Reply2 `protobuf:"bytes,2,opt,name=reply2,proto3,oneof"` -} - -func (*Reply_Reply1) isReply_ReplyType() {} - -func (*Reply_Reply2) isReply_ReplyType() {} - -// usual response type -type Reply1 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` -} - -func (x *Reply1) Reset() { - *x = Reply1{} - if protoimpl.UnsafeEnabled { - mi := &file_oneof_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply1) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply1) ProtoMessage() {} - -func (x *Reply1) ProtoReflect() protoreflect.Message { - mi := &file_oneof_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply1.ProtoReflect.Descriptor instead. -func (*Reply1) Descriptor() ([]byte, []int) { - return file_oneof_proto_rawDescGZIP(), []int{2} -} - -func (x *Reply1) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Reply1) GetReturnCode() int32 { - if x != nil { - return x.ReturnCode - } - return 0 -} - -// other response type -type Reply2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Other int32 `protobuf:"varint,1,opt,name=other,proto3" json:"other,omitempty"` -} - -func (x *Reply2) Reset() { - *x = Reply2{} - if protoimpl.UnsafeEnabled { - mi := &file_oneof_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply2) ProtoMessage() {} - -func (x *Reply2) ProtoReflect() protoreflect.Message { - mi := &file_oneof_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply2.ProtoReflect.Descriptor instead. -func (*Reply2) Descriptor() ([]byte, []int) { - return file_oneof_proto_rawDescGZIP(), []int{3} -} - -func (x *Reply2) GetOther() int32 { - if x != nil { - return x.Other - } - return 0 -} - -var File_oneof_proto protoreflect.FileDescriptor - -var file_oneof_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f, - 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x06, - 0x72, 0x65, 0x70, 0x6c, 0x79, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, - 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x31, 0x48, 0x00, 0x52, 0x06, 0x72, - 0x65, 0x70, 0x6c, 0x79, 0x31, 0x12, 0x27, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x32, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x42, 0x0b, - 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, - 0x22, 0x1e, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x32, 0x34, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x0a, 0x08, - 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x0e, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, - 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, - 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x6e, 0x65, 0x2d, 0x6f, 0x66, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_oneof_proto_rawDescOnce sync.Once - file_oneof_proto_rawDescData = file_oneof_proto_rawDesc -) - -func file_oneof_proto_rawDescGZIP() []byte { - file_oneof_proto_rawDescOnce.Do(func() { - file_oneof_proto_rawDescData = protoimpl.X.CompressGZIP(file_oneof_proto_rawDescData) - }) - return file_oneof_proto_rawDescData -} - -var file_oneof_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_oneof_proto_goTypes = []interface{}{ - (*Request)(nil), // 0: oneof.Request - (*Reply)(nil), // 1: oneof.Reply - (*Reply1)(nil), // 2: oneof.Reply1 - (*Reply2)(nil), // 3: oneof.Reply2 -} -var file_oneof_proto_depIdxs = []int32{ - 2, // 0: oneof.Reply.reply1:type_name -> oneof.Reply1 - 3, // 1: oneof.Reply.reply2:type_name -> oneof.Reply2 - 0, // 2: oneof.Gripmock.SayHello:input_type -> oneof.Request - 1, // 3: oneof.Gripmock.SayHello:output_type -> oneof.Reply - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_oneof_proto_init() } -func file_oneof_proto_init() { - if File_oneof_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_oneof_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oneof_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oneof_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply1); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_oneof_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_oneof_proto_msgTypes[1].OneofWrappers = []interface{}{ - (*Reply_Reply1)(nil), - (*Reply_Reply2)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_oneof_proto_rawDesc, - NumEnums: 0, - NumMessages: 4, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_oneof_proto_goTypes, - DependencyIndexes: file_oneof_proto_depIdxs, - MessageInfos: file_oneof_proto_msgTypes, - }.Build() - File_oneof_proto = out.File - file_oneof_proto_rawDesc = nil - file_oneof_proto_goTypes = nil - file_oneof_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - // simple unary method - SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { - out := new(Reply) - err := c.cc.Invoke(ctx, "/oneof.Gripmock/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - // simple unary method - SayHello(context.Context, *Request) (*Reply, error) -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GripmockServer).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/oneof.Gripmock/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GripmockServer).SayHello(ctx, req.(*Request)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "oneof.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Gripmock_SayHello_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "oneof.proto", -} diff --git a/protogen/example/simple/simple.pb.go b/protogen/example/simple/simple.pb.go deleted file mode 100644 index 49a36f1f..00000000 --- a/protogen/example/simple/simple.pb.go +++ /dev/null @@ -1,310 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: simple.proto - -package simple - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request) Reset() { - *x = Request{} - if protoimpl.UnsafeEnabled { - mi := &file_simple_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request) ProtoMessage() {} - -func (x *Request) ProtoReflect() protoreflect.Message { - mi := &file_simple_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request.ProtoReflect.Descriptor instead. -func (*Request) Descriptor() ([]byte, []int) { - return file_simple_proto_rawDescGZIP(), []int{0} -} - -func (x *Request) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The response message containing the greetings -type Reply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` -} - -func (x *Reply) Reset() { - *x = Reply{} - if protoimpl.UnsafeEnabled { - mi := &file_simple_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply) ProtoMessage() {} - -func (x *Reply) ProtoReflect() protoreflect.Message { - mi := &file_simple_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply.ProtoReflect.Descriptor instead. -func (*Reply) Descriptor() ([]byte, []int) { - return file_simple_proto_rawDescGZIP(), []int{1} -} - -func (x *Reply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Reply) GetReturnCode() int32 { - if x != nil { - return x.ReturnCode - } - return 0 -} - -var File_simple_proto protoreflect.FileDescriptor - -var file_simple_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, - 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x36, 0x0a, 0x08, 0x47, 0x72, 0x69, - 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x12, 0x0f, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, - 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} - -var ( - file_simple_proto_rawDescOnce sync.Once - file_simple_proto_rawDescData = file_simple_proto_rawDesc -) - -func file_simple_proto_rawDescGZIP() []byte { - file_simple_proto_rawDescOnce.Do(func() { - file_simple_proto_rawDescData = protoimpl.X.CompressGZIP(file_simple_proto_rawDescData) - }) - return file_simple_proto_rawDescData -} - -var file_simple_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_simple_proto_goTypes = []interface{}{ - (*Request)(nil), // 0: simple.Request - (*Reply)(nil), // 1: simple.Reply -} -var file_simple_proto_depIdxs = []int32{ - 0, // 0: simple.Gripmock.SayHello:input_type -> simple.Request - 1, // 1: simple.Gripmock.SayHello:output_type -> simple.Reply - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_simple_proto_init() } -func file_simple_proto_init() { - if File_simple_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_simple_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_simple_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_simple_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_simple_proto_goTypes, - DependencyIndexes: file_simple_proto_depIdxs, - MessageInfos: file_simple_proto_msgTypes, - }.Build() - File_simple_proto = out.File - file_simple_proto_rawDesc = nil - file_simple_proto_goTypes = nil - file_simple_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - // simple unary method - SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { - out := new(Reply) - err := c.cc.Invoke(ctx, "/simple.Gripmock/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - // simple unary method - SayHello(context.Context, *Request) (*Reply, error) -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GripmockServer).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/simple.Gripmock/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GripmockServer).SayHello(ctx, req.(*Request)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "simple.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Gripmock_SayHello_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "simple.proto", -} diff --git a/protogen/example/stream/stream.pb.go b/protogen/example/stream/stream.pb.go deleted file mode 100644 index 3cd0a217..00000000 --- a/protogen/example/stream/stream.pb.go +++ /dev/null @@ -1,479 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: stream.proto - -package stream - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request) Reset() { - *x = Request{} - if protoimpl.UnsafeEnabled { - mi := &file_stream_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request) ProtoMessage() {} - -func (x *Request) ProtoReflect() protoreflect.Message { - mi := &file_stream_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request.ProtoReflect.Descriptor instead. -func (*Request) Descriptor() ([]byte, []int) { - return file_stream_proto_rawDescGZIP(), []int{0} -} - -func (x *Request) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The response message containing the greetings -type Reply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *Reply) Reset() { - *x = Reply{} - if protoimpl.UnsafeEnabled { - mi := &file_stream_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply) ProtoMessage() {} - -func (x *Reply) ProtoReflect() protoreflect.Message { - mi := &file_stream_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply.ProtoReflect.Descriptor instead. -func (*Reply) Descriptor() ([]byte, []int) { - return file_stream_proto_rawDescGZIP(), []int{1} -} - -func (x *Reply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -var File_stream_proto protoreflect.FileDescriptor - -var file_stream_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xa3, 0x01, 0x0a, 0x08, 0x47, 0x72, 0x69, - 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x62, 0x69, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x01, 0x30, 0x01, 0x42, 0x37, - 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, - 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_stream_proto_rawDescOnce sync.Once - file_stream_proto_rawDescData = file_stream_proto_rawDesc -) - -func file_stream_proto_rawDescGZIP() []byte { - file_stream_proto_rawDescOnce.Do(func() { - file_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_stream_proto_rawDescData) - }) - return file_stream_proto_rawDescData -} - -var file_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_stream_proto_goTypes = []interface{}{ - (*Request)(nil), // 0: stream.Request - (*Reply)(nil), // 1: stream.Reply -} -var file_stream_proto_depIdxs = []int32{ - 0, // 0: stream.Gripmock.serverStream:input_type -> stream.Request - 0, // 1: stream.Gripmock.clientStream:input_type -> stream.Request - 0, // 2: stream.Gripmock.bidirectional:input_type -> stream.Request - 1, // 3: stream.Gripmock.serverStream:output_type -> stream.Reply - 1, // 4: stream.Gripmock.clientStream:output_type -> stream.Reply - 1, // 5: stream.Gripmock.bidirectional:output_type -> stream.Reply - 3, // [3:6] is the sub-list for method output_type - 0, // [0:3] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_stream_proto_init() } -func file_stream_proto_init() { - if File_stream_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_stream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_stream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_stream_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_stream_proto_goTypes, - DependencyIndexes: file_stream_proto_depIdxs, - MessageInfos: file_stream_proto_msgTypes, - }.Build() - File_stream_proto = out.File - file_stream_proto_rawDesc = nil - file_stream_proto_goTypes = nil - file_stream_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - // server to client sreaming - ServerStream(ctx context.Context, in *Request, opts ...grpc.CallOption) (Gripmock_ServerStreamClient, error) - // client to server streaming - ClientStream(ctx context.Context, opts ...grpc.CallOption) (Gripmock_ClientStreamClient, error) - // bidirectional streaming - Bidirectional(ctx context.Context, opts ...grpc.CallOption) (Gripmock_BidirectionalClient, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) ServerStream(ctx context.Context, in *Request, opts ...grpc.CallOption) (Gripmock_ServerStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Gripmock_serviceDesc.Streams[0], "/stream.Gripmock/serverStream", opts...) - if err != nil { - return nil, err - } - x := &gripmockServerStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Gripmock_ServerStreamClient interface { - Recv() (*Reply, error) - grpc.ClientStream -} - -type gripmockServerStreamClient struct { - grpc.ClientStream -} - -func (x *gripmockServerStreamClient) Recv() (*Reply, error) { - m := new(Reply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *gripmockClient) ClientStream(ctx context.Context, opts ...grpc.CallOption) (Gripmock_ClientStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Gripmock_serviceDesc.Streams[1], "/stream.Gripmock/clientStream", opts...) - if err != nil { - return nil, err - } - x := &gripmockClientStreamClient{stream} - return x, nil -} - -type Gripmock_ClientStreamClient interface { - Send(*Request) error - CloseAndRecv() (*Reply, error) - grpc.ClientStream -} - -type gripmockClientStreamClient struct { - grpc.ClientStream -} - -func (x *gripmockClientStreamClient) Send(m *Request) error { - return x.ClientStream.SendMsg(m) -} - -func (x *gripmockClientStreamClient) CloseAndRecv() (*Reply, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(Reply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *gripmockClient) Bidirectional(ctx context.Context, opts ...grpc.CallOption) (Gripmock_BidirectionalClient, error) { - stream, err := c.cc.NewStream(ctx, &_Gripmock_serviceDesc.Streams[2], "/stream.Gripmock/bidirectional", opts...) - if err != nil { - return nil, err - } - x := &gripmockBidirectionalClient{stream} - return x, nil -} - -type Gripmock_BidirectionalClient interface { - Send(*Request) error - Recv() (*Reply, error) - grpc.ClientStream -} - -type gripmockBidirectionalClient struct { - grpc.ClientStream -} - -func (x *gripmockBidirectionalClient) Send(m *Request) error { - return x.ClientStream.SendMsg(m) -} - -func (x *gripmockBidirectionalClient) Recv() (*Reply, error) { - m := new(Reply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - // server to client sreaming - ServerStream(*Request, Gripmock_ServerStreamServer) error - // client to server streaming - ClientStream(Gripmock_ClientStreamServer) error - // bidirectional streaming - Bidirectional(Gripmock_BidirectionalServer) error -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) ServerStream(*Request, Gripmock_ServerStreamServer) error { - return status.Errorf(codes.Unimplemented, "method ServerStream not implemented") -} -func (*UnimplementedGripmockServer) ClientStream(Gripmock_ClientStreamServer) error { - return status.Errorf(codes.Unimplemented, "method ClientStream not implemented") -} -func (*UnimplementedGripmockServer) Bidirectional(Gripmock_BidirectionalServer) error { - return status.Errorf(codes.Unimplemented, "method Bidirectional not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_ServerStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(Request) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(GripmockServer).ServerStream(m, &gripmockServerStreamServer{stream}) -} - -type Gripmock_ServerStreamServer interface { - Send(*Reply) error - grpc.ServerStream -} - -type gripmockServerStreamServer struct { - grpc.ServerStream -} - -func (x *gripmockServerStreamServer) Send(m *Reply) error { - return x.ServerStream.SendMsg(m) -} - -func _Gripmock_ClientStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(GripmockServer).ClientStream(&gripmockClientStreamServer{stream}) -} - -type Gripmock_ClientStreamServer interface { - SendAndClose(*Reply) error - Recv() (*Request, error) - grpc.ServerStream -} - -type gripmockClientStreamServer struct { - grpc.ServerStream -} - -func (x *gripmockClientStreamServer) SendAndClose(m *Reply) error { - return x.ServerStream.SendMsg(m) -} - -func (x *gripmockClientStreamServer) Recv() (*Request, error) { - m := new(Request) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Gripmock_Bidirectional_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(GripmockServer).Bidirectional(&gripmockBidirectionalServer{stream}) -} - -type Gripmock_BidirectionalServer interface { - Send(*Reply) error - Recv() (*Request, error) - grpc.ServerStream -} - -type gripmockBidirectionalServer struct { - grpc.ServerStream -} - -func (x *gripmockBidirectionalServer) Send(m *Reply) error { - return x.ServerStream.SendMsg(m) -} - -func (x *gripmockBidirectionalServer) Recv() (*Request, error) { - m := new(Request) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "stream.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{ - { - StreamName: "serverStream", - Handler: _Gripmock_ServerStream_Handler, - ServerStreams: true, - }, - { - StreamName: "clientStream", - Handler: _Gripmock_ClientStream_Handler, - ClientStreams: true, - }, - { - StreamName: "bidirectional", - Handler: _Gripmock_Bidirectional_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "stream.proto", -} diff --git a/protogen/example/stub-subfolders/stub-subfolders.pb.go b/protogen/example/stub-subfolders/stub-subfolders.pb.go deleted file mode 100644 index 115c8dd7..00000000 --- a/protogen/example/stub-subfolders/stub-subfolders.pb.go +++ /dev/null @@ -1,312 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: stub-subfolders.proto - -package stub_subfolders - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The request message containing the user's name. -type Request struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Request) Reset() { - *x = Request{} - if protoimpl.UnsafeEnabled { - mi := &file_stub_subfolders_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Request) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Request) ProtoMessage() {} - -func (x *Request) ProtoReflect() protoreflect.Message { - mi := &file_stub_subfolders_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Request.ProtoReflect.Descriptor instead. -func (*Request) Descriptor() ([]byte, []int) { - return file_stub_subfolders_proto_rawDescGZIP(), []int{0} -} - -func (x *Request) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The response message containing the greetings -type Reply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` -} - -func (x *Reply) Reset() { - *x = Reply{} - if protoimpl.UnsafeEnabled { - mi := &file_stub_subfolders_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Reply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Reply) ProtoMessage() {} - -func (x *Reply) ProtoReflect() protoreflect.Message { - mi := &file_stub_subfolders_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Reply.ProtoReflect.Descriptor instead. -func (*Reply) Descriptor() ([]byte, []int) { - return file_stub_subfolders_proto_rawDescGZIP(), []int{1} -} - -func (x *Reply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Reply) GetReturnCode() int32 { - if x != nil { - return x.ReturnCode - } - return 0 -} - -var File_stub_subfolders_proto protoreflect.FileDescriptor - -var file_stub_subfolders_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x73, 0x74, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, - 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x48, 0x0a, 0x08, 0x47, - 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, - 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x66, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, - 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, - 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_stub_subfolders_proto_rawDescOnce sync.Once - file_stub_subfolders_proto_rawDescData = file_stub_subfolders_proto_rawDesc -) - -func file_stub_subfolders_proto_rawDescGZIP() []byte { - file_stub_subfolders_proto_rawDescOnce.Do(func() { - file_stub_subfolders_proto_rawDescData = protoimpl.X.CompressGZIP(file_stub_subfolders_proto_rawDescData) - }) - return file_stub_subfolders_proto_rawDescData -} - -var file_stub_subfolders_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_stub_subfolders_proto_goTypes = []interface{}{ - (*Request)(nil), // 0: stub_subfolders.Request - (*Reply)(nil), // 1: stub_subfolders.Reply -} -var file_stub_subfolders_proto_depIdxs = []int32{ - 0, // 0: stub_subfolders.Gripmock.SayHello:input_type -> stub_subfolders.Request - 1, // 1: stub_subfolders.Gripmock.SayHello:output_type -> stub_subfolders.Reply - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_stub_subfolders_proto_init() } -func file_stub_subfolders_proto_init() { - if File_stub_subfolders_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_stub_subfolders_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_stub_subfolders_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_stub_subfolders_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_stub_subfolders_proto_goTypes, - DependencyIndexes: file_stub_subfolders_proto_depIdxs, - MessageInfos: file_stub_subfolders_proto_msgTypes, - }.Build() - File_stub_subfolders_proto = out.File - file_stub_subfolders_proto_rawDesc = nil - file_stub_subfolders_proto_goTypes = nil - file_stub_subfolders_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - // simple unary method - SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { - out := new(Reply) - err := c.cc.Invoke(ctx, "/stub_subfolders.Gripmock/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - // simple unary method - SayHello(context.Context, *Request) (*Reply, error) -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Request) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GripmockServer).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/stub_subfolders.Gripmock/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GripmockServer).SayHello(ctx, req.(*Request)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "stub_subfolders.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Gripmock_SayHello_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "stub-subfolders.proto", -} diff --git a/protogen/example/well_known_types/wkt.pb.go b/protogen/example/well_known_types/wkt.pb.go deleted file mode 100644 index 6a1652ac..00000000 --- a/protogen/example/well_known_types/wkt.pb.go +++ /dev/null @@ -1,170 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.17.3 -// source: wkt.proto - -package well_known_types - -import ( - context "context" - api "google.golang.org/genproto/protobuf/api" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - empty "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -var File_wkt_proto protoreflect.FileDescriptor - -var file_wkt_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x77, 0x6b, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x77, 0x65, 0x6c, - 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x70, 0x69, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x43, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, - 0x6b, 0x12, 0x37, 0x0a, 0x07, 0x41, 0x70, 0x69, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x70, 0x69, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, - 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x77, 0x65, 0x6c, - 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_wkt_proto_goTypes = []interface{}{ - (*empty.Empty)(nil), // 0: google.protobuf.Empty - (*api.Api)(nil), // 1: google.protobuf.Api -} -var file_wkt_proto_depIdxs = []int32{ - 0, // 0: well_known_types.Gripmock.ApiInfo:input_type -> google.protobuf.Empty - 1, // 1: well_known_types.Gripmock.ApiInfo:output_type -> google.protobuf.Api - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_wkt_proto_init() } -func file_wkt_proto_init() { - if File_wkt_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_wkt_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_wkt_proto_goTypes, - DependencyIndexes: file_wkt_proto_depIdxs, - }.Build() - File_wkt_proto = out.File - file_wkt_proto_rawDesc = nil - file_wkt_proto_goTypes = nil - file_wkt_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GripmockClient is the client API for Gripmock service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GripmockClient interface { - // this shows us example on using WKT as dependency - // api.proto in particular has go_package alias with semicolon - // "google.golang.org/genproto/protobuf/api;api" - ApiInfo(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*api.Api, error) -} - -type gripmockClient struct { - cc grpc.ClientConnInterface -} - -func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { - return &gripmockClient{cc} -} - -func (c *gripmockClient) ApiInfo(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*api.Api, error) { - out := new(api.Api) - err := c.cc.Invoke(ctx, "/well_known_types.Gripmock/ApiInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GripmockServer is the server API for Gripmock service. -type GripmockServer interface { - // this shows us example on using WKT as dependency - // api.proto in particular has go_package alias with semicolon - // "google.golang.org/genproto/protobuf/api;api" - ApiInfo(context.Context, *empty.Empty) (*api.Api, error) -} - -// UnimplementedGripmockServer can be embedded to have forward compatible implementations. -type UnimplementedGripmockServer struct { -} - -func (*UnimplementedGripmockServer) ApiInfo(context.Context, *empty.Empty) (*api.Api, error) { - return nil, status.Errorf(codes.Unimplemented, "method ApiInfo not implemented") -} - -func RegisterGripmockServer(s *grpc.Server, srv GripmockServer) { - s.RegisterService(&_Gripmock_serviceDesc, srv) -} - -func _Gripmock_ApiInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GripmockServer).ApiInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/well_known_types.Gripmock/ApiInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GripmockServer).ApiInfo(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -var _Gripmock_serviceDesc = grpc.ServiceDesc{ - ServiceName: "well_known_types.Gripmock", - HandlerType: (*GripmockServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ApiInfo", - Handler: _Gripmock_ApiInfo_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "wkt.proto", -} From 95a1a09e14b11a966825b9c241c405f32dd90aeb Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 20:58:16 +0300 Subject: [PATCH 09/74] light build --- Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 66d28e0c..ebd39c10 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,10 +24,6 @@ WORKDIR /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock # install generator plugin RUN go install -v -WORKDIR /go/src/github.com/tokopedia/gripmock/example/simple/client - -RUN go get -u all - WORKDIR /go/src/github.com/tokopedia/gripmock # install gripmock & build example to cache necessary imports From f8b1627f13499f3e3fb1708817f39b433fb80da5 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 21:11:05 +0300 Subject: [PATCH 10/74] optimize --- depends.go | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 depends.go diff --git a/depends.go b/depends.go new file mode 100644 index 00000000..6d47e0e1 --- /dev/null +++ b/depends.go @@ -0,0 +1,9 @@ +package main + +import ( + _ "google.golang.org/grpc" + _ "google.golang.org/grpc/codes" + _ "google.golang.org/grpc/status" + _ "google.golang.org/protobuf/reflect/protoreflect" + _ "google.golang.org/protobuf/runtime/protoimpl" +) From 861ebf8a5cff48426acfb90571f66e9d7302cc55 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 21:18:13 +0300 Subject: [PATCH 11/74] minify --- Dockerfile | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index ebd39c10..6419a4b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,13 +5,15 @@ FROM golang:${BUILD_ARG_GO_VERSION}-alpine${BUILD_ARG_ALPINE_VERSION} AS builder # install tools (bash, git, protobuf, protoc-gen-go, protoc-grn-go-grpc) RUN apk -U --no-cache add bash git protobuf &&\ go install -v google.golang.org/protobuf/cmd/protoc-gen-go@latest &&\ - go install -v google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest - -# cloning well-known-types -# only use needed files -RUN git clone --depth=1 https://github.com/protocolbuffers/protobuf.git /protobuf-repo &&\ + go install -v google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest &&\ + # cloning well-known-types + # only use needed files + git clone --depth=1 https://github.com/protocolbuffers/protobuf.git /protobuf-repo &&\ mv /protobuf-repo/src/ /protobuf/ &&\ - rm -rf /protobuf-repo + rm -rf /protobuf-repo &&\ + # cleanup + apk del git &&\ + apk -v cache clean COPY . /go/src/github.com/tokopedia/gripmock @@ -19,18 +21,10 @@ COPY . /go/src/github.com/tokopedia/gripmock RUN mkdir /proto /stubs &&\ ln -s /go/src/github.com/tokopedia/gripmock/fix_gopackage.sh /bin/ -WORKDIR /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock - -# install generator plugin -RUN go install -v - -WORKDIR /go/src/github.com/tokopedia/gripmock - -# install gripmock & build example to cache necessary imports -RUN go install -v - -# remove pkgs -RUN apk del git && apk -v cache clean +RUN cd /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock &&\ + go install -v &&\ + cd /go/src/github.com/tokopedia/gripmock &&\ + go install -v EXPOSE 4770 4771 From 00fab87fb44b61ad03e7a9f17fa02017c56c9884 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 21:57:46 +0300 Subject: [PATCH 12/74] fix --- protoc-gen-gripmock/generator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protoc-gen-gripmock/generator.go b/protoc-gen-gripmock/generator.go index 634a5128..bc906c06 100644 --- a/protoc-gen-gripmock/generator.go +++ b/protoc-gen-gripmock/generator.go @@ -203,7 +203,7 @@ func getGoPackage(proto *descriptor.FileDescriptorProto) (alias string, goPackag } // support go_package alias declaration - // https://google.golang.org/protobuf/issues/139 + // https://github.com/golang/protobuf/issues/139 if splits := strings.Split(goPackage, ";"); len(splits) > 1 { goPackage = splits[0] alias = splits[1] From 36ae1bb9f2249b628b7fd264f1fce2ace163626d Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 22:08:34 +0300 Subject: [PATCH 13/74] add *.pb.go --- Dockerfile | 2 + protogen/example/multi-files/file1.pb.go | 225 ++++++++++ protogen/example/multi-files/file2.pb.go | 225 ++++++++++ protogen/example/multi-package/bar/bar.pb.go | 144 +++++++ protogen/example/multi-package/foo.pb.go | 147 +++++++ protogen/example/multi-package/hello.pb.go | 76 ++++ protogen/example/one-of/oneof.pb.go | 393 ++++++++++++++++++ protogen/example/simple/simple.pb.go | 224 ++++++++++ protogen/example/stream/stream.pb.go | 224 ++++++++++ .../stub-subfolders/stub-subfolders.pb.go | 226 ++++++++++ protogen/example/well_known_types/wkt.pb.go | 80 ++++ 11 files changed, 1966 insertions(+) create mode 100644 protogen/example/multi-files/file1.pb.go create mode 100644 protogen/example/multi-files/file2.pb.go create mode 100644 protogen/example/multi-package/bar/bar.pb.go create mode 100644 protogen/example/multi-package/foo.pb.go create mode 100644 protogen/example/multi-package/hello.pb.go create mode 100644 protogen/example/one-of/oneof.pb.go create mode 100644 protogen/example/simple/simple.pb.go create mode 100644 protogen/example/stream/stream.pb.go create mode 100644 protogen/example/stub-subfolders/stub-subfolders.pb.go create mode 100644 protogen/example/well_known_types/wkt.pb.go diff --git a/Dockerfile b/Dockerfile index 6419a4b0..cb34d58e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,6 +23,8 @@ RUN mkdir /proto /stubs &&\ RUN cd /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock &&\ go install -v &&\ + cd /go/src/github.com/tokopedia/gripmock/example/simple/client &&\ + go get -u all &&\ cd /go/src/github.com/tokopedia/gripmock &&\ go install -v diff --git a/protogen/example/multi-files/file1.pb.go b/protogen/example/multi-files/file1.pb.go new file mode 100644 index 00000000..ea8431f5 --- /dev/null +++ b/protogen/example/multi-files/file1.pb.go @@ -0,0 +1,225 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: file1.proto + +package multi_files + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request1 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request1) Reset() { + *x = Request1{} + if protoimpl.UnsafeEnabled { + mi := &file_file1_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request1) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request1) ProtoMessage() {} + +func (x *Request1) ProtoReflect() protoreflect.Message { + mi := &file_file1_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request1.ProtoReflect.Descriptor instead. +func (*Request1) Descriptor() ([]byte, []int) { + return file_file1_proto_rawDescGZIP(), []int{0} +} + +func (x *Request1) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The response message containing the greetings +type Reply1 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` +} + +func (x *Reply1) Reset() { + *x = Reply1{} + if protoimpl.UnsafeEnabled { + mi := &file_file1_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply1) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply1) ProtoMessage() {} + +func (x *Reply1) ProtoReflect() protoreflect.Message { + mi := &file_file1_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply1.ProtoReflect.Descriptor instead. +func (*Reply1) Descriptor() ([]byte, []int) { + return file_file1_proto_rawDescGZIP(), []int{1} +} + +func (x *Reply1) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Reply1) GetReturnCode() int32 { + if x != nil { + return x.ReturnCode + } + return 0 +} + +var File_file1_proto protoreflect.FileDescriptor + +var file_file1_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x08, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x41, + 0x0a, 0x09, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x31, 0x12, 0x34, 0x0a, 0x08, 0x53, + 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x31, 0x1a, 0x12, 0x2e, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x31, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, + 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_file1_proto_rawDescOnce sync.Once + file_file1_proto_rawDescData = file_file1_proto_rawDesc +) + +func file_file1_proto_rawDescGZIP() []byte { + file_file1_proto_rawDescOnce.Do(func() { + file_file1_proto_rawDescData = protoimpl.X.CompressGZIP(file_file1_proto_rawDescData) + }) + return file_file1_proto_rawDescData +} + +var file_file1_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_file1_proto_goTypes = []interface{}{ + (*Request1)(nil), // 0: multifiles.Request1 + (*Reply1)(nil), // 1: multifiles.Reply1 +} +var file_file1_proto_depIdxs = []int32{ + 0, // 0: multifiles.Gripmock1.SayHello:input_type -> multifiles.Request1 + 1, // 1: multifiles.Gripmock1.SayHello:output_type -> multifiles.Reply1 + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_file1_proto_init() } +func file_file1_proto_init() { + if File_file1_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_file1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_file1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_file1_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_file1_proto_goTypes, + DependencyIndexes: file_file1_proto_depIdxs, + MessageInfos: file_file1_proto_msgTypes, + }.Build() + File_file1_proto = out.File + file_file1_proto_rawDesc = nil + file_file1_proto_goTypes = nil + file_file1_proto_depIdxs = nil +} diff --git a/protogen/example/multi-files/file2.pb.go b/protogen/example/multi-files/file2.pb.go new file mode 100644 index 00000000..a0cb8e3a --- /dev/null +++ b/protogen/example/multi-files/file2.pb.go @@ -0,0 +1,225 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: file2.proto + +package multi_files + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request2) Reset() { + *x = Request2{} + if protoimpl.UnsafeEnabled { + mi := &file_file2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request2) ProtoMessage() {} + +func (x *Request2) ProtoReflect() protoreflect.Message { + mi := &file_file2_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request2.ProtoReflect.Descriptor instead. +func (*Request2) Descriptor() ([]byte, []int) { + return file_file2_proto_rawDescGZIP(), []int{0} +} + +func (x *Request2) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The response message containing the greetings +type Reply2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` +} + +func (x *Reply2) Reset() { + *x = Reply2{} + if protoimpl.UnsafeEnabled { + mi := &file_file2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply2) ProtoMessage() {} + +func (x *Reply2) ProtoReflect() protoreflect.Message { + mi := &file_file2_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply2.ProtoReflect.Descriptor instead. +func (*Reply2) Descriptor() ([]byte, []int) { + return file_file2_proto_rawDescGZIP(), []int{1} +} + +func (x *Reply2) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Reply2) GetReturnCode() int32 { + if x != nil { + return x.ReturnCode + } + return 0 +} + +var File_file2_proto protoreflect.FileDescriptor + +var file_file2_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x08, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x32, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x41, + 0x0a, 0x09, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x32, 0x12, 0x34, 0x0a, 0x08, 0x53, + 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x1a, 0x12, 0x2e, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x32, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, + 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_file2_proto_rawDescOnce sync.Once + file_file2_proto_rawDescData = file_file2_proto_rawDesc +) + +func file_file2_proto_rawDescGZIP() []byte { + file_file2_proto_rawDescOnce.Do(func() { + file_file2_proto_rawDescData = protoimpl.X.CompressGZIP(file_file2_proto_rawDescData) + }) + return file_file2_proto_rawDescData +} + +var file_file2_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_file2_proto_goTypes = []interface{}{ + (*Request2)(nil), // 0: multifiles.Request2 + (*Reply2)(nil), // 1: multifiles.Reply2 +} +var file_file2_proto_depIdxs = []int32{ + 0, // 0: multifiles.Gripmock2.SayHello:input_type -> multifiles.Request2 + 1, // 1: multifiles.Gripmock2.SayHello:output_type -> multifiles.Reply2 + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_file2_proto_init() } +func file_file2_proto_init() { + if File_file2_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_file2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_file2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_file2_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_file2_proto_goTypes, + DependencyIndexes: file_file2_proto_depIdxs, + MessageInfos: file_file2_proto_msgTypes, + }.Build() + File_file2_proto = out.File + file_file2_proto_rawDesc = nil + file_file2_proto_goTypes = nil + file_file2_proto_depIdxs = nil +} diff --git a/protogen/example/multi-package/bar/bar.pb.go b/protogen/example/multi-package/bar/bar.pb.go new file mode 100644 index 00000000..c81ad4af --- /dev/null +++ b/protogen/example/multi-package/bar/bar.pb.go @@ -0,0 +1,144 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: bar.proto + +package bar + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Bar struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Bar) Reset() { + *x = Bar{} + if protoimpl.UnsafeEnabled { + mi := &file_bar_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Bar) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Bar) ProtoMessage() {} + +func (x *Bar) ProtoReflect() protoreflect.Message { + mi := &file_bar_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Bar.ProtoReflect.Descriptor instead. +func (*Bar) Descriptor() ([]byte, []int) { + return file_bar_proto_rawDescGZIP(), []int{0} +} + +func (x *Bar) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_bar_proto protoreflect.FileDescriptor + +var file_bar_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x62, 0x61, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x62, 0x61, 0x72, + 0x22, 0x19, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x42, 0x5a, 0x40, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, + 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x2d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2f, 0x62, 0x61, 0x72, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_bar_proto_rawDescOnce sync.Once + file_bar_proto_rawDescData = file_bar_proto_rawDesc +) + +func file_bar_proto_rawDescGZIP() []byte { + file_bar_proto_rawDescOnce.Do(func() { + file_bar_proto_rawDescData = protoimpl.X.CompressGZIP(file_bar_proto_rawDescData) + }) + return file_bar_proto_rawDescData +} + +var file_bar_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_bar_proto_goTypes = []interface{}{ + (*Bar)(nil), // 0: bar.Bar +} +var file_bar_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_bar_proto_init() } +func file_bar_proto_init() { + if File_bar_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_bar_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bar); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_bar_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_bar_proto_goTypes, + DependencyIndexes: file_bar_proto_depIdxs, + MessageInfos: file_bar_proto_msgTypes, + }.Build() + File_bar_proto = out.File + file_bar_proto_rawDesc = nil + file_bar_proto_goTypes = nil + file_bar_proto_depIdxs = nil +} diff --git a/protogen/example/multi-package/foo.pb.go b/protogen/example/multi-package/foo.pb.go new file mode 100644 index 00000000..2ab1f9d4 --- /dev/null +++ b/protogen/example/multi-package/foo.pb.go @@ -0,0 +1,147 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: foo.proto + +// simulating neighboring .proto file +// but different package + +package multi_package + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Response string `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` +} + +func (x *Response) Reset() { + *x = Response{} + if protoimpl.UnsafeEnabled { + mi := &file_foo_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_foo_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_foo_proto_rawDescGZIP(), []int{0} +} + +func (x *Response) GetResponse() string { + if x != nil { + return x.Response + } + return "" +} + +var File_foo_proto protoreflect.FileDescriptor + +var file_foo_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x66, 0x6f, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x66, 0x6f, 0x6f, + 0x22, 0x26, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, + 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, + 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_foo_proto_rawDescOnce sync.Once + file_foo_proto_rawDescData = file_foo_proto_rawDesc +) + +func file_foo_proto_rawDescGZIP() []byte { + file_foo_proto_rawDescOnce.Do(func() { + file_foo_proto_rawDescData = protoimpl.X.CompressGZIP(file_foo_proto_rawDescData) + }) + return file_foo_proto_rawDescData +} + +var file_foo_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_foo_proto_goTypes = []interface{}{ + (*Response)(nil), // 0: foo.Response +} +var file_foo_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_foo_proto_init() } +func file_foo_proto_init() { + if File_foo_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_foo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_foo_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_foo_proto_goTypes, + DependencyIndexes: file_foo_proto_depIdxs, + MessageInfos: file_foo_proto_msgTypes, + }.Build() + File_foo_proto = out.File + file_foo_proto_rawDesc = nil + file_foo_proto_goTypes = nil + file_foo_proto_depIdxs = nil +} diff --git a/protogen/example/multi-package/hello.pb.go b/protogen/example/multi-package/hello.pb.go new file mode 100644 index 00000000..8b2e4ada --- /dev/null +++ b/protogen/example/multi-package/hello.pb.go @@ -0,0 +1,76 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: hello.proto + +package multi_package + +import ( + bar "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var File_hello_proto protoreflect.FileDescriptor + +var file_hello_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x62, 0x61, + 0x72, 0x2f, 0x62, 0x61, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x66, 0x6f, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2c, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x05, 0x47, 0x72, 0x65, 0x65, 0x74, 0x12, 0x08, 0x2e, 0x62, 0x61, + 0x72, 0x2e, 0x42, 0x61, 0x72, 0x1a, 0x0d, 0x2e, 0x66, 0x6f, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, + 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_hello_proto_goTypes = []interface{}{ + (*bar.Bar)(nil), // 0: bar.Bar + (*Response)(nil), // 1: foo.Response +} +var file_hello_proto_depIdxs = []int32{ + 0, // 0: multi_package.Gripmock.Greet:input_type -> bar.Bar + 1, // 1: multi_package.Gripmock.Greet:output_type -> foo.Response + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_hello_proto_init() } +func file_hello_proto_init() { + if File_hello_proto != nil { + return + } + file_foo_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_hello_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_hello_proto_goTypes, + DependencyIndexes: file_hello_proto_depIdxs, + }.Build() + File_hello_proto = out.File + file_hello_proto_rawDesc = nil + file_hello_proto_goTypes = nil + file_hello_proto_depIdxs = nil +} diff --git a/protogen/example/one-of/oneof.pb.go b/protogen/example/one-of/oneof.pb.go new file mode 100644 index 00000000..ac918802 --- /dev/null +++ b/protogen/example/one-of/oneof.pb.go @@ -0,0 +1,393 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: oneof.proto + +package one_of + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_oneof_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_oneof_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_oneof_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type Reply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to ReplyType: + // + // *Reply_Reply1 + // *Reply_Reply2 + ReplyType isReply_ReplyType `protobuf_oneof:"replyType"` +} + +func (x *Reply) Reset() { + *x = Reply{} + if protoimpl.UnsafeEnabled { + mi := &file_oneof_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply) ProtoMessage() {} + +func (x *Reply) ProtoReflect() protoreflect.Message { + mi := &file_oneof_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply.ProtoReflect.Descriptor instead. +func (*Reply) Descriptor() ([]byte, []int) { + return file_oneof_proto_rawDescGZIP(), []int{1} +} + +func (m *Reply) GetReplyType() isReply_ReplyType { + if m != nil { + return m.ReplyType + } + return nil +} + +func (x *Reply) GetReply1() *Reply1 { + if x, ok := x.GetReplyType().(*Reply_Reply1); ok { + return x.Reply1 + } + return nil +} + +func (x *Reply) GetReply2() *Reply2 { + if x, ok := x.GetReplyType().(*Reply_Reply2); ok { + return x.Reply2 + } + return nil +} + +type isReply_ReplyType interface { + isReply_ReplyType() +} + +type Reply_Reply1 struct { + Reply1 *Reply1 `protobuf:"bytes,1,opt,name=reply1,proto3,oneof"` +} + +type Reply_Reply2 struct { + Reply2 *Reply2 `protobuf:"bytes,2,opt,name=reply2,proto3,oneof"` +} + +func (*Reply_Reply1) isReply_ReplyType() {} + +func (*Reply_Reply2) isReply_ReplyType() {} + +// usual response type +type Reply1 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` +} + +func (x *Reply1) Reset() { + *x = Reply1{} + if protoimpl.UnsafeEnabled { + mi := &file_oneof_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply1) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply1) ProtoMessage() {} + +func (x *Reply1) ProtoReflect() protoreflect.Message { + mi := &file_oneof_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply1.ProtoReflect.Descriptor instead. +func (*Reply1) Descriptor() ([]byte, []int) { + return file_oneof_proto_rawDescGZIP(), []int{2} +} + +func (x *Reply1) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Reply1) GetReturnCode() int32 { + if x != nil { + return x.ReturnCode + } + return 0 +} + +// other response type +type Reply2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Other int32 `protobuf:"varint,1,opt,name=other,proto3" json:"other,omitempty"` +} + +func (x *Reply2) Reset() { + *x = Reply2{} + if protoimpl.UnsafeEnabled { + mi := &file_oneof_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply2) ProtoMessage() {} + +func (x *Reply2) ProtoReflect() protoreflect.Message { + mi := &file_oneof_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply2.ProtoReflect.Descriptor instead. +func (*Reply2) Descriptor() ([]byte, []int) { + return file_oneof_proto_rawDescGZIP(), []int{3} +} + +func (x *Reply2) GetOther() int32 { + if x != nil { + return x.Other + } + return 0 +} + +var File_oneof_proto protoreflect.FileDescriptor + +var file_oneof_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x06, + 0x72, 0x65, 0x70, 0x6c, 0x79, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x31, 0x48, 0x00, 0x52, 0x06, 0x72, + 0x65, 0x70, 0x6c, 0x79, 0x31, 0x12, 0x27, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x32, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x42, 0x0b, + 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0x43, 0x0a, 0x06, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, + 0x22, 0x1e, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x32, 0x34, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x0a, 0x08, + 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x0e, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, + 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, + 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, + 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x6e, 0x65, 0x2d, 0x6f, 0x66, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_oneof_proto_rawDescOnce sync.Once + file_oneof_proto_rawDescData = file_oneof_proto_rawDesc +) + +func file_oneof_proto_rawDescGZIP() []byte { + file_oneof_proto_rawDescOnce.Do(func() { + file_oneof_proto_rawDescData = protoimpl.X.CompressGZIP(file_oneof_proto_rawDescData) + }) + return file_oneof_proto_rawDescData +} + +var file_oneof_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_oneof_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: oneof.Request + (*Reply)(nil), // 1: oneof.Reply + (*Reply1)(nil), // 2: oneof.Reply1 + (*Reply2)(nil), // 3: oneof.Reply2 +} +var file_oneof_proto_depIdxs = []int32{ + 2, // 0: oneof.Reply.reply1:type_name -> oneof.Reply1 + 3, // 1: oneof.Reply.reply2:type_name -> oneof.Reply2 + 0, // 2: oneof.Gripmock.SayHello:input_type -> oneof.Request + 1, // 3: oneof.Gripmock.SayHello:output_type -> oneof.Reply + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_oneof_proto_init() } +func file_oneof_proto_init() { + if File_oneof_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_oneof_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oneof_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oneof_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oneof_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_oneof_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*Reply_Reply1)(nil), + (*Reply_Reply2)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_oneof_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_oneof_proto_goTypes, + DependencyIndexes: file_oneof_proto_depIdxs, + MessageInfos: file_oneof_proto_msgTypes, + }.Build() + File_oneof_proto = out.File + file_oneof_proto_rawDesc = nil + file_oneof_proto_goTypes = nil + file_oneof_proto_depIdxs = nil +} diff --git a/protogen/example/simple/simple.pb.go b/protogen/example/simple/simple.pb.go new file mode 100644 index 00000000..14d677b0 --- /dev/null +++ b/protogen/example/simple/simple.pb.go @@ -0,0 +1,224 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: simple.proto + +package simple + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_simple_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_simple_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_simple_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The response message containing the greetings +type Reply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` +} + +func (x *Reply) Reset() { + *x = Reply{} + if protoimpl.UnsafeEnabled { + mi := &file_simple_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply) ProtoMessage() {} + +func (x *Reply) ProtoReflect() protoreflect.Message { + mi := &file_simple_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply.ProtoReflect.Descriptor instead. +func (*Reply) Descriptor() ([]byte, []int) { + return file_simple_proto_rawDescGZIP(), []int{1} +} + +func (x *Reply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Reply) GetReturnCode() int32 { + if x != nil { + return x.ReturnCode + } + return 0 +} + +var File_simple_proto protoreflect.FileDescriptor + +var file_simple_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, + 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x36, 0x0a, 0x08, 0x47, 0x72, 0x69, + 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x12, 0x0f, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, + 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_simple_proto_rawDescOnce sync.Once + file_simple_proto_rawDescData = file_simple_proto_rawDesc +) + +func file_simple_proto_rawDescGZIP() []byte { + file_simple_proto_rawDescOnce.Do(func() { + file_simple_proto_rawDescData = protoimpl.X.CompressGZIP(file_simple_proto_rawDescData) + }) + return file_simple_proto_rawDescData +} + +var file_simple_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_simple_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: simple.Request + (*Reply)(nil), // 1: simple.Reply +} +var file_simple_proto_depIdxs = []int32{ + 0, // 0: simple.Gripmock.SayHello:input_type -> simple.Request + 1, // 1: simple.Gripmock.SayHello:output_type -> simple.Reply + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_simple_proto_init() } +func file_simple_proto_init() { + if File_simple_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_simple_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_simple_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_simple_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_simple_proto_goTypes, + DependencyIndexes: file_simple_proto_depIdxs, + MessageInfos: file_simple_proto_msgTypes, + }.Build() + File_simple_proto = out.File + file_simple_proto_rawDesc = nil + file_simple_proto_goTypes = nil + file_simple_proto_depIdxs = nil +} diff --git a/protogen/example/stream/stream.pb.go b/protogen/example/stream/stream.pb.go new file mode 100644 index 00000000..122449f9 --- /dev/null +++ b/protogen/example/stream/stream.pb.go @@ -0,0 +1,224 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: stream.proto + +package stream + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_stream_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_stream_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_stream_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The response message containing the greetings +type Reply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *Reply) Reset() { + *x = Reply{} + if protoimpl.UnsafeEnabled { + mi := &file_stream_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply) ProtoMessage() {} + +func (x *Reply) ProtoReflect() protoreflect.Message { + mi := &file_stream_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply.ProtoReflect.Descriptor instead. +func (*Reply) Descriptor() ([]byte, []int) { + return file_stream_proto_rawDescGZIP(), []int{1} +} + +func (x *Reply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +var File_stream_proto protoreflect.FileDescriptor + +var file_stream_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xa3, 0x01, 0x0a, 0x08, 0x47, 0x72, 0x69, + 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x62, 0x69, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x0f, 0x2e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x28, 0x01, 0x30, 0x01, 0x42, 0x37, + 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, + 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_stream_proto_rawDescOnce sync.Once + file_stream_proto_rawDescData = file_stream_proto_rawDesc +) + +func file_stream_proto_rawDescGZIP() []byte { + file_stream_proto_rawDescOnce.Do(func() { + file_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_stream_proto_rawDescData) + }) + return file_stream_proto_rawDescData +} + +var file_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_stream_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: stream.Request + (*Reply)(nil), // 1: stream.Reply +} +var file_stream_proto_depIdxs = []int32{ + 0, // 0: stream.Gripmock.serverStream:input_type -> stream.Request + 0, // 1: stream.Gripmock.clientStream:input_type -> stream.Request + 0, // 2: stream.Gripmock.bidirectional:input_type -> stream.Request + 1, // 3: stream.Gripmock.serverStream:output_type -> stream.Reply + 1, // 4: stream.Gripmock.clientStream:output_type -> stream.Reply + 1, // 5: stream.Gripmock.bidirectional:output_type -> stream.Reply + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_stream_proto_init() } +func file_stream_proto_init() { + if File_stream_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_stream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_stream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_stream_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_stream_proto_goTypes, + DependencyIndexes: file_stream_proto_depIdxs, + MessageInfos: file_stream_proto_msgTypes, + }.Build() + File_stream_proto = out.File + file_stream_proto_rawDesc = nil + file_stream_proto_goTypes = nil + file_stream_proto_depIdxs = nil +} diff --git a/protogen/example/stub-subfolders/stub-subfolders.pb.go b/protogen/example/stub-subfolders/stub-subfolders.pb.go new file mode 100644 index 00000000..fc51ca8e --- /dev/null +++ b/protogen/example/stub-subfolders/stub-subfolders.pb.go @@ -0,0 +1,226 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: stub-subfolders.proto + +package stub_subfolders + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The request message containing the user's name. +type Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_stub_subfolders_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_stub_subfolders_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_stub_subfolders_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The response message containing the greetings +type Reply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + ReturnCode int32 `protobuf:"varint,2,opt,name=return_code,json=returnCode,proto3" json:"return_code,omitempty"` +} + +func (x *Reply) Reset() { + *x = Reply{} + if protoimpl.UnsafeEnabled { + mi := &file_stub_subfolders_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reply) ProtoMessage() {} + +func (x *Reply) ProtoReflect() protoreflect.Message { + mi := &file_stub_subfolders_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reply.ProtoReflect.Descriptor instead. +func (*Reply) Descriptor() ([]byte, []int) { + return file_stub_subfolders_proto_rawDescGZIP(), []int{1} +} + +func (x *Reply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Reply) GetReturnCode() int32 { + if x != nil { + return x.ReturnCode + } + return 0 +} + +var File_stub_subfolders_proto protoreflect.FileDescriptor + +var file_stub_subfolders_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x73, 0x74, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, + 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x48, 0x0a, 0x08, 0x47, + 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, + 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x2e, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, + 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x2d, 0x73, 0x75, 0x62, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_stub_subfolders_proto_rawDescOnce sync.Once + file_stub_subfolders_proto_rawDescData = file_stub_subfolders_proto_rawDesc +) + +func file_stub_subfolders_proto_rawDescGZIP() []byte { + file_stub_subfolders_proto_rawDescOnce.Do(func() { + file_stub_subfolders_proto_rawDescData = protoimpl.X.CompressGZIP(file_stub_subfolders_proto_rawDescData) + }) + return file_stub_subfolders_proto_rawDescData +} + +var file_stub_subfolders_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_stub_subfolders_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: stub_subfolders.Request + (*Reply)(nil), // 1: stub_subfolders.Reply +} +var file_stub_subfolders_proto_depIdxs = []int32{ + 0, // 0: stub_subfolders.Gripmock.SayHello:input_type -> stub_subfolders.Request + 1, // 1: stub_subfolders.Gripmock.SayHello:output_type -> stub_subfolders.Reply + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_stub_subfolders_proto_init() } +func file_stub_subfolders_proto_init() { + if File_stub_subfolders_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_stub_subfolders_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_stub_subfolders_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_stub_subfolders_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_stub_subfolders_proto_goTypes, + DependencyIndexes: file_stub_subfolders_proto_depIdxs, + MessageInfos: file_stub_subfolders_proto_msgTypes, + }.Build() + File_stub_subfolders_proto = out.File + file_stub_subfolders_proto_rawDesc = nil + file_stub_subfolders_proto_goTypes = nil + file_stub_subfolders_proto_depIdxs = nil +} diff --git a/protogen/example/well_known_types/wkt.pb.go b/protogen/example/well_known_types/wkt.pb.go new file mode 100644 index 00000000..14f64d48 --- /dev/null +++ b/protogen/example/well_known_types/wkt.pb.go @@ -0,0 +1,80 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.23.4 +// source: wkt.proto + +package well_known_types + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + apipb "google.golang.org/protobuf/types/known/apipb" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var File_wkt_proto protoreflect.FileDescriptor + +var file_wkt_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x77, 0x6b, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x77, 0x65, 0x6c, + 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x1b, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x70, 0x69, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x43, 0x0a, 0x08, 0x47, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, + 0x6b, 0x12, 0x37, 0x0a, 0x07, 0x41, 0x70, 0x69, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x70, 0x69, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, + 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x77, 0x65, 0x6c, + 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_wkt_proto_goTypes = []interface{}{ + (*emptypb.Empty)(nil), // 0: google.protobuf.Empty + (*apipb.Api)(nil), // 1: google.protobuf.Api +} +var file_wkt_proto_depIdxs = []int32{ + 0, // 0: well_known_types.Gripmock.ApiInfo:input_type -> google.protobuf.Empty + 1, // 1: well_known_types.Gripmock.ApiInfo:output_type -> google.protobuf.Api + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_wkt_proto_init() } +func file_wkt_proto_init() { + if File_wkt_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_wkt_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_wkt_proto_goTypes, + DependencyIndexes: file_wkt_proto_depIdxs, + }.Build() + File_wkt_proto = out.File + file_wkt_proto_rawDesc = nil + file_wkt_proto_goTypes = nil + file_wkt_proto_depIdxs = nil +} From 0592783ccef13ae0f96d9a7094cf71a92b10bb03 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 22:16:37 +0300 Subject: [PATCH 14/74] update protobuf-files --- depends.go | 1 + go.mod | 2 +- go.sum | 2 - protogen/example/multi-files/file1_grpc.pb.go | 111 +++++++ protogen/example/multi-files/file2_grpc.pb.go | 111 +++++++ .../example/multi-package/hello_grpc.pb.go | 110 +++++++ protogen/example/one-of/oneof_grpc.pb.go | 111 +++++++ protogen/example/simple/simple_grpc.pb.go | 111 +++++++ protogen/example/stream/stream_grpc.pb.go | 282 ++++++++++++++++++ .../stub-subfolders_grpc.pb.go | 111 +++++++ .../example/well_known_types/wkt_grpc.pb.go | 117 ++++++++ 11 files changed, 1066 insertions(+), 3 deletions(-) create mode 100644 protogen/example/multi-files/file1_grpc.pb.go create mode 100644 protogen/example/multi-files/file2_grpc.pb.go create mode 100644 protogen/example/multi-package/hello_grpc.pb.go create mode 100644 protogen/example/one-of/oneof_grpc.pb.go create mode 100644 protogen/example/simple/simple_grpc.pb.go create mode 100644 protogen/example/stream/stream_grpc.pb.go create mode 100644 protogen/example/stub-subfolders/stub-subfolders_grpc.pb.go create mode 100644 protogen/example/well_known_types/wkt_grpc.pb.go diff --git a/depends.go b/depends.go index 6d47e0e1..5866061c 100644 --- a/depends.go +++ b/depends.go @@ -1,6 +1,7 @@ package main import ( + _ "github.com/tokopedia/gripmock/protogen" _ "google.golang.org/grpc" _ "google.golang.org/grpc/codes" _ "google.golang.org/grpc/status" diff --git a/go.mod b/go.mod index 674e3d0d..10ddc9aa 100644 --- a/go.mod +++ b/go.mod @@ -17,9 +17,9 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/kr/pretty v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/tokopedia/gripmock/protogen v0.0.0 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.11.0 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 7bf6fd36..49185126 100644 --- a/go.sum +++ b/go.sum @@ -57,8 +57,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= diff --git a/protogen/example/multi-files/file1_grpc.pb.go b/protogen/example/multi-files/file1_grpc.pb.go new file mode 100644 index 00000000..faa71d0f --- /dev/null +++ b/protogen/example/multi-files/file1_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: file1.proto + +package multi_files + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock1_SayHello_FullMethodName = "/multifiles.Gripmock1/SayHello" +) + +// Gripmock1Client is the client API for Gripmock1 service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type Gripmock1Client interface { + // simple unary method + SayHello(ctx context.Context, in *Request1, opts ...grpc.CallOption) (*Reply1, error) +} + +type gripmock1Client struct { + cc grpc.ClientConnInterface +} + +func NewGripmock1Client(cc grpc.ClientConnInterface) Gripmock1Client { + return &gripmock1Client{cc} +} + +func (c *gripmock1Client) SayHello(ctx context.Context, in *Request1, opts ...grpc.CallOption) (*Reply1, error) { + out := new(Reply1) + err := c.cc.Invoke(ctx, Gripmock1_SayHello_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Gripmock1Server is the server API for Gripmock1 service. +// All implementations must embed UnimplementedGripmock1Server +// for forward compatibility +type Gripmock1Server interface { + // simple unary method + SayHello(context.Context, *Request1) (*Reply1, error) + mustEmbedUnimplementedGripmock1Server() +} + +// UnimplementedGripmock1Server must be embedded to have forward compatible implementations. +type UnimplementedGripmock1Server struct { +} + +func (UnimplementedGripmock1Server) SayHello(context.Context, *Request1) (*Reply1, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedGripmock1Server) mustEmbedUnimplementedGripmock1Server() {} + +// UnsafeGripmock1Server may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to Gripmock1Server will +// result in compilation errors. +type UnsafeGripmock1Server interface { + mustEmbedUnimplementedGripmock1Server() +} + +func RegisterGripmock1Server(s grpc.ServiceRegistrar, srv Gripmock1Server) { + s.RegisterService(&Gripmock1_ServiceDesc, srv) +} + +func _Gripmock1_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request1) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(Gripmock1Server).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock1_SayHello_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(Gripmock1Server).SayHello(ctx, req.(*Request1)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock1_ServiceDesc is the grpc.ServiceDesc for Gripmock1 service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock1_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "multifiles.Gripmock1", + HandlerType: (*Gripmock1Server)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Gripmock1_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "file1.proto", +} diff --git a/protogen/example/multi-files/file2_grpc.pb.go b/protogen/example/multi-files/file2_grpc.pb.go new file mode 100644 index 00000000..8091c5ea --- /dev/null +++ b/protogen/example/multi-files/file2_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: file2.proto + +package multi_files + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock2_SayHello_FullMethodName = "/multifiles.Gripmock2/SayHello" +) + +// Gripmock2Client is the client API for Gripmock2 service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type Gripmock2Client interface { + // simple unary method + SayHello(ctx context.Context, in *Request2, opts ...grpc.CallOption) (*Reply2, error) +} + +type gripmock2Client struct { + cc grpc.ClientConnInterface +} + +func NewGripmock2Client(cc grpc.ClientConnInterface) Gripmock2Client { + return &gripmock2Client{cc} +} + +func (c *gripmock2Client) SayHello(ctx context.Context, in *Request2, opts ...grpc.CallOption) (*Reply2, error) { + out := new(Reply2) + err := c.cc.Invoke(ctx, Gripmock2_SayHello_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Gripmock2Server is the server API for Gripmock2 service. +// All implementations must embed UnimplementedGripmock2Server +// for forward compatibility +type Gripmock2Server interface { + // simple unary method + SayHello(context.Context, *Request2) (*Reply2, error) + mustEmbedUnimplementedGripmock2Server() +} + +// UnimplementedGripmock2Server must be embedded to have forward compatible implementations. +type UnimplementedGripmock2Server struct { +} + +func (UnimplementedGripmock2Server) SayHello(context.Context, *Request2) (*Reply2, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedGripmock2Server) mustEmbedUnimplementedGripmock2Server() {} + +// UnsafeGripmock2Server may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to Gripmock2Server will +// result in compilation errors. +type UnsafeGripmock2Server interface { + mustEmbedUnimplementedGripmock2Server() +} + +func RegisterGripmock2Server(s grpc.ServiceRegistrar, srv Gripmock2Server) { + s.RegisterService(&Gripmock2_ServiceDesc, srv) +} + +func _Gripmock2_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(Gripmock2Server).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock2_SayHello_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(Gripmock2Server).SayHello(ctx, req.(*Request2)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock2_ServiceDesc is the grpc.ServiceDesc for Gripmock2 service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock2_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "multifiles.Gripmock2", + HandlerType: (*Gripmock2Server)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Gripmock2_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "file2.proto", +} diff --git a/protogen/example/multi-package/hello_grpc.pb.go b/protogen/example/multi-package/hello_grpc.pb.go new file mode 100644 index 00000000..a9923721 --- /dev/null +++ b/protogen/example/multi-package/hello_grpc.pb.go @@ -0,0 +1,110 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: hello.proto + +package multi_package + +import ( + context "context" + bar "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_Greet_FullMethodName = "/multi_package.Gripmock/Greet" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + Greet(ctx context.Context, in *bar.Bar, opts ...grpc.CallOption) (*Response, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) Greet(ctx context.Context, in *bar.Bar, opts ...grpc.CallOption) (*Response, error) { + out := new(Response) + err := c.cc.Invoke(ctx, Gripmock_Greet_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + Greet(context.Context, *bar.Bar) (*Response, error) + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) Greet(context.Context, *bar.Bar) (*Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method Greet not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_Greet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(bar.Bar) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GripmockServer).Greet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock_Greet_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GripmockServer).Greet(ctx, req.(*bar.Bar)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "multi_package.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Greet", + Handler: _Gripmock_Greet_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "hello.proto", +} diff --git a/protogen/example/one-of/oneof_grpc.pb.go b/protogen/example/one-of/oneof_grpc.pb.go new file mode 100644 index 00000000..645dd68d --- /dev/null +++ b/protogen/example/one-of/oneof_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: oneof.proto + +package one_of + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_SayHello_FullMethodName = "/oneof.Gripmock/SayHello" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + // simple unary method + SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { + out := new(Reply) + err := c.cc.Invoke(ctx, Gripmock_SayHello_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + // simple unary method + SayHello(context.Context, *Request) (*Reply, error) + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GripmockServer).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock_SayHello_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GripmockServer).SayHello(ctx, req.(*Request)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "oneof.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Gripmock_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "oneof.proto", +} diff --git a/protogen/example/simple/simple_grpc.pb.go b/protogen/example/simple/simple_grpc.pb.go new file mode 100644 index 00000000..a431f6d4 --- /dev/null +++ b/protogen/example/simple/simple_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: simple.proto + +package simple + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_SayHello_FullMethodName = "/simple.Gripmock/SayHello" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + // simple unary method + SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { + out := new(Reply) + err := c.cc.Invoke(ctx, Gripmock_SayHello_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + // simple unary method + SayHello(context.Context, *Request) (*Reply, error) + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GripmockServer).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock_SayHello_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GripmockServer).SayHello(ctx, req.(*Request)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "simple.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Gripmock_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "simple.proto", +} diff --git a/protogen/example/stream/stream_grpc.pb.go b/protogen/example/stream/stream_grpc.pb.go new file mode 100644 index 00000000..f38eaff7 --- /dev/null +++ b/protogen/example/stream/stream_grpc.pb.go @@ -0,0 +1,282 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: stream.proto + +package stream + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_ServerStream_FullMethodName = "/stream.Gripmock/serverStream" + Gripmock_ClientStream_FullMethodName = "/stream.Gripmock/clientStream" + Gripmock_Bidirectional_FullMethodName = "/stream.Gripmock/bidirectional" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + // server to client sreaming + ServerStream(ctx context.Context, in *Request, opts ...grpc.CallOption) (Gripmock_ServerStreamClient, error) + // client to server streaming + ClientStream(ctx context.Context, opts ...grpc.CallOption) (Gripmock_ClientStreamClient, error) + // bidirectional streaming + Bidirectional(ctx context.Context, opts ...grpc.CallOption) (Gripmock_BidirectionalClient, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) ServerStream(ctx context.Context, in *Request, opts ...grpc.CallOption) (Gripmock_ServerStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &Gripmock_ServiceDesc.Streams[0], Gripmock_ServerStream_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &gripmockServerStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Gripmock_ServerStreamClient interface { + Recv() (*Reply, error) + grpc.ClientStream +} + +type gripmockServerStreamClient struct { + grpc.ClientStream +} + +func (x *gripmockServerStreamClient) Recv() (*Reply, error) { + m := new(Reply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *gripmockClient) ClientStream(ctx context.Context, opts ...grpc.CallOption) (Gripmock_ClientStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &Gripmock_ServiceDesc.Streams[1], Gripmock_ClientStream_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &gripmockClientStreamClient{stream} + return x, nil +} + +type Gripmock_ClientStreamClient interface { + Send(*Request) error + CloseAndRecv() (*Reply, error) + grpc.ClientStream +} + +type gripmockClientStreamClient struct { + grpc.ClientStream +} + +func (x *gripmockClientStreamClient) Send(m *Request) error { + return x.ClientStream.SendMsg(m) +} + +func (x *gripmockClientStreamClient) CloseAndRecv() (*Reply, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(Reply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *gripmockClient) Bidirectional(ctx context.Context, opts ...grpc.CallOption) (Gripmock_BidirectionalClient, error) { + stream, err := c.cc.NewStream(ctx, &Gripmock_ServiceDesc.Streams[2], Gripmock_Bidirectional_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &gripmockBidirectionalClient{stream} + return x, nil +} + +type Gripmock_BidirectionalClient interface { + Send(*Request) error + Recv() (*Reply, error) + grpc.ClientStream +} + +type gripmockBidirectionalClient struct { + grpc.ClientStream +} + +func (x *gripmockBidirectionalClient) Send(m *Request) error { + return x.ClientStream.SendMsg(m) +} + +func (x *gripmockBidirectionalClient) Recv() (*Reply, error) { + m := new(Reply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + // server to client sreaming + ServerStream(*Request, Gripmock_ServerStreamServer) error + // client to server streaming + ClientStream(Gripmock_ClientStreamServer) error + // bidirectional streaming + Bidirectional(Gripmock_BidirectionalServer) error + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) ServerStream(*Request, Gripmock_ServerStreamServer) error { + return status.Errorf(codes.Unimplemented, "method ServerStream not implemented") +} +func (UnimplementedGripmockServer) ClientStream(Gripmock_ClientStreamServer) error { + return status.Errorf(codes.Unimplemented, "method ClientStream not implemented") +} +func (UnimplementedGripmockServer) Bidirectional(Gripmock_BidirectionalServer) error { + return status.Errorf(codes.Unimplemented, "method Bidirectional not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_ServerStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(Request) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(GripmockServer).ServerStream(m, &gripmockServerStreamServer{stream}) +} + +type Gripmock_ServerStreamServer interface { + Send(*Reply) error + grpc.ServerStream +} + +type gripmockServerStreamServer struct { + grpc.ServerStream +} + +func (x *gripmockServerStreamServer) Send(m *Reply) error { + return x.ServerStream.SendMsg(m) +} + +func _Gripmock_ClientStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(GripmockServer).ClientStream(&gripmockClientStreamServer{stream}) +} + +type Gripmock_ClientStreamServer interface { + SendAndClose(*Reply) error + Recv() (*Request, error) + grpc.ServerStream +} + +type gripmockClientStreamServer struct { + grpc.ServerStream +} + +func (x *gripmockClientStreamServer) SendAndClose(m *Reply) error { + return x.ServerStream.SendMsg(m) +} + +func (x *gripmockClientStreamServer) Recv() (*Request, error) { + m := new(Request) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Gripmock_Bidirectional_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(GripmockServer).Bidirectional(&gripmockBidirectionalServer{stream}) +} + +type Gripmock_BidirectionalServer interface { + Send(*Reply) error + Recv() (*Request, error) + grpc.ServerStream +} + +type gripmockBidirectionalServer struct { + grpc.ServerStream +} + +func (x *gripmockBidirectionalServer) Send(m *Reply) error { + return x.ServerStream.SendMsg(m) +} + +func (x *gripmockBidirectionalServer) Recv() (*Request, error) { + m := new(Request) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "stream.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "serverStream", + Handler: _Gripmock_ServerStream_Handler, + ServerStreams: true, + }, + { + StreamName: "clientStream", + Handler: _Gripmock_ClientStream_Handler, + ClientStreams: true, + }, + { + StreamName: "bidirectional", + Handler: _Gripmock_Bidirectional_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "stream.proto", +} diff --git a/protogen/example/stub-subfolders/stub-subfolders_grpc.pb.go b/protogen/example/stub-subfolders/stub-subfolders_grpc.pb.go new file mode 100644 index 00000000..5050a49f --- /dev/null +++ b/protogen/example/stub-subfolders/stub-subfolders_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: stub-subfolders.proto + +package stub_subfolders + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_SayHello_FullMethodName = "/stub_subfolders.Gripmock/SayHello" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + // simple unary method + SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) SayHello(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Reply, error) { + out := new(Reply) + err := c.cc.Invoke(ctx, Gripmock_SayHello_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + // simple unary method + SayHello(context.Context, *Request) (*Reply, error) + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) SayHello(context.Context, *Request) (*Reply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GripmockServer).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock_SayHello_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GripmockServer).SayHello(ctx, req.(*Request)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "stub_subfolders.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Gripmock_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "stub-subfolders.proto", +} diff --git a/protogen/example/well_known_types/wkt_grpc.pb.go b/protogen/example/well_known_types/wkt_grpc.pb.go new file mode 100644 index 00000000..27f11543 --- /dev/null +++ b/protogen/example/well_known_types/wkt_grpc.pb.go @@ -0,0 +1,117 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.23.4 +// source: wkt.proto + +package well_known_types + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + apipb "google.golang.org/protobuf/types/known/apipb" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Gripmock_ApiInfo_FullMethodName = "/well_known_types.Gripmock/ApiInfo" +) + +// GripmockClient is the client API for Gripmock service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GripmockClient interface { + // this shows us example on using WKT as dependency + // api.proto in particular has go_package alias with semicolon + // "google.golang.org/genproto/protobuf/api;api" + ApiInfo(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*apipb.Api, error) +} + +type gripmockClient struct { + cc grpc.ClientConnInterface +} + +func NewGripmockClient(cc grpc.ClientConnInterface) GripmockClient { + return &gripmockClient{cc} +} + +func (c *gripmockClient) ApiInfo(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*apipb.Api, error) { + out := new(apipb.Api) + err := c.cc.Invoke(ctx, Gripmock_ApiInfo_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GripmockServer is the server API for Gripmock service. +// All implementations must embed UnimplementedGripmockServer +// for forward compatibility +type GripmockServer interface { + // this shows us example on using WKT as dependency + // api.proto in particular has go_package alias with semicolon + // "google.golang.org/genproto/protobuf/api;api" + ApiInfo(context.Context, *emptypb.Empty) (*apipb.Api, error) + mustEmbedUnimplementedGripmockServer() +} + +// UnimplementedGripmockServer must be embedded to have forward compatible implementations. +type UnimplementedGripmockServer struct { +} + +func (UnimplementedGripmockServer) ApiInfo(context.Context, *emptypb.Empty) (*apipb.Api, error) { + return nil, status.Errorf(codes.Unimplemented, "method ApiInfo not implemented") +} +func (UnimplementedGripmockServer) mustEmbedUnimplementedGripmockServer() {} + +// UnsafeGripmockServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GripmockServer will +// result in compilation errors. +type UnsafeGripmockServer interface { + mustEmbedUnimplementedGripmockServer() +} + +func RegisterGripmockServer(s grpc.ServiceRegistrar, srv GripmockServer) { + s.RegisterService(&Gripmock_ServiceDesc, srv) +} + +func _Gripmock_ApiInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GripmockServer).ApiInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Gripmock_ApiInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GripmockServer).ApiInfo(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Gripmock_ServiceDesc is the grpc.ServiceDesc for Gripmock service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Gripmock_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "well_known_types.Gripmock", + HandlerType: (*GripmockServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ApiInfo", + Handler: _Gripmock_ApiInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "wkt.proto", +} From 4894ffdcb48edd41717f4a2706df0f25d83640da Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 23 Aug 2023 22:19:22 +0300 Subject: [PATCH 15/74] update gomod --- depends.go | 10 ---------- protogen/example/go.mod | 13 +++++++++++++ protogen/example/go.sum | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) delete mode 100644 depends.go create mode 100644 protogen/example/go.sum diff --git a/depends.go b/depends.go deleted file mode 100644 index 5866061c..00000000 --- a/depends.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - _ "github.com/tokopedia/gripmock/protogen" - _ "google.golang.org/grpc" - _ "google.golang.org/grpc/codes" - _ "google.golang.org/grpc/status" - _ "google.golang.org/protobuf/reflect/protoreflect" - _ "google.golang.org/protobuf/runtime/protoimpl" -) diff --git a/protogen/example/go.mod b/protogen/example/go.mod index a0610764..91b5a5b9 100644 --- a/protogen/example/go.mod +++ b/protogen/example/go.mod @@ -1,3 +1,16 @@ module github.com/tokopedia/gripmock/protogen/example go 1.21 + +require ( + google.golang.org/grpc v1.57.0 + google.golang.org/protobuf v1.31.0 +) + +require ( + github.com/golang/protobuf v1.5.3 // indirect + golang.org/x/net v0.9.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect +) diff --git a/protogen/example/go.sum b/protogen/example/go.sum new file mode 100644 index 00000000..65c55f75 --- /dev/null +++ b/protogen/example/go.sum @@ -0,0 +1,21 @@ +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= From 6c8ea30a5578e48af9b4c92d4edec0972b805b10 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 18:33:47 +0300 Subject: [PATCH 16/74] rename test => intgr-test --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 02e71eaf..44ab64d9 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ GOLANGCI_LING_IMAGE="golangci/golangci-lint:v1.54.2-alpine" version=latest build: - docker buildx build --load -t "bavix/gripmock:${version}" --no-cache --platform linux/arm64 . + docker buildx build --load -t "bavix/gripmock:${version}" --platform linux/arm64 . test: go test -tags mock -race -cover ./... @@ -16,5 +16,5 @@ lint: lint-fix: make lint args=--fix -test: build +intgr-test: build docker compose -f deployments/docker-compose/docker-compose.yml up From 9b8aae3332f76492d284bc3cc7fcf968574b7575 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 18:41:39 +0300 Subject: [PATCH 17/74] fix Dockerfile --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index cb34d58e..f5016e8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,8 @@ RUN cd /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock &&\ cd /go/src/github.com/tokopedia/gripmock &&\ go install -v +WORKDIR /go/src/github.com/tokopedia/gripmock + EXPOSE 4770 4771 ENTRYPOINT ["gripmock"] From e23b73c3bcff3e9626bebcae22642d98f00fb3f0 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 20:49:51 +0300 Subject: [PATCH 18/74] security fixes --- protogen/example/go.mod | 8 ++++---- protogen/example/go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/protogen/example/go.mod b/protogen/example/go.mod index 91b5a5b9..ec4433ce 100644 --- a/protogen/example/go.mod +++ b/protogen/example/go.mod @@ -9,8 +9,8 @@ require ( require ( github.com/golang/protobuf v1.5.3 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect ) diff --git a/protogen/example/go.sum b/protogen/example/go.sum index 65c55f75..ddcffb68 100644 --- a/protogen/example/go.sum +++ b/protogen/example/go.sum @@ -4,15 +4,15 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= From a917b53efcbbaf7ba3ca7f32d151c3a27dbf8738 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 20:54:39 +0300 Subject: [PATCH 19/74] fix builder.yaml --- .github/workflows/builder.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/builder.yaml b/.github/workflows/builder.yaml index 4ea50b34..7ff25943 100644 --- a/.github/workflows/builder.yaml +++ b/.github/workflows/builder.yaml @@ -4,9 +4,9 @@ on: push: branches: - "latest" + - "nightly" tags: - "v*.*.*" - pull_request: jobs: docker: From ac4e95c624e6725e57b7c7b2de7818f34413adeb Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 20:55:06 +0300 Subject: [PATCH 20/74] fix intgr-test --- .github/workflows/integration-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 88af8896..5aba140f 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -3,6 +3,7 @@ on: pull_request: branches: - develop + - nightly - latest jobs: From 9152ab46cd6b6d835fd2a2da968a9910b7ad9652 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 21:20:35 +0300 Subject: [PATCH 21/74] fix errors in http service (int64/uint64 numbers) --- stub/stub.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/stub/stub.go b/stub/stub.go index abf19ed7..09152264 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -6,7 +6,6 @@ import ( "github.com/go-chi/chi" "golang.org/x/text/cases" "golang.org/x/text/language" - "io" "log" "net/http" ) @@ -65,32 +64,32 @@ type Output struct { } func addStub(w http.ResponseWriter, r *http.Request) { - body, err := io.ReadAll(r.Body) - if err != nil { + stub := new(Stub) + decoder := json.NewDecoder(r.Body) + decoder.UseNumber() + + if err := decoder.Decode(stub); err != nil { responseError(err, w) return } - stub := new(Stub) - err = json.Unmarshal(body, stub) - if err != nil { + defer r.Body.Close() + + if err := validateStub(stub); err != nil { responseError(err, w) return } - err = validateStub(stub) - if err != nil { + if err := storeStub(stub); err != nil { responseError(err, w) return } - err = storeStub(stub) + _, err := w.Write([]byte("Success add stub")) if err != nil { responseError(err, w) return } - - w.Write([]byte("Success add stub")) } func listStub(w http.ResponseWriter, r *http.Request) { From 687ef2d745666a37b75a58051fb840b442e24176 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 22:13:36 +0300 Subject: [PATCH 22/74] lints --- stub/storage.go | 18 +++++++++--------- stub/stub.go | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/stub/storage.go b/stub/storage.go index 7d611fc1..f2dff4dd 100644 --- a/stub/storage.go +++ b/stub/storage.go @@ -60,19 +60,19 @@ func findStub(stub *findStubPayload) (*Output, error) { mx.Lock() defer mx.Unlock() if _, ok := stubStorage[stub.Service]; !ok { - return nil, fmt.Errorf("Can't find stub for Service: %s", stub.Service) + return nil, fmt.Errorf("can't find stub for Service: %s", stub.Service) } if _, ok := stubStorage[stub.Service][stub.Method]; !ok { - return nil, fmt.Errorf("Can't find stub for Service:%s and Method:%s", stub.Service, stub.Method) + return nil, fmt.Errorf("can't find stub for Service:%s and Method:%s", stub.Service, stub.Method) } stubs := stubStorage[stub.Service][stub.Method] if len(stubs) == 0 { - return nil, fmt.Errorf("Stub for Service:%s and Method:%s is empty", stub.Service, stub.Method) + return nil, fmt.Errorf("stub for Service:%s and Method:%s is empty", stub.Service, stub.Method) } - closestMatch := []closeMatch{} + var closestMatch []closeMatch for _, stubrange := range stubs { if expect := stubrange.Input.Equals; expect != nil { closestMatch = append(closestMatch, closeMatch{"equals", expect}) @@ -139,22 +139,22 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error // count the matches field_name and value then compare it with total field names and values // the higher the better func rankMatch(expect string, closeMatch map[string]interface{}) float32 { - occurence := 0 + occurrence := 0 for key, value := range closeMatch { if fuzzy.Match(key+":", expect) { - occurence++ + occurrence++ } if fuzzy.Match(fmt.Sprint(value), expect) { - occurence++ + occurrence++ } } - if occurence == 0 { + if occurrence == 0 { return 0 } totalFields := len(closeMatch) * 2 - return float32(occurence) / float32(totalFields) + return float32(occurrence) / float32(totalFields) } func renderFieldAsString(fields map[string]interface{}) string { diff --git a/stub/stub.go b/stub/stub.go index 09152264..1fded963 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -92,7 +92,7 @@ func addStub(w http.ResponseWriter, r *http.Request) { } } -func listStub(w http.ResponseWriter, r *http.Request) { +func listStub(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(allStub()) } @@ -119,13 +119,13 @@ func validateStub(stub *Stub) error { case stub.Input.Matches != nil: break default: - return fmt.Errorf("Input cannot be empty") + return fmt.Errorf("input cannot be empty") } // TODO: validate all input case if stub.Output.Error == "" && stub.Output.Data == nil { - return fmt.Errorf("Output can't be empty") + return fmt.Errorf("output can't be empty") } return nil } From 8c62d534343c84ab632483b3eb7aadfb88f41668 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Tue, 29 Aug 2023 23:14:43 +0300 Subject: [PATCH 23/74] add unit-test --- .github/workflows/unit.yml | 30 ++++++++++++++++++++++++++++++ stub/storage_test.go | 10 +++++----- stub/stub.go | 6 ++++-- 3 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/unit.yml diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml new file mode 100644 index 00000000..d9fc8d8b --- /dev/null +++ b/.github/workflows/unit.yml @@ -0,0 +1,30 @@ +name: Unit +on: + pull_request: + branches: + - develop + - nightly + - latest + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + go-version: [ '1.21' ] + steps: + - uses: actions/checkout@v3 + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: ${{ matrix.go-version }} + cache: true + - name: Install dependencies + run: go get . + - name: Test with Go + run: go test -json > TestResults-${{ matrix.go-version }}.json + - name: Upload Go test results + uses: actions/upload-artifact@v3 + with: + name: Go-results-${{ matrix.go-version }} + path: TestResults-${{ matrix.go-version }}.json diff --git a/stub/storage_test.go b/stub/storage_test.go index b5cac218..1c45a972 100644 --- a/stub/storage_test.go +++ b/stub/storage_test.go @@ -45,7 +45,7 @@ func Test_readStubFromFile(t *testing.T) { method: "getname", data: []storage{ { - Input: Input{Equals: map[string]interface{}{"id": float64(1)}}, + Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, Output: Output{Data: map[string]interface{}{"name": "user1"}}, }, }, @@ -79,11 +79,11 @@ func Test_readStubFromFile(t *testing.T) { method: "getname", data: []storage{ { - Input: Input{Equals: map[string]interface{}{"id": float64(1)}}, + Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, Output: Output{Data: map[string]interface{}{"name": "user1"}}, }, { - Input: Input{Equals: map[string]interface{}{"id": float64(2)}}, + Input: Input{Equals: map[string]interface{}{"id": json.Number("2")}}, Output: Output{Data: map[string]interface{}{"name": "user2"}}, }, }, @@ -117,11 +117,11 @@ func Test_readStubFromFile(t *testing.T) { method: "getname", data: []storage{ { - Input: Input{Equals: map[string]interface{}{"id": float64(1)}}, + Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, Output: Output{Data: map[string]interface{}{"name": "user1"}}, }, { - Input: Input{Equals: map[string]interface{}{"id": float64(2)}}, + Input: Input{Equals: map[string]interface{}{"id": json.Number("2")}}, Output: Output{Data: map[string]interface{}{"name": "user2"}}, }, }, diff --git a/stub/stub.go b/stub/stub.go index 1fded963..31632857 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -140,12 +140,14 @@ func handleFindStub(w http.ResponseWriter, r *http.Request) { stub := new(findStubPayload) decoder := json.NewDecoder(r.Body) decoder.UseNumber() - err := decoder.Decode(stub) - if err != nil { + + if err := decoder.Decode(stub); err != nil { responseError(err, w) return } + defer r.Body.Close() + // due to golang implementation // method name must capital title := cases.Title(language.English, cases.NoLower) From d033502f868baa98044bf90d57c879188c59f142 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 30 Aug 2023 21:14:42 +0300 Subject: [PATCH 24/74] Getting started with yaml --- go.mod | 13 +- go.sum | 40 +++-- pkg/storage/stubs.go | 131 +++++++++++++++++ pkg/template/engine.go | 57 ++++++++ pkg/yaml2json/template.go | 23 +++ stub/actions.go | 150 +++++++++++++++++++ stub/storage.go | 162 ++++----------------- stub/{storage_test.go => storage_test.go_} | 0 stub/stub.go | 114 ++------------- stub/{stub_test.go => stub_test.go_} | 0 10 files changed, 432 insertions(+), 258 deletions(-) create mode 100644 pkg/storage/stubs.go create mode 100644 pkg/template/engine.go create mode 100644 pkg/yaml2json/template.go create mode 100644 stub/actions.go rename stub/{storage_test.go => storage_test.go_} (100%) rename stub/{stub_test.go => stub_test.go_} (100%) diff --git a/go.mod b/go.mod index 10ddc9aa..3181356d 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,9 @@ go 1.21 require ( github.com/go-chi/chi v4.1.2+incompatible + github.com/goccy/go-yaml v1.11.0 + github.com/google/uuid v1.3.0 github.com/lithammer/fuzzysearch v1.1.8 - github.com/stretchr/testify v1.8.4 github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 google.golang.org/grpc v1.57.0 @@ -13,16 +14,14 @@ require ( ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fatih/color v1.10.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/kr/pretty v0.2.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/tokopedia/gripmock/protogen v0.0.0 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.11.0 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) // this is for generated server to be able to run diff --git a/go.sum b/go.sum index 49185126..47508916 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,36 @@ -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/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= +github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= -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/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -34,6 +43,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -57,6 +68,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= @@ -65,8 +78,3 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/storage/stubs.go b/pkg/storage/stubs.go new file mode 100644 index 00000000..d9e011b9 --- /dev/null +++ b/pkg/storage/stubs.go @@ -0,0 +1,131 @@ +package storage + +import ( + "errors" + "github.com/google/uuid" + "sync" +) + +var ErrServiceNotFound = errors.New("service not found") +var ErrMethodNotFound = errors.New("method not found") + +type Stub struct { + ID *uuid.UUID `json:"id,omitempty"` + Service string `json:"service"` + Method string `json:"method"` + Input Input `json:"input"` + Output Output `json:"output"` +} + +type Input struct { + Equals map[string]interface{} `json:"equals"` + Contains map[string]interface{} `json:"contains"` + Matches map[string]interface{} `json:"matches"` +} + +type Output struct { + Data map[string]interface{} `json:"data"` + Error string `json:"error"` +} + +type storage struct { + ID uuid.UUID + Input Input + Output Output +} + +type StubStorage struct { + mu sync.RWMutex + items map[string]map[string][]storage + total uint64 +} + +func New() *StubStorage { + return &StubStorage{ + items: make(map[string]map[string][]storage), + } +} + +func (r *StubStorage) Add(stubs ...*Stub) []uuid.UUID { + r.mu.Lock() + defer r.mu.Unlock() + + result := make([]uuid.UUID, 0, len(stubs)) + + for _, stub := range stubs { + if _, ok := r.items[stub.Service]; !ok { + r.items[stub.Service] = make(map[string][]storage, 1) + } + + r.items[stub.Service][stub.Method] = append(r.items[stub.Service][stub.Method], storage{ + ID: stub.GetID(), + Input: stub.Input, + Output: stub.Output, + }) + + result = append(result, stub.GetID()) + + r.total++ + } + + return result +} + +func (r *StubStorage) Delete(_ ...uuid.UUID) { + r.total-- // fixme +} + +func (r *StubStorage) Purge() { + r.mu.Lock() + defer r.mu.Unlock() + + r.items = map[string]map[string][]storage{} + r.total = 0 +} + +func (r *StubStorage) ItemsBy(service, method string) ([]storage, error) { + r.mu.RLock() + defer r.mu.RUnlock() + + if _, ok := r.items[service]; !ok { + return nil, ErrServiceNotFound + } + + if _, ok := r.items[service][method]; !ok { + return nil, ErrMethodNotFound + } + + return r.items[service][method], nil +} + +func (r *StubStorage) Stubs() []Stub { + r.mu.RLock() + defer r.mu.RUnlock() + + results := make([]Stub, 0, r.total) + + for service, methods := range r.items { + for method, storages := range methods { + for _, datum := range storages { + results = append(results, Stub{ + ID: &datum.ID, + Service: service, + Method: method, + Input: datum.Input, + Output: datum.Output, + }) + } + } + } + + return results +} + +func (s *Stub) GetID() uuid.UUID { + if s.ID == nil { + id := uuid.New() + s.ID = &id + } + + return *s.ID +} diff --git a/pkg/template/engine.go b/pkg/template/engine.go new file mode 100644 index 00000000..796b6a28 --- /dev/null +++ b/pkg/template/engine.go @@ -0,0 +1,57 @@ +package template + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "text/template" + + "github.com/google/uuid" +) + +type Engine struct{} + +func New() *Engine { + return &Engine{} +} + +func (e *Engine) Execute(name string, data []byte) ([]byte, error) { + var buffer bytes.Buffer + + err := template.New(name).Funcs(e.funcMap()).Execute(&buffer, data) + if err != nil { + return nil, err + } + + return buffer.Bytes(), nil +} + +func (e *Engine) funcMap() template.FuncMap { + return template.FuncMap{ + "base64StdEncoding": func(str string) string { + return base64.StdEncoding.EncodeToString([]byte(str)) + }, + "uuidToHighLowLittleEndian": func(guid string) string { + v := uuid.MustParse(guid) + + high := int64(v[0]) | int64(v[1])<<8 | int64(v[2])<<16 | int64(v[3])<<24 | + int64(v[4])<<32 | int64(v[5])<<40 | int64(v[6])<<48 | int64(v[7])<<56 + + low := int64(v[8]) | int64(v[9])<<8 | int64(v[10])<<16 | int64(v[11])<<24 | + int64(v[12])<<32 | int64(v[13])<<40 | int64(v[14])<<48 | int64(v[15])<<56 + + var buffer bytes.Buffer + + err := json.NewEncoder(&buffer).Encode(map[string]int64{ + "high": high, + "low": low, + }) + + if err != nil { + return guid + } + + return buffer.String() + }, + } +} diff --git a/pkg/yaml2json/template.go b/pkg/yaml2json/template.go new file mode 100644 index 00000000..3e4dc41f --- /dev/null +++ b/pkg/yaml2json/template.go @@ -0,0 +1,23 @@ +package yaml2json + +import ( + "github.com/goccy/go-yaml" + "github.com/tokopedia/gripmock/pkg/template" +) + +type Convertor struct { + engine *template.Engine +} + +func New() *Convertor { + return &Convertor{engine: template.New()} +} + +func (t *Convertor) Execute(name string, data []byte) ([]byte, error) { + bytes, err := t.engine.Execute(name, data) + if err != nil { + return nil, err + } + + return yaml.YAMLToJSON(bytes) +} diff --git a/stub/actions.go b/stub/actions.go new file mode 100644 index 00000000..59a21a04 --- /dev/null +++ b/stub/actions.go @@ -0,0 +1,150 @@ +package stub + +import ( + "bytes" + "encoding/json" + "log" + "net/http" + "os" + "strings" + + "github.com/tokopedia/gripmock/pkg/storage" + "github.com/tokopedia/gripmock/pkg/yaml2json" + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +type Handler struct { + stubs *storage.StubStorage + convertor *yaml2json.Convertor +} + +type findStubPayload struct { + Service string `json:"service"` + Method string `json:"method"` + Data map[string]interface{} `json:"data"` +} + +func NewHandler() *Handler { + return &Handler{stubs: storage.New(), convertor: yaml2json.New()} +} + +func (h *Handler) handleFind(w http.ResponseWriter, r *http.Request) { + stub := new(findStubPayload) + decoder := json.NewDecoder(r.Body) + decoder.UseNumber() + + if err := decoder.Decode(stub); err != nil { + h.responseError(err, w) + return + } + + defer r.Body.Close() + + // due to golang implementation + // method name must capital + title := cases.Title(language.English, cases.NoLower) + stub.Method = title.String(stub.Method) + + output, err := findStub(h.stubs, stub) + if err != nil { + log.Println(err) + h.responseError(err, w) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(output) +} + +func (h *Handler) handlePurge(w http.ResponseWriter, _ *http.Request) { + h.stubs.Purge() + w.WriteHeader(204) +} + +func (h *Handler) handleStubs(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + err := json.NewEncoder(w).Encode(h.stubs.Stubs()) + if err != nil { + h.responseError(err, w) + return + } +} + +func (h *Handler) handleAddStub(w http.ResponseWriter, r *http.Request) { + // todo: add supported input array + stub := new(storage.Stub) + decoder := json.NewDecoder(r.Body) + decoder.UseNumber() + + if err := decoder.Decode(stub); err != nil { + h.responseError(err, w) + return + } + + defer r.Body.Close() + + if err := validateStub(stub); err != nil { + h.responseError(err, w) + return + } + + w.Header().Set("Content-Type", "application/json") + err := json.NewEncoder(w).Encode(h.stubs.Add(stub)) + if err != nil { + h.responseError(err, w) + return + } +} + +func (h *Handler) responseError(err error, w http.ResponseWriter) { + w.WriteHeader(500) + + _, _ = w.Write([]byte(err.Error())) +} + +func (h *Handler) readStubs(path string) { + files, err := os.ReadDir(path) + if err != nil { + log.Printf("Can't read stub from %s. %v\n", path, err) + return + } + + for _, file := range files { + if file.IsDir() { + h.readStubs(path + "/" + file.Name()) + continue + } + + byt, err := os.ReadFile(path + "/" + file.Name()) + if err != nil { + log.Printf("Error when reading file %s. %v. skipping...", file.Name(), err) + continue + } + + byt = bytes.TrimSpace(byt) + + if strings.HasSuffix(file.Name(), ".yaml") || strings.HasSuffix(file.Name(), ".yml") { + byt, err = h.convertor.Execute(file.Name(), byt) + if err != nil { + log.Printf("Error when unmarshalling file %s. %v. skipping...", file.Name(), err) + continue + } + } + + if byt[0] == '{' && byt[len(byt)-1] == '}' { + byt = []byte("[" + string(byt) + "]") + } + + var stubs []*storage.Stub + decoder := json.NewDecoder(bytes.NewReader(byt)) + decoder.UseNumber() + + if err = decoder.Decode(&stubs); err != nil { + log.Printf("Error when unmarshalling file %s. %v %v. skipping...", file.Name(), string(byt), err) + continue + } + + h.stubs.Add(stubs...) + } +} diff --git a/stub/storage.go b/stub/storage.go index f2dff4dd..33a35e6b 100644 --- a/stub/storage.go +++ b/stub/storage.go @@ -1,97 +1,58 @@ package stub import ( - "bytes" "encoding/json" + "errors" "fmt" "log" - "os" "reflect" "regexp" - "sync" "github.com/lithammer/fuzzysearch/fuzzy" + "github.com/tokopedia/gripmock/pkg/storage" ) -var mx = sync.Mutex{} - -// below represent map[servicename][methodname][]expectations -type stubMapping map[string]map[string][]storage - type matchFunc func(interface{}, interface{}) bool -var stubStorage = stubMapping{} - -type storage struct { - Input Input - Output Output -} - -func storeStub(stub *Stub) error { - return stubStorage.storeStub(stub) -} - -func (sm *stubMapping) storeStub(stub *Stub) error { - mx.Lock() - defer mx.Unlock() - - if (*sm)[stub.Service] == nil { - (*sm)[stub.Service] = make(map[string][]storage) - } - (*sm)[stub.Service][stub.Method] = append((*sm)[stub.Service][stub.Method], storage{ - Input: stub.Input, - Output: stub.Output, - }) - return nil -} - -func allStub() stubMapping { - mx.Lock() - defer mx.Unlock() - return stubStorage -} - type closeMatch struct { rule string expect map[string]interface{} } -func findStub(stub *findStubPayload) (*Output, error) { - mx.Lock() - defer mx.Unlock() - if _, ok := stubStorage[stub.Service]; !ok { +func findStub(stubStorage *storage.StubStorage, stub *findStubPayload) (*storage.Output, error) { + stubs, err := stubStorage.ItemsBy(stub.Service, stub.Method) + if errors.Is(err, storage.ErrServiceNotFound) { return nil, fmt.Errorf("can't find stub for Service: %s", stub.Service) } - if _, ok := stubStorage[stub.Service][stub.Method]; !ok { + if errors.Is(err, storage.ErrMethodNotFound) { return nil, fmt.Errorf("can't find stub for Service:%s and Method:%s", stub.Service, stub.Method) } - stubs := stubStorage[stub.Service][stub.Method] if len(stubs) == 0 { return nil, fmt.Errorf("stub for Service:%s and Method:%s is empty", stub.Service, stub.Method) } var closestMatch []closeMatch - for _, stubrange := range stubs { - if expect := stubrange.Input.Equals; expect != nil { + for _, strange := range stubs { + if expect := strange.Input.Equals; expect != nil { closestMatch = append(closestMatch, closeMatch{"equals", expect}) if equals(stub.Data, expect) { - return &stubrange.Output, nil + return &strange.Output, nil } } - if expect := stubrange.Input.Contains; expect != nil { + if expect := strange.Input.Contains; expect != nil { closestMatch = append(closestMatch, closeMatch{"contains", expect}) - if contains(stubrange.Input.Contains, stub.Data) { - return &stubrange.Output, nil + if contains(strange.Input.Contains, stub.Data) { + return &strange.Output, nil } } - if expect := stubrange.Input.Matches; expect != nil { + if expect := strange.Input.Matches; expect != nil { closestMatch = append(closestMatch, closeMatch{"matches", expect}) - if matches(stubrange.Input.Matches, stub.Data) { - return &stubrange.Output, nil + if matches(strange.Input.Matches, stub.Data) { + return &strange.Output, nil } } } @@ -101,8 +62,12 @@ func findStub(stub *findStubPayload) (*Output, error) { func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error { template := fmt.Sprintf("Can't find stub \n\nService: %s \n\nMethod: %s \n\nInput\n\n", stub.Service, stub.Method) - expectString := renderFieldAsString(stub.Data) - template += expectString + expectString, err := json.MarshalIndent(stub.Data, "", "\t") + if err != nil { + return err + } + + template += string(expectString) if len(closestMatches) == 0 { return fmt.Errorf(template) @@ -113,7 +78,7 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error match closeMatch }{0, closeMatch{}} for _, closeMatchValue := range closestMatches { - rank := rankMatch(expectString, closeMatchValue.expect) + rank := rankMatch(string(expectString), closeMatchValue.expect) // the higher the better if rank > highestRank.rank { @@ -129,7 +94,11 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error closestMatch = highestRank.match } - closestMatchString := renderFieldAsString(closestMatch.expect) + closestMatchString, err := json.MarshalIndent(closestMatch.expect, "", "\t") + if err != nil { + return err + } + template += fmt.Sprintf("\n\nClosest Match \n\n%s:%s", closestMatch.rule, closestMatchString) return fmt.Errorf(template) @@ -157,19 +126,6 @@ func rankMatch(expect string, closeMatch map[string]interface{}) float32 { return float32(occurrence) / float32(totalFields) } -func renderFieldAsString(fields map[string]interface{}) string { - template := "{\n" - for key, val := range fields { - template += fmt.Sprintf("\t%s: %v\n", key, val) - } - template += "}" - return template -} - -func deepEqual(expect, actual interface{}) bool { - return reflect.DeepEqual(expect, actual) -} - func regexMatch(expect, actual interface{}) bool { var expectedStr, expectedStringOk = expect.(string) var actualStr, actualStringOk = actual.(string) @@ -182,15 +138,15 @@ func regexMatch(expect, actual interface{}) bool { return match } - return deepEqual(expect, actual) + return reflect.DeepEqual(expect, actual) } func equals(expect, actual map[string]interface{}) bool { - return find(expect, actual, true, true, deepEqual) + return find(expect, actual, true, true, reflect.DeepEqual) } func contains(expect, actual map[string]interface{}) bool { - return find(expect, actual, true, false, deepEqual) + return find(expect, actual, true, false, reflect.DeepEqual) } func matches(expect, actual map[string]interface{}) bool { @@ -264,61 +220,3 @@ func find(expect, actual interface{}, acc, exactMatch bool, f matchFunc) bool { return f(expect, actual) } - -func clearStorage() { - mx.Lock() - defer mx.Unlock() - - stubStorage = stubMapping{} -} - -func readStubFromFile(path string) { - stubStorage.readStubFromFile(path) -} - -func (sm *stubMapping) readStubFromFile(path string) { - files, err := os.ReadDir(path) - if err != nil { - log.Printf("Can't read stub from %s. %v\n", path, err) - return - } - - for _, file := range files { - if file.IsDir() { - readStubFromFile(path + "/" + file.Name()) - continue - } - - byt, err := os.ReadFile(path + "/" + file.Name()) - if err != nil { - log.Printf("Error when reading file %s. %v. skipping...", file.Name(), err) - continue - } - - if byt[0] == '[' && byt[len(byt)-1] == ']' { - var stubs []*Stub - decoder := json.NewDecoder(bytes.NewReader(byt)) - decoder.UseNumber() - - if err = decoder.Decode(&stubs); err != nil { - log.Printf("Error when unmarshalling file %s. %v. skipping...", file.Name(), err) - continue - } - for _, s := range stubs { - sm.storeStub(s) - } - continue - } - - stub := new(Stub) - decoder := json.NewDecoder(bytes.NewReader(byt)) - decoder.UseNumber() - - if err = decoder.Decode(stub); err != nil { - log.Printf("Error when unmarshalling file %s. %v. skipping...", file.Name(), err) - continue - } - - sm.storeStub(stub) - } -} diff --git a/stub/storage_test.go b/stub/storage_test.go_ similarity index 100% rename from stub/storage_test.go rename to stub/storage_test.go_ diff --git a/stub/stub.go b/stub/stub.go index 31632857..1aa41fce 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -1,9 +1,9 @@ package stub import ( - "encoding/json" "fmt" "github.com/go-chi/chi" + "github.com/tokopedia/gripmock/pkg/storage" "golang.org/x/text/cases" "golang.org/x/text/language" "log" @@ -23,14 +23,17 @@ func RunStubServer(opt Options) { opt.Port = DefaultPort } addr := opt.BindAddr + ":" + opt.Port + + handler := NewHandler() + r := chi.NewRouter() - r.Post("/add", addStub) - r.Get("/", listStub) - r.Post("/find", handleFindStub) - r.Get("/clear", handleClearStub) + r.Get("/", handler.handleStubs) + r.Post("/add", handler.handleAddStub) + r.Post("/find", handler.handleFind) + r.Get("/purge", handler.handlePurge) if opt.StubPath != "" { - readStubFromFile(opt.StubPath) + handler.readStubs(opt.StubPath) } fmt.Println("Serving stub admin on http://" + addr) @@ -40,64 +43,7 @@ func RunStubServer(opt Options) { }() } -func responseError(err error, w http.ResponseWriter) { - w.WriteHeader(500) - w.Write([]byte(err.Error())) -} - -type Stub struct { - Service string `json:"service"` - Method string `json:"method"` - Input Input `json:"input"` - Output Output `json:"output"` -} - -type Input struct { - Equals map[string]interface{} `json:"equals"` - Contains map[string]interface{} `json:"contains"` - Matches map[string]interface{} `json:"matches"` -} - -type Output struct { - Data map[string]interface{} `json:"data"` - Error string `json:"error"` -} - -func addStub(w http.ResponseWriter, r *http.Request) { - stub := new(Stub) - decoder := json.NewDecoder(r.Body) - decoder.UseNumber() - - if err := decoder.Decode(stub); err != nil { - responseError(err, w) - return - } - - defer r.Body.Close() - - if err := validateStub(stub); err != nil { - responseError(err, w) - return - } - - if err := storeStub(stub); err != nil { - responseError(err, w) - return - } - - _, err := w.Write([]byte("Success add stub")) - if err != nil { - responseError(err, w) - return - } -} - -func listStub(w http.ResponseWriter, _ *http.Request) { - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(allStub()) -} - -func validateStub(stub *Stub) error { +func validateStub(stub *storage.Stub) error { if stub.Service == "" { return fmt.Errorf("service name can't be empty") } @@ -127,44 +73,6 @@ func validateStub(stub *Stub) error { if stub.Output.Error == "" && stub.Output.Data == nil { return fmt.Errorf("output can't be empty") } - return nil -} - -type findStubPayload struct { - Service string `json:"service"` - Method string `json:"method"` - Data map[string]interface{} `json:"data"` -} - -func handleFindStub(w http.ResponseWriter, r *http.Request) { - stub := new(findStubPayload) - decoder := json.NewDecoder(r.Body) - decoder.UseNumber() - - if err := decoder.Decode(stub); err != nil { - responseError(err, w) - return - } - - defer r.Body.Close() - - // due to golang implementation - // method name must capital - title := cases.Title(language.English, cases.NoLower) - stub.Method = title.String(stub.Method) - - output, err := findStub(stub) - if err != nil { - log.Println(err) - responseError(err, w) - return - } - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(output) -} - -func handleClearStub(w http.ResponseWriter, r *http.Request) { - clearStorage() - w.Write([]byte("OK")) + return nil } diff --git a/stub/stub_test.go b/stub/stub_test.go_ similarity index 100% rename from stub/stub_test.go rename to stub/stub_test.go_ From 59c8434d66c90e6aa0ba1c310e00ad0c66e92331 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Wed, 30 Aug 2023 22:31:42 +0300 Subject: [PATCH 25/74] remove units --- stub/storage_test.go_ | 137 ------------------ stub/stub_test.go_ | 317 ------------------------------------------ 2 files changed, 454 deletions(-) delete mode 100644 stub/storage_test.go_ delete mode 100644 stub/stub_test.go_ diff --git a/stub/storage_test.go_ b/stub/storage_test.go_ deleted file mode 100644 index 1c45a972..00000000 --- a/stub/storage_test.go_ +++ /dev/null @@ -1,137 +0,0 @@ -package stub - -import ( - "encoding/json" - "os" - "testing" - - "github.com/stretchr/testify/require" -) - -func Test_readStubFromFile(t *testing.T) { - tests := []struct { - name string - mock func(service, method string, data []storage) (path string) - service string - method string - data []storage - }{ - { - name: "single file, single stub", - mock: func(service, method string, data []storage) (path string) { - dir, err := os.MkdirTemp("", "") - require.NoError(t, err) - tempF, err := os.CreateTemp(dir, "") - require.NoError(t, err) - defer tempF.Close() - - var stubs []Stub - for _, d := range data { - stubs = append(stubs, Stub{ - Service: service, - Method: method, - Input: d.Input, - Output: d.Output, - }) - } - byt, err := json.Marshal(stubs) - require.NoError(t, err) - _, err = tempF.Write(byt) - require.NoError(t, err) - - return dir - }, - service: "user", - method: "getname", - data: []storage{ - { - Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, - Output: Output{Data: map[string]interface{}{"name": "user1"}}, - }, - }, - }, - { - name: "single file, multiple stub", - mock: func(service, method string, data []storage) (path string) { - dir, err := os.MkdirTemp("", "") - require.NoError(t, err) - tempF, err := os.CreateTemp(dir, "") - require.NoError(t, err) - defer tempF.Close() - - var stubs []Stub - for _, d := range data { - stubs = append(stubs, Stub{ - Service: service, - Method: method, - Input: d.Input, - Output: d.Output, - }) - } - byt, err := json.Marshal(stubs) - require.NoError(t, err) - _, err = tempF.Write(byt) - require.NoError(t, err) - - return dir - }, - service: "user", - method: "getname", - data: []storage{ - { - Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, - Output: Output{Data: map[string]interface{}{"name": "user1"}}, - }, - { - Input: Input{Equals: map[string]interface{}{"id": json.Number("2")}}, - Output: Output{Data: map[string]interface{}{"name": "user2"}}, - }, - }, - }, - { - name: "multiple file, single stub", - mock: func(service, method string, data []storage) (path string) { - dir, err := os.MkdirTemp("", "") - require.NoError(t, err) - - for _, d := range data { - tempF, err := os.CreateTemp(dir, "") - require.NoError(t, err) - defer tempF.Close() - - stub := Stub{ - Service: service, - Method: method, - Input: d.Input, - Output: d.Output, - } - byt, err := json.Marshal(stub) - require.NoError(t, err) - _, err = tempF.Write(byt) - require.NoError(t, err) - } - - return dir - }, - service: "user", - method: "getname", - data: []storage{ - { - Input: Input{Equals: map[string]interface{}{"id": json.Number("1")}}, - Output: Output{Data: map[string]interface{}{"name": "user1"}}, - }, - { - Input: Input{Equals: map[string]interface{}{"id": json.Number("2")}}, - Output: Output{Data: map[string]interface{}{"name": "user2"}}, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - sm := stubMapping{} - sm.readStubFromFile(tt.mock(tt.service, tt.method, tt.data)) - require.ElementsMatch(t, tt.data, sm[tt.service][tt.method]) - }) - } -} diff --git a/stub/stub_test.go_ b/stub/stub_test.go_ deleted file mode 100644 index 637af7a7..00000000 --- a/stub/stub_test.go_ +++ /dev/null @@ -1,317 +0,0 @@ -package stub - -import ( - "bytes" - "io" - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestStub(t *testing.T) { - type test struct { - name string - mock func() *http.Request - handler http.HandlerFunc - expect string - } - - cases := []test{ - { - name: "add simple stub", - mock: func() *http.Request { - payload := `{ - "service": "Testing", - "method":"TestMethod", - "input":{ - "equals":{ - "Hola":"Mundo" - } - }, - "output":{ - "data":{ - "Hello":"World" - } - } - }` - read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/add", read) - }, - handler: addStub, - expect: `Success add stub`, - }, - { - name: "list stub", - mock: func() *http.Request { - return httptest.NewRequest("GET", "/", nil) - }, - handler: listStub, - expect: "{\"Testing\":{\"TestMethod\":[{\"Input\":{\"equals\":{\"Hola\":\"Mundo\"},\"contains\":null,\"matches\":null},\"Output\":{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}}]}}\n", - }, - { - name: "find stub equals", - mock: func() *http.Request { - payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Mundo"}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", - }, - { - name: "add nested stub equals", - mock: func() *http.Request { - payload := `{ - "service": "NestedTesting", - "method":"TestMethod", - "input":{ - "equals":{ - "name": "Afra Gokce", - "age": 1, - "girl": true, - "null": null, - "greetings": { - "hola": "mundo", - "merhaba": "dunya" - }, - "cities": ["Istanbul", "Jakarta"] - } - }, - "output":{ - "data":{ - "Hello":"World" - } - } - }` - read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/add", read) - }, - handler: addStub, - expect: `Success add stub`, - }, - { - name: "find nested stub equals", - mock: func() *http.Request { - payload := `{"service":"NestedTesting","method":"TestMethod","data":{"name":"Afra Gokce","age":1,"girl":true,"null":null,"greetings":{"hola":"mundo","merhaba":"dunya"},"cities":["Istanbul","Jakarta"]}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", - }, - { - name: "add stub contains", - mock: func() *http.Request { - payload := `{ - "service": "Testing", - "method":"TestMethod", - "input":{ - "contains":{ - "field1":"hello field1", - "field3":"hello field3" - } - }, - "output":{ - "data":{ - "hello":"world" - } - } - }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) - }, - handler: addStub, - expect: `Success add stub`, - }, - { - name: "find stub contains", - mock: func() *http.Request { - payload := `{ - "service":"Testing", - "method":"TestMethod", - "data":{ - "field1":"hello field1", - "field2":"hello field2", - "field3":"hello field3" - } - }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", - }, - { - name: "add nested stub contains", - mock: func() *http.Request { - payload := `{ - "service": "NestedTesting", - "method":"TestMethod", - "input":{ - "contains":{ - "key": "value", - "greetings": { - "hola": "mundo", - "merhaba": "dunya" - }, - "cities": ["Istanbul", "Jakarta"] - } - }, - "output":{ - "data":{ - "hello":"world" - } - } - }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) - }, - handler: addStub, - expect: `Success add stub`, - }, - { - name: "find nested stub contains", - mock: func() *http.Request { - payload := `{ - "service":"NestedTesting", - "method":"TestMethod", - "data":{ - "key": "value", - "anotherKey": "anotherValue", - "greetings": { - "hola": "mundo", - "merhaba": "dunya", - "hello": "world" - }, - "cities": ["Istanbul", "Jakarta", "Winterfell"] - } - }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", - }, - { - name: "add stub matches regex", - mock: func() *http.Request { - payload := `{ - "service":"Testing2", - "method":"TestMethod", - "input":{ - "matches":{ - "field1":".*ello$" - } - }, - "output":{ - "data":{ - "reply":"OK" - } - } - }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) - }, - handler: addStub, - expect: "Success add stub", - }, - { - name: "find stub matches regex", - mock: func() *http.Request { - payload := `{ - "service":"Testing2", - "method":"TestMethod", - "data":{ - "field1":"hello" - } - }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", - }, - { - name: "add nested stub matches regex", - mock: func() *http.Request { - payload := `{ - "service":"NestedTesting2", - "method":"TestMethod", - "input":{ - "matches":{ - "key": "[a-z]{3}ue", - "greetings": { - "hola": 1, - "merhaba": true, - "hello": "^he[l]{2,}o$" - }, - "cities": ["Istanbul", "Jakarta", ".*"], - "mixed": [5.5, false, ".*"] - } - }, - "output":{ - "data":{ - "reply":"OK" - } - } - }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) - }, - handler: addStub, - expect: "Success add stub", - }, - { - name: "find nested stub matches regex", - mock: func() *http.Request { - payload := `{ - "service":"NestedTesting2", - "method":"TestMethod", - "data":{ - "key": "value", - "greetings": { - "hola": 1, - "merhaba": true, - "hello": "helllllo" - }, - "cities": ["Istanbul", "Jakarta", "Gotham"], - "mixed": [5.5, false, "Gotham"] - } - } - }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", - }, - { - name: "error find stub contains", - mock: func() *http.Request { - payload := `{ - "service":"Testing", - "method":"TestMethod", - "data":{ - "field1":"hello field1" - } - }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "Can't find stub \n\nService: Testing \n\nMethod: TestMethod \n\nInput\n\n{\n\tfield1: hello field1\n}\n\nClosest Match \n\ncontains:{\n\tfield1: hello field1\n\tfield3: hello field3\n}", - }, - { - name: "error find stub equals", - mock: func() *http.Request { - payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Dunia"}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) - }, - handler: handleFindStub, - expect: "Can't find stub \n\nService: Testing \n\nMethod: TestMethod \n\nInput\n\n{\n\tHola: Dunia\n}\n\nClosest Match \n\nequals:{\n\tHola: Mundo\n}", - }, - } - - for _, v := range cases { - t.Run(v.name, func(t *testing.T) { - wrt := httptest.NewRecorder() - req := v.mock() - v.handler(wrt, req) - res, err := io.ReadAll(wrt.Result().Body) - - assert.NoError(t, err) - assert.Equal(t, v.expect, string(res)) - }) - } -} From d261e79fa4e02049a0d2865a1f560e7dc5f61130 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Thu, 31 Aug 2023 19:41:44 +0300 Subject: [PATCH 26/74] go-chi/chi => gorilla/mux --- go.mod | 2 +- go.sum | 4 +-- pkg/sdk/client.go | 59 +++++++++++++++++++++++++++++++++ protoc-gen-gripmock/server.tmpl | 43 +++++++++--------------- stub/actions.go | 8 ++--- stub/stub.go | 24 ++++++++------ 6 files changed, 94 insertions(+), 46 deletions(-) create mode 100644 pkg/sdk/client.go diff --git a/go.mod b/go.mod index 3181356d..e944b37b 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/tokopedia/gripmock go 1.21 require ( - github.com/go-chi/chi v4.1.2+incompatible github.com/goccy/go-yaml v1.11.0 github.com/google/uuid v1.3.0 + github.com/gorilla/mux v1.8.0 github.com/lithammer/fuzzysearch v1.1.8 github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 diff --git a/go.sum b/go.sum index 47508916..2bdb28a0 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= -github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= @@ -18,6 +16,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= diff --git a/pkg/sdk/client.go b/pkg/sdk/client.go new file mode 100644 index 00000000..82f689f3 --- /dev/null +++ b/pkg/sdk/client.go @@ -0,0 +1,59 @@ +package sdk + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" +) + +type StubApiClient struct { + url string + httpClient *http.Client +} + +func NewStubApiClient(url string, client *http.Client) *StubApiClient { + return &StubApiClient{url: url, httpClient: client} +} + +type Payload struct { + Service string `json:"service"` + Method string `json:"method"` + Data interface{} `json:"data"` +} + +type Response struct { + Data interface{} `json:"data"` + Error string `json:"error"` +} + +func (c *StubApiClient) Search(payload Payload) (*Response, error) { + postBody, err := json.Marshal(payload) + if err != nil { + return nil, err + } + + resp, err := c.httpClient.Post(c.url+"/api/stubs/search", "application/json", bytes.NewReader(postBody)) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + + return nil, fmt.Errorf(string(body)) + } + + result := new(Response) + decoder := json.NewDecoder(resp.Body) + decoder.UseNumber() + + if err := decoder.Decode(result); err != nil { + return nil, err + } + + return result, nil +} diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 1eebb96f..4efac43f 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -16,6 +16,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/reflection" "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/tokopedia/gripmock/pkg/sdk" ) {{ range $package, $alias := .Dependencies }} import {{$alias}} "{{$package}}" @@ -149,40 +151,25 @@ type response struct { } func findStub(service, method string, in, out protoreflect.ProtoMessage) error { - url := fmt.Sprintf("http://localhost%s/find", HTTP_PORT) - pyl := payload{ - Service: service, - Method: method, - Data: in, - } - byt, err := json.Marshal(pyl) - if err != nil { - return err - } - reader := bytes.NewReader(byt) - resp, err := http.DefaultClient.Post(url, "application/json", reader) - if err != nil { - return fmt.Errorf("Error request to stub server %v",err) - } + api := sdk.NewStubApiClient(fmt.Sprintf("http://localhost%s", HTTP_PORT), http.DefaultClient) + respRPC, err := api.Search(sdk.Payload{ + Service: service, + Method: method, + Data: in, + }) + if err != nil { + return err + } - if resp.StatusCode != http.StatusOK { - body, _ := ioutil.ReadAll(resp.Body) - return fmt.Errorf(string(body)) + if respRPC.Error != "" { + return fmt.Errorf(respRPC.Error) } - respRPC := new(response) - decoder := json.NewDecoder(resp.Body) - decoder.UseNumber() - err = decoder.Decode(respRPC) + data, err := json.Marshal(respRPC.Data) if err != nil { - return fmt.Errorf("decoding json response %v",err) - } - - if respRPC.Error != "" { - return fmt.Errorf(respRPC.Error) + return err } - data, _ := json.Marshal(respRPC.Data) return jsonpb.Unmarshal(data, out) } {{ end }} \ No newline at end of file diff --git a/stub/actions.go b/stub/actions.go index 59a21a04..8571d576 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -29,7 +29,7 @@ func NewHandler() *Handler { return &Handler{stubs: storage.New(), convertor: yaml2json.New()} } -func (h *Handler) handleFind(w http.ResponseWriter, r *http.Request) { +func (h *Handler) searchHandle(w http.ResponseWriter, r *http.Request) { stub := new(findStubPayload) decoder := json.NewDecoder(r.Body) decoder.UseNumber() @@ -57,12 +57,12 @@ func (h *Handler) handleFind(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(output) } -func (h *Handler) handlePurge(w http.ResponseWriter, _ *http.Request) { +func (h *Handler) purgeHandle(w http.ResponseWriter, _ *http.Request) { h.stubs.Purge() w.WriteHeader(204) } -func (h *Handler) handleStubs(w http.ResponseWriter, _ *http.Request) { +func (h *Handler) listHandle(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") err := json.NewEncoder(w).Encode(h.stubs.Stubs()) if err != nil { @@ -71,7 +71,7 @@ func (h *Handler) handleStubs(w http.ResponseWriter, _ *http.Request) { } } -func (h *Handler) handleAddStub(w http.ResponseWriter, r *http.Request) { +func (h *Handler) addHandle(w http.ResponseWriter, r *http.Request) { // todo: add supported input array stub := new(storage.Stub) decoder := json.NewDecoder(r.Body) diff --git a/stub/stub.go b/stub/stub.go index 1aa41fce..05799410 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -2,7 +2,7 @@ package stub import ( "fmt" - "github.com/go-chi/chi" + "github.com/gorilla/mux" "github.com/tokopedia/gripmock/pkg/storage" "golang.org/x/text/cases" "golang.org/x/text/language" @@ -24,21 +24,23 @@ func RunStubServer(opt Options) { } addr := opt.BindAddr + ":" + opt.Port - handler := NewHandler() - - r := chi.NewRouter() - r.Get("/", handler.handleStubs) - r.Post("/add", handler.handleAddStub) - r.Post("/find", handler.handleFind) - r.Get("/purge", handler.handlePurge) - + api := NewHandler() if opt.StubPath != "" { - handler.readStubs(opt.StubPath) + api.readStubs(opt.StubPath) } + router := mux.NewRouter() + + apiRouter := router.PathPrefix("/api").Subrouter() + apiRouter.HandleFunc("/stubs/search", api.searchHandle).Methods("POST") + apiRouter.HandleFunc("/stubs", api.listHandle).Methods("GET") + apiRouter.HandleFunc("/stubs", api.addHandle).Methods("POST") + apiRouter.HandleFunc("/stubs", api.purgeHandle).Methods("DELETE") + fmt.Println("Serving stub admin on http://" + addr) go func() { - err := http.ListenAndServe(addr, r) + http.Handle("/", router) + err := http.ListenAndServe(addr, nil) log.Fatal(err) }() } From dbcdf3815933c96d45365a3c73001b314de36136 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Thu, 31 Aug 2023 20:26:45 +0300 Subject: [PATCH 27/74] optimize --- .gitignore | 1 + gripmock.go | 1 + pkg/sdk/client.go | 8 ++++++-- protoc-gen-gripmock/server.tmpl | 8 ++------ protogen/empty.go | 1 + 5 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 protogen/empty.go diff --git a/.gitignore b/.gitignore index aa6934c2..22ec995b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ gripmock .DS_Store protogen/* !protogen/go.mod +!protogen/empty.go !protogen/example/ temp \ No newline at end of file diff --git a/gripmock.go b/gripmock.go index d78f0521..289407cd 100644 --- a/gripmock.go +++ b/gripmock.go @@ -12,6 +12,7 @@ import ( "strings" "syscall" + _ "github.com/tokopedia/gripmock/protogen" "github.com/tokopedia/gripmock/stub" ) diff --git a/pkg/sdk/client.go b/pkg/sdk/client.go index 82f689f3..c699b9c1 100644 --- a/pkg/sdk/client.go +++ b/pkg/sdk/client.go @@ -28,7 +28,7 @@ type Response struct { Error string `json:"error"` } -func (c *StubApiClient) Search(payload Payload) (*Response, error) { +func (c *StubApiClient) Search(payload Payload) (any, error) { postBody, err := json.Marshal(payload) if err != nil { return nil, err @@ -55,5 +55,9 @@ func (c *StubApiClient) Search(payload Payload) (*Response, error) { return nil, err } - return result, nil + if result.Error != "" { + return nil, fmt.Errorf(result.Error) + } + + return result.Data, nil } diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 4efac43f..6267cc77 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -152,7 +152,7 @@ type response struct { func findStub(service, method string, in, out protoreflect.ProtoMessage) error { api := sdk.NewStubApiClient(fmt.Sprintf("http://localhost%s", HTTP_PORT), http.DefaultClient) - respRPC, err := api.Search(sdk.Payload{ + resp, err := api.Search(sdk.Payload{ Service: service, Method: method, Data: in, @@ -161,11 +161,7 @@ func findStub(service, method string, in, out protoreflect.ProtoMessage) error { return err } - if respRPC.Error != "" { - return fmt.Errorf(respRPC.Error) - } - - data, err := json.Marshal(respRPC.Data) + data, err := json.Marshal(resp) if err != nil { return err } diff --git a/protogen/empty.go b/protogen/empty.go new file mode 100644 index 00000000..356b3890 --- /dev/null +++ b/protogen/empty.go @@ -0,0 +1 @@ +package protogen From 5633ea2684d79d1a1177bcfa37705d44eb8beaaa Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Thu, 31 Aug 2023 20:48:36 +0300 Subject: [PATCH 28/74] refactoring --- go.mod | 1 + protoc-gen-gripmock/generator.go | 16 ++++++++-------- protogen/example/empty.go | 11 +++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 protogen/example/empty.go diff --git a/go.mod b/go.mod index e944b37b..e5cdad5f 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/lithammer/fuzzysearch v1.1.8 + github.com/tokopedia/gripmock/protogen v0.0.0 github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 google.golang.org/grpc v1.57.0 diff --git a/protoc-gen-gripmock/generator.go b/protoc-gen-gripmock/generator.go index bc906c06..1ef59c57 100644 --- a/protoc-gen-gripmock/generator.go +++ b/protoc-gen-gripmock/generator.go @@ -15,7 +15,7 @@ import ( "golang.org/x/tools/imports" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/proto" - descriptor "google.golang.org/protobuf/types/descriptorpb" + "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" ) @@ -40,7 +40,7 @@ func main() { plugin.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL) - protos := make([]*descriptor.FileDescriptorProto, len(plugin.Files)) + protos := make([]*descriptorpb.FileDescriptorProto, len(plugin.Files)) for index, file := range plugin.Files { protos[index] = file.Proto } @@ -129,7 +129,7 @@ func init() { ServerTemplate = string(data) } -func generateServer(protos []*descriptor.FileDescriptorProto, opt *Options) error { +func generateServer(protos []*descriptorpb.FileDescriptorProto, opt *Options) error { services := extractServices(protos) deps := resolveDependencies(protos) @@ -171,7 +171,7 @@ func generateServer(protos []*descriptor.FileDescriptorProto, opt *Options) erro return err } -func resolveDependencies(protos []*descriptor.FileDescriptorProto) map[string]string { +func resolveDependencies(protos []*descriptorpb.FileDescriptorProto) map[string]string { deps := map[string]string{} for _, proto := range protos { @@ -196,7 +196,7 @@ var aliases = map[string]bool{} var aliasNum = 1 var packages = map[string]string{} -func getGoPackage(proto *descriptor.FileDescriptorProto) (alias string, goPackage string) { +func getGoPackage(proto *descriptorpb.FileDescriptorProto) (alias string, goPackage string) { goPackage = proto.GetOptions().GetGoPackage() if goPackage == "" { return @@ -239,8 +239,8 @@ func getGoPackage(proto *descriptor.FileDescriptorProto) (alias string, goPackag } // change the structure also translate method type -func extractServices(protos []*descriptor.FileDescriptorProto) []Service { - svcTmp := []Service{} +func extractServices(protos []*descriptorpb.FileDescriptorProto) []Service { + var svcTmp []Service title := cases.Title(language.English, cases.NoLower) for _, proto := range protos { for _, svc := range proto.GetService() { @@ -277,7 +277,7 @@ func extractServices(protos []*descriptor.FileDescriptorProto) []Service { return svcTmp } -func getMessageType(protos []*descriptor.FileDescriptorProto, tipe string) string { +func getMessageType(protos []*descriptorpb.FileDescriptorProto, tipe string) string { split := strings.Split(tipe, ".")[1:] targetPackage := strings.Join(split[:len(split)-1], ".") targetType := split[len(split)-1] diff --git a/protogen/example/empty.go b/protogen/example/empty.go new file mode 100644 index 00000000..975dd7b4 --- /dev/null +++ b/protogen/example/empty.go @@ -0,0 +1,11 @@ +package example + +import ( + _ "google.golang.org/grpc" + _ "google.golang.org/grpc/codes" + _ "google.golang.org/grpc/status" + _ "google.golang.org/protobuf/reflect/protoreflect" + _ "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/apipb" + _ "google.golang.org/protobuf/types/known/emptypb" +) From 598562c0c9e1dbd10ab41da374ddb9b6f1c8afa3 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Thu, 31 Aug 2023 21:11:34 +0300 Subject: [PATCH 29/74] add intgrtest --- example/simple/client/main.go | 26 ++++++++++++++++++++++++++ example/simple/stub/simple2.yml | 9 +++++++++ example/simple/stub/simple3.yaml | 9 +++++++++ pkg/template/engine.go | 6 +++++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 example/simple/stub/simple2.yml create mode 100644 example/simple/stub/simple3.yaml diff --git a/example/simple/client/main.go b/example/simple/client/main.go index 60016cda..776fa3af 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -33,6 +33,9 @@ func main() { if err != nil { log.Fatalf("error from grpc: %v", err) } + if r.ReturnCode != 1 { + log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 1) + } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) name = "world" @@ -40,5 +43,28 @@ func main() { if err != nil { log.Fatalf("error from grpc: %v", err) } + if r.ReturnCode != 1 { + log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 1) + } + log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) + + name = "simple2" + r, err = c.SayHello(context.Background(), &pb.Request{Name: name}) + if err != nil { + log.Fatalf("error from grpc: %v", err) + } + if r.ReturnCode != 2 { + log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 2) + } + log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) + + name = "simple3" + r, err = c.SayHello(context.Background(), &pb.Request{Name: name}) + if err != nil { + log.Fatalf("error from grpc: %v", err) + } + if r.ReturnCode != 3 { + log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 3) + } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) } diff --git a/example/simple/stub/simple2.yml b/example/simple/stub/simple2.yml new file mode 100644 index 00000000..0a1526ad --- /dev/null +++ b/example/simple/stub/simple2.yml @@ -0,0 +1,9 @@ +- service: Gripmock + method: SayHello + input: + equals: + name: simple2 + output: + data: + message: Hello Simple2 + return_code: 2 diff --git a/example/simple/stub/simple3.yaml b/example/simple/stub/simple3.yaml new file mode 100644 index 00000000..df2356d8 --- /dev/null +++ b/example/simple/stub/simple3.yaml @@ -0,0 +1,9 @@ +- service: Gripmock + method: SayHello + input: + equals: + name: simple3 + output: + data: + message: Hello Simple3 + return_code: 3 diff --git a/pkg/template/engine.go b/pkg/template/engine.go index 796b6a28..c334664a 100644 --- a/pkg/template/engine.go +++ b/pkg/template/engine.go @@ -18,11 +18,15 @@ func New() *Engine { func (e *Engine) Execute(name string, data []byte) ([]byte, error) { var buffer bytes.Buffer - err := template.New(name).Funcs(e.funcMap()).Execute(&buffer, data) + parse, err := template.New(name).Funcs(e.funcMap()).Parse(string(data)) if err != nil { return nil, err } + if err := parse.Execute(&buffer, nil); err != nil { + return nil, err + } + return buffer.Bytes(), nil } From 7d69d0594952771ec01a19538e4aed7f36479358 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Thu, 31 Aug 2023 21:43:22 +0300 Subject: [PATCH 30/74] add healthcheck --- Dockerfile | 2 ++ go.mod | 2 ++ go.sum | 4 ++++ stub/actions.go | 28 +++++++++++++++++++--------- stub/stub.go | 11 ++++++++--- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index f5016e8a..e28d3343 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,4 +32,6 @@ WORKDIR /go/src/github.com/tokopedia/gripmock EXPOSE 4770 4771 +HEALTHCHECK CMD curl --fail http://127.0.0.1:4771/health + ENTRYPOINT ["gripmock"] diff --git a/go.mod b/go.mod index e5cdad5f..b0fb4574 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,9 @@ require ( require ( github.com/fatih/color v1.10.0 // indirect + github.com/felixge/httpsnoop v1.0.1 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/gorilla/handlers v1.5.1 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.12 // indirect golang.org/x/net v0.14.0 // indirect diff --git a/go.sum b/go.sum index 2bdb28a0..a30c928b 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= @@ -16,6 +18,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= diff --git a/stub/actions.go b/stub/actions.go index 8571d576..ab67cb65 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -14,7 +14,17 @@ import ( "golang.org/x/text/language" ) -type Handler struct { +type HealthcheckHandler struct{} + +func (*HealthcheckHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(200) +} + +func NewHealthcheckHandler() *HealthcheckHandler { + return &HealthcheckHandler{} +} + +type ApiHandler struct { stubs *storage.StubStorage convertor *yaml2json.Convertor } @@ -25,11 +35,11 @@ type findStubPayload struct { Data map[string]interface{} `json:"data"` } -func NewHandler() *Handler { - return &Handler{stubs: storage.New(), convertor: yaml2json.New()} +func NewApiHandler() *ApiHandler { + return &ApiHandler{stubs: storage.New(), convertor: yaml2json.New()} } -func (h *Handler) searchHandle(w http.ResponseWriter, r *http.Request) { +func (h *ApiHandler) searchHandle(w http.ResponseWriter, r *http.Request) { stub := new(findStubPayload) decoder := json.NewDecoder(r.Body) decoder.UseNumber() @@ -57,12 +67,12 @@ func (h *Handler) searchHandle(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(output) } -func (h *Handler) purgeHandle(w http.ResponseWriter, _ *http.Request) { +func (h *ApiHandler) purgeHandle(w http.ResponseWriter, _ *http.Request) { h.stubs.Purge() w.WriteHeader(204) } -func (h *Handler) listHandle(w http.ResponseWriter, _ *http.Request) { +func (h *ApiHandler) listHandle(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") err := json.NewEncoder(w).Encode(h.stubs.Stubs()) if err != nil { @@ -71,7 +81,7 @@ func (h *Handler) listHandle(w http.ResponseWriter, _ *http.Request) { } } -func (h *Handler) addHandle(w http.ResponseWriter, r *http.Request) { +func (h *ApiHandler) addHandle(w http.ResponseWriter, r *http.Request) { // todo: add supported input array stub := new(storage.Stub) decoder := json.NewDecoder(r.Body) @@ -97,13 +107,13 @@ func (h *Handler) addHandle(w http.ResponseWriter, r *http.Request) { } } -func (h *Handler) responseError(err error, w http.ResponseWriter) { +func (h *ApiHandler) responseError(err error, w http.ResponseWriter) { w.WriteHeader(500) _, _ = w.Write([]byte(err.Error())) } -func (h *Handler) readStubs(path string) { +func (h *ApiHandler) readStubs(path string) { files, err := os.ReadDir(path) if err != nil { log.Printf("Can't read stub from %s. %v\n", path, err) diff --git a/stub/stub.go b/stub/stub.go index 05799410..7bf60383 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -2,12 +2,14 @@ package stub import ( "fmt" + "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/tokopedia/gripmock/pkg/storage" "golang.org/x/text/cases" "golang.org/x/text/language" "log" "net/http" + "os" ) type Options struct { @@ -24,12 +26,15 @@ func RunStubServer(opt Options) { } addr := opt.BindAddr + ":" + opt.Port - api := NewHandler() + api := NewApiHandler() if opt.StubPath != "" { api.readStubs(opt.StubPath) } + healthcheck := NewHealthcheckHandler() + router := mux.NewRouter() + router.Handle("/health", healthcheck).Methods("GET") apiRouter := router.PathPrefix("/api").Subrouter() apiRouter.HandleFunc("/stubs/search", api.searchHandle).Methods("POST") @@ -39,8 +44,8 @@ func RunStubServer(opt Options) { fmt.Println("Serving stub admin on http://" + addr) go func() { - http.Handle("/", router) - err := http.ListenAndServe(addr, nil) + handler := handlers.CompressHandler(handlers.LoggingHandler(os.Stdout, router)) + err := http.ListenAndServe(addr, handler) log.Fatal(err) }() } From aefa76ab43e92255f81064bbfdaf60066416f187 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 18:25:01 +0300 Subject: [PATCH 31/74] returned api unit tests --- example/stream/client/main.go | 2 +- go.mod | 6 +- go.sum | 10 + gripmock.go | 11 +- stub/actions.go | 45 ++-- stub/api_test.go | 375 ++++++++++++++++++++++++++++++++++ stub/stub.go | 8 +- 7 files changed, 431 insertions(+), 26 deletions(-) create mode 100644 stub/api_test.go diff --git a/example/stream/client/main.go b/example/stream/client/main.go index 26fb2d7f..ed04e29f 100644 --- a/example/stream/client/main.go +++ b/example/stream/client/main.go @@ -128,5 +128,5 @@ func bidirectionalStream(c pb.GripmockClient, wg *sync.WaitGroup) { log.Fatalf("2ds error: %v", err) } } - stream.CloseSend() + _ = stream.CloseSend() } diff --git a/go.mod b/go.mod index b0fb4574..4503a23f 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,10 @@ go 1.21 require ( github.com/goccy/go-yaml v1.11.0 github.com/google/uuid v1.3.0 + github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/lithammer/fuzzysearch v1.1.8 + github.com/stretchr/testify v1.8.4 github.com/tokopedia/gripmock/protogen v0.0.0 github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 @@ -15,16 +17,18 @@ require ( ) require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/fatih/color v1.10.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/gorilla/handlers v1.5.1 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.12 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/net v0.14.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) // this is for generated server to be able to run diff --git a/go.sum b/go.sum index a30c928b..b4037591 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +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/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= @@ -30,6 +32,10 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +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/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -82,3 +88,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/gripmock.go b/gripmock.go index 289407cd..da8331b2 100644 --- a/gripmock.go +++ b/gripmock.go @@ -42,7 +42,9 @@ func main() { // for safety output += "/" if _, err := os.Stat(output); os.IsNotExist(err) { - os.Mkdir(output, os.ModePerm) + if err := os.Mkdir(output, os.ModePerm); err != nil { + log.Fatal(err) + } } // run admin stub server @@ -71,9 +73,6 @@ func main() { imports: importDirs, }) - // build the server - //buildServer(output) - // and run run, runerr := runGrpcServer(output) @@ -84,7 +83,9 @@ func main() { log.Fatal(err) case <-term: fmt.Println("Stopping gRPC Server") - run.Process.Kill() + if err := run.Process.Kill(); err != nil { + log.Fatal(err) + } } } diff --git a/stub/actions.go b/stub/actions.go index ab67cb65..0b094417 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -3,6 +3,7 @@ package stub import ( "bytes" "encoding/json" + "io" "log" "net/http" "os" @@ -39,7 +40,7 @@ func NewApiHandler() *ApiHandler { return &ApiHandler{stubs: storage.New(), convertor: yaml2json.New()} } -func (h *ApiHandler) searchHandle(w http.ResponseWriter, r *http.Request) { +func (h *ApiHandler) SearchHandle(w http.ResponseWriter, r *http.Request) { stub := new(findStubPayload) decoder := json.NewDecoder(r.Body) decoder.UseNumber() @@ -64,15 +65,15 @@ func (h *ApiHandler) searchHandle(w http.ResponseWriter, r *http.Request) { } w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(output) + _ = json.NewEncoder(w).Encode(output) } -func (h *ApiHandler) purgeHandle(w http.ResponseWriter, _ *http.Request) { +func (h *ApiHandler) PurgeHandle(w http.ResponseWriter, _ *http.Request) { h.stubs.Purge() w.WriteHeader(204) } -func (h *ApiHandler) listHandle(w http.ResponseWriter, _ *http.Request) { +func (h *ApiHandler) ListHandle(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") err := json.NewEncoder(w).Encode(h.stubs.Stubs()) if err != nil { @@ -81,27 +82,39 @@ func (h *ApiHandler) listHandle(w http.ResponseWriter, _ *http.Request) { } } -func (h *ApiHandler) addHandle(w http.ResponseWriter, r *http.Request) { - // todo: add supported input array - stub := new(storage.Stub) - decoder := json.NewDecoder(r.Body) - decoder.UseNumber() - - if err := decoder.Decode(stub); err != nil { +func (h *ApiHandler) AddHandle(w http.ResponseWriter, r *http.Request) { + byt, err := io.ReadAll(r.Body) + if err != nil { h.responseError(err, w) return } defer r.Body.Close() - if err := validateStub(stub); err != nil { + byt = bytes.TrimSpace(byt) + + if byt[0] == '{' && byt[len(byt)-1] == '}' { + byt = []byte("[" + string(byt) + "]") + } + + var stubs []*storage.Stub + decoder := json.NewDecoder(bytes.NewReader(byt)) + decoder.UseNumber() + + if err := decoder.Decode(&stubs); err != nil { h.responseError(err, w) return } + for _, stub := range stubs { + if err := validateStub(stub); err != nil { + h.responseError(err, w) + return + } + } + w.Header().Set("Content-Type", "application/json") - err := json.NewEncoder(w).Encode(h.stubs.Add(stub)) - if err != nil { + if err := json.NewEncoder(w).Encode(h.stubs.Add(stubs...)); err != nil { h.responseError(err, w) return } @@ -110,7 +123,9 @@ func (h *ApiHandler) addHandle(w http.ResponseWriter, r *http.Request) { func (h *ApiHandler) responseError(err error, w http.ResponseWriter) { w.WriteHeader(500) - _, _ = w.Write([]byte(err.Error())) + _ = json.NewEncoder(w).Encode(map[string]string{ + "error": err.Error(), + }) } func (h *ApiHandler) readStubs(path string) { diff --git a/stub/api_test.go b/stub/api_test.go new file mode 100644 index 00000000..9e1e19c4 --- /dev/null +++ b/stub/api_test.go @@ -0,0 +1,375 @@ +package stub_test + +import ( + "bytes" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/tokopedia/gripmock/stub" +) + +func TestStub(t *testing.T) { + type test struct { + name string + mock func() *http.Request + handler http.HandlerFunc + expect string + } + + api := stub.NewApiHandler() + + cases := []test{ + { + name: "add simple stub", + mock: func() *http.Request { + payload := `{ + "id": "43739ed8-2810-4f57-889b-4d3ff5795bce", + "service": "Testing", + "method":"TestMethod", + "input":{ + "equals":{ + "Hola":"Mundo" + } + }, + "output":{ + "data":{ + "Hello":"World" + } + } + }` + read := bytes.NewReader([]byte(payload)) + return httptest.NewRequest("POST", "/add", read) + }, + handler: api.AddHandle, + expect: `["43739ed8-2810-4f57-889b-4d3ff5795bce"]`, + }, + { + name: "list stub", + mock: func() *http.Request { + return httptest.NewRequest("GET", "/", nil) + }, + handler: api.ListHandle, + expect: "[{\"id\":\"43739ed8-2810-4f57-889b-4d3ff5795bce\",\"service\":\"Testing\",\"method\":\"TestMethod\",\"input\":{\"equals\":{\"Hola\":\"Mundo\"},\"contains\":null,\"matches\":null},\"output\":{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}}]", + }, + { + name: "find stub equals", + mock: func() *http.Request { + payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Mundo"}}` + return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", + }, + { + name: "add nested stub equals", + mock: func() *http.Request { + payload := `{ + "id": "b7211be4-06f7-4a2c-8453-359f077bcdb8", + "service": "NestedTesting", + "method":"TestMethod", + "input":{ + "equals":{ + "name": "Afra Gokce", + "age": 1, + "girl": true, + "null": null, + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "data":{ + "Hello":"World" + } + } + }` + read := bytes.NewReader([]byte(payload)) + return httptest.NewRequest("POST", "/add", read) + }, + handler: api.AddHandle, + expect: `["b7211be4-06f7-4a2c-8453-359f077bcdb8"]`, + }, + { + name: "find nested stub equals", + mock: func() *http.Request { + payload := `{"service":"NestedTesting","method":"TestMethod","data":{"name":"Afra Gokce","age":1,"girl":true,"null":null,"greetings":{"hola":"mundo","merhaba":"dunya"},"cities":["Istanbul","Jakarta"]}}` + return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", + }, + { + name: "add stub contains", + mock: func() *http.Request { + payload := `{ + "id": "b5e35447-45bb-4b71-8ab4-41ba5dda669c", + "service": "Testing", + "method":"TestMethod", + "input":{ + "contains":{ + "field1":"hello field1", + "field3":"hello field3" + } + }, + "output":{ + "data":{ + "hello":"world" + } + } + }` + return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["b5e35447-45bb-4b71-8ab4-41ba5dda669c"]`, + }, + { + name: "find stub contains", + mock: func() *http.Request { + payload := `{ + "service":"Testing", + "method":"TestMethod", + "data":{ + "field1":"hello field1", + "field2":"hello field2", + "field3":"hello field3" + } + }` + return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", + }, + { + name: "add nested stub contains", + mock: func() *http.Request { + payload := `{ + "id": "b8e354d9-a211-49c7-9947-b617e1689e0f", + "service": "NestedTesting", + "method":"TestMethod", + "input":{ + "contains":{ + "key": "value", + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "data":{ + "hello":"world" + } + } + }` + return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["b8e354d9-a211-49c7-9947-b617e1689e0f"]`, + }, + { + name: "add multi stub contains", + mock: func() *http.Request { + payload := `[{ + "id": "3f68f410-bb58-49ad-b679-23f2ed690c1d", + "service": "NestedTesting", + "method":"TestMethod", + "input":{ + "equals":{ + "key": "stab1", + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "data":{ + "hello":"world" + } + } + },{ + "id": "6da11d72-c0db-4075-9e72-31d61ffd0483", + "service": "NestedTesting", + "method":"TestMethod", + "input":{ + "equals":{ + "key": "stab2", + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "data":{ + "hello":"world" + } + } + }]` + return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["3f68f410-bb58-49ad-b679-23f2ed690c1d","6da11d72-c0db-4075-9e72-31d61ffd0483"]`, + }, + { + name: "find nested stub contains", + mock: func() *http.Request { + payload := `{ + "service":"NestedTesting", + "method":"TestMethod", + "data":{ + "key": "value", + "anotherKey": "anotherValue", + "greetings": { + "hola": "mundo", + "merhaba": "dunya", + "hello": "world" + }, + "cities": ["Istanbul", "Jakarta", "Winterfell"] + } + }` + return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", + }, + { + name: "add stub matches regex", + mock: func() *http.Request { + payload := `{ + "id": "faf39edb-c695-493f-a25e-ecfc171977dc", + "service":"Testing2", + "method":"TestMethod", + "input":{ + "matches":{ + "field1":".*ello$" + } + }, + "output":{ + "data":{ + "reply":"OK" + } + } + }` + return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["faf39edb-c695-493f-a25e-ecfc171977dc"]`, + }, + { + name: "find stub matches regex", + mock: func() *http.Request { + payload := `{ + "service":"Testing2", + "method":"TestMethod", + "data":{ + "field1":"hello" + } + }` + return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", + }, + { + name: "add nested stub matches regex", + mock: func() *http.Request { + payload := `{ + "id": "b1299ce3-a2a6-4fe7-94d4-0b68fc80afaa", + "service":"NestedTesting2", + "method":"TestMethod", + "input":{ + "matches":{ + "key": "[a-z]{3}ue", + "greetings": { + "hola": 1, + "merhaba": true, + "hello": "^he[l]{2,}o$" + }, + "cities": ["Istanbul", "Jakarta", ".*"], + "mixed": [5.5, false, ".*"] + } + }, + "output":{ + "data":{ + "reply":"OK" + } + } + }` + return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["b1299ce3-a2a6-4fe7-94d4-0b68fc80afaa"]`, + }, + { + name: "find nested stub matches regex", + mock: func() *http.Request { + payload := `{ + "service":"NestedTesting2", + "method":"TestMethod", + "data":{ + "key": "value", + "greetings": { + "hola": 1, + "merhaba": true, + "hello": "helllllo" + }, + "cities": ["Istanbul", "Jakarta", "Gotham"], + "mixed": [5.5, false, "Gotham"] + } + } + }` + return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", + }, + { + name: "error find stub contains", + mock: func() *http.Request { + payload := `{ + "service":"Testing", + "method":"TestMethod", + "data":{ + "field1":"hello field1" + } + }` + return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"field1\\\": \\\"hello field1\\\"\\n}\\n\\nClosest Match \\n\\ncontains:{\\n\\t\\\"field1\\\": \\\"hello field1\\\",\\n\\t\\\"field3\\\": \\\"hello field3\\\"\\n}\"}", + }, + { + name: "error find stub equals", + mock: func() *http.Request { + payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Dunia"}}` + return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"Hola\\\": \\\"Dunia\\\"\\n}\\n\\nClosest Match \\n\\nequals:{\\n\\t\\\"Hola\\\": \\\"Mundo\\\"\\n}\"}", + }, + } + + for _, v := range cases { + t.Run(v.name, func(t *testing.T) { + wrt := httptest.NewRecorder() + req := v.mock() + v.handler(wrt, req) + res, err := io.ReadAll(wrt.Result().Body) + + assert.NoError(t, err) + require.JSONEq(t, v.expect, string(res), string(res)) + }) + } +} diff --git a/stub/stub.go b/stub/stub.go index 7bf60383..10b6335e 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -37,10 +37,10 @@ func RunStubServer(opt Options) { router.Handle("/health", healthcheck).Methods("GET") apiRouter := router.PathPrefix("/api").Subrouter() - apiRouter.HandleFunc("/stubs/search", api.searchHandle).Methods("POST") - apiRouter.HandleFunc("/stubs", api.listHandle).Methods("GET") - apiRouter.HandleFunc("/stubs", api.addHandle).Methods("POST") - apiRouter.HandleFunc("/stubs", api.purgeHandle).Methods("DELETE") + apiRouter.HandleFunc("/stubs/search", api.SearchHandle).Methods("POST") + apiRouter.HandleFunc("/stubs", api.ListHandle).Methods("GET") + apiRouter.HandleFunc("/stubs", api.AddHandle).Methods("POST") + apiRouter.HandleFunc("/stubs", api.PurgeHandle).Methods("DELETE") fmt.Println("Serving stub admin on http://" + addr) go func() { From 61d3b027e1c8045e8aacec731d60f74f1c7cba5e Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 18:27:40 +0300 Subject: [PATCH 32/74] fix http code --- stub/actions.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/stub/actions.go b/stub/actions.go index 0b094417..56691bf7 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -60,7 +60,8 @@ func (h *ApiHandler) SearchHandle(w http.ResponseWriter, r *http.Request) { output, err := findStub(h.stubs, stub) if err != nil { log.Println(err) - h.responseError(err, w) + w.WriteHeader(404) + h.writeResponseError(err, w) return } @@ -123,6 +124,10 @@ func (h *ApiHandler) AddHandle(w http.ResponseWriter, r *http.Request) { func (h *ApiHandler) responseError(err error, w http.ResponseWriter) { w.WriteHeader(500) + h.writeResponseError(err, w) +} + +func (h *ApiHandler) writeResponseError(err error, w http.ResponseWriter) { _ = json.NewEncoder(w).Encode(map[string]string{ "error": err.Error(), }) From 4fff367479d6ea983a7d71a59bd0d8f23d1f7588 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 20:10:45 +0300 Subject: [PATCH 33/74] mini refactoring --- stub/storage.go | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/stub/storage.go b/stub/storage.go index 33a35e6b..501dea7e 100644 --- a/stub/storage.go +++ b/stub/storage.go @@ -154,31 +154,24 @@ func matches(expect, actual map[string]interface{}) bool { } func find(expect, actual interface{}, acc, exactMatch bool, f matchFunc) bool { - // circuit brake if !acc { return false } - expectArrayValue, expectArrayOk := expect.([]interface{}) - if expectArrayOk { + if expectArrayValue, expectArrayOk := expect.([]interface{}); expectArrayOk { actualArrayValue, actualArrayOk := actual.([]interface{}) if !actualArrayOk { - acc = false - return acc + return false } if exactMatch { if len(expectArrayValue) != len(actualArrayValue) { - acc = false - return acc - } - } else { - if len(expectArrayValue) > len(actualArrayValue) { - acc = false - return acc + return false } + } else if len(expectArrayValue) > len(actualArrayValue) { + return false } for expectItemIndex, expectItemValue := range expectArrayValue { @@ -189,25 +182,18 @@ func find(expect, actual interface{}, acc, exactMatch bool, f matchFunc) bool { return acc } - expectMapValue, expectMapOk := expect.(map[string]interface{}) - if expectMapOk { - + if expectMapValue, expectMapOk := expect.(map[string]interface{}); expectMapOk { actualMapValue, actualMapOk := actual.(map[string]interface{}) if !actualMapOk { - acc = false - return acc + return false } if exactMatch { if len(expectMapValue) != len(actualMapValue) { - acc = false - return acc - } - } else { - if len(expectMapValue) > len(actualMapValue) { - acc = false - return acc + return false } + } else if len(expectMapValue) > len(actualMapValue) { + return false } for expectItemKey, expectItemValue := range expectMapValue { From 0a2de0ea46911e64625fea11228d84765a709794 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 20:24:53 +0300 Subject: [PATCH 34/74] add unit --- stub/api_test.go | 53 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/stub/api_test.go b/stub/api_test.go index 9e1e19c4..f781e13d 100644 --- a/stub/api_test.go +++ b/stub/api_test.go @@ -43,7 +43,7 @@ func TestStub(t *testing.T) { } }` read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/add", read) + return httptest.NewRequest("POST", "/api/stubs", read) }, handler: api.AddHandle, expect: `["43739ed8-2810-4f57-889b-4d3ff5795bce"]`, @@ -51,7 +51,7 @@ func TestStub(t *testing.T) { { name: "list stub", mock: func() *http.Request { - return httptest.NewRequest("GET", "/", nil) + return httptest.NewRequest("GET", "/api/stubs", nil) }, handler: api.ListHandle, expect: "[{\"id\":\"43739ed8-2810-4f57-889b-4d3ff5795bce\",\"service\":\"Testing\",\"method\":\"TestMethod\",\"input\":{\"equals\":{\"Hola\":\"Mundo\"},\"contains\":null,\"matches\":null},\"output\":{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}}]", @@ -60,7 +60,7 @@ func TestStub(t *testing.T) { name: "find stub equals", mock: func() *http.Request { payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Mundo"}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", @@ -92,7 +92,7 @@ func TestStub(t *testing.T) { } }` read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/add", read) + return httptest.NewRequest("POST", "/api/stubs", read) }, handler: api.AddHandle, expect: `["b7211be4-06f7-4a2c-8453-359f077bcdb8"]`, @@ -101,7 +101,7 @@ func TestStub(t *testing.T) { name: "find nested stub equals", mock: func() *http.Request { payload := `{"service":"NestedTesting","method":"TestMethod","data":{"name":"Afra Gokce","age":1,"girl":true,"null":null,"greetings":{"hola":"mundo","merhaba":"dunya"},"cities":["Istanbul","Jakarta"]}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", @@ -125,7 +125,7 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b5e35447-45bb-4b71-8ab4-41ba5dda669c"]`, @@ -142,7 +142,7 @@ func TestStub(t *testing.T) { "field3":"hello field3" } }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", @@ -170,7 +170,7 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b8e354d9-a211-49c7-9947-b617e1689e0f"]`, @@ -217,7 +217,7 @@ func TestStub(t *testing.T) { } } }]` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["3f68f410-bb58-49ad-b679-23f2ed690c1d","6da11d72-c0db-4075-9e72-31d61ffd0483"]`, @@ -239,7 +239,7 @@ func TestStub(t *testing.T) { "cities": ["Istanbul", "Jakarta", "Winterfell"] } }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", @@ -262,7 +262,7 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["faf39edb-c695-493f-a25e-ecfc171977dc"]`, @@ -277,7 +277,7 @@ func TestStub(t *testing.T) { "field1":"hello" } }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", @@ -307,7 +307,7 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/add", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b1299ce3-a2a6-4fe7-94d4-0b68fc80afaa"]`, @@ -330,7 +330,7 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", @@ -345,7 +345,7 @@ func TestStub(t *testing.T) { "field1":"hello field1" } }` - return httptest.NewRequest("GET", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"field1\\\": \\\"hello field1\\\"\\n}\\n\\nClosest Match \\n\\ncontains:{\\n\\t\\\"field1\\\": \\\"hello field1\\\",\\n\\t\\\"field3\\\": \\\"hello field3\\\"\\n}\"}", @@ -354,7 +354,7 @@ func TestStub(t *testing.T) { name: "error find stub equals", mock: func() *http.Request { payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Dunia"}}` - return httptest.NewRequest("POST", "/find", bytes.NewReader([]byte(payload))) + return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"Hola\\\": \\\"Dunia\\\"\\n}\\n\\nClosest Match \\n\\nequals:{\\n\\t\\\"Hola\\\": \\\"Mundo\\\"\\n}\"}", @@ -369,7 +369,26 @@ func TestStub(t *testing.T) { res, err := io.ReadAll(wrt.Result().Body) assert.NoError(t, err) - require.JSONEq(t, v.expect, string(res), string(res)) + require.JSONEq(t, v.expect, string(res)) }) } + + t.Run("purge handler", func(t *testing.T) { + deleteWrt := httptest.NewRecorder() + deleteReq := httptest.NewRequest("DELETE", "/api/stubs", nil) + + api.PurgeHandle(deleteWrt, deleteReq) + + listWrt := httptest.NewRecorder() + listReq := httptest.NewRequest("GET", "/api/stubs", nil) + + api.ListHandle(listWrt, listReq) + + res, err := io.ReadAll(listWrt.Result().Body) + + assert.NoError(t, err) + require.Equal(t, http.StatusNoContent, deleteWrt.Result().StatusCode) + + require.JSONEq(t, "[]", string(res)) + }) } From 577e2d97daaddfed85324974b775127a0a7a6af1 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 21:54:21 +0300 Subject: [PATCH 35/74] add pkg unit --- pkg/yaml2json/{template.go => convertor.go} | 5 ++-- pkg/yaml2json/convertor_test.go | 26 +++++++++++++++++++++ pkg/{template => yaml2json}/engine.go | 18 +++++++------- 3 files changed, 36 insertions(+), 13 deletions(-) rename pkg/yaml2json/{template.go => convertor.go} (72%) create mode 100644 pkg/yaml2json/convertor_test.go rename pkg/{template => yaml2json}/engine.go (77%) diff --git a/pkg/yaml2json/template.go b/pkg/yaml2json/convertor.go similarity index 72% rename from pkg/yaml2json/template.go rename to pkg/yaml2json/convertor.go index 3e4dc41f..aa66fb28 100644 --- a/pkg/yaml2json/template.go +++ b/pkg/yaml2json/convertor.go @@ -2,15 +2,14 @@ package yaml2json import ( "github.com/goccy/go-yaml" - "github.com/tokopedia/gripmock/pkg/template" ) type Convertor struct { - engine *template.Engine + engine *engine } func New() *Convertor { - return &Convertor{engine: template.New()} + return &Convertor{engine: &engine{}} } func (t *Convertor) Execute(name string, data []byte) ([]byte, error) { diff --git a/pkg/yaml2json/convertor_test.go b/pkg/yaml2json/convertor_test.go new file mode 100644 index 00000000..9658181f --- /dev/null +++ b/pkg/yaml2json/convertor_test.go @@ -0,0 +1,26 @@ +package yaml2json_test + +import ( + "github.com/stretchr/testify/require" + "github.com/tokopedia/gripmock/pkg/yaml2json" + "testing" +) + +func TestConvertor(t *testing.T) { + convertor := yaml2json.New() + + bytes, err := convertor.Execute("hello", []byte(` +yaml2json: + base64: {{ uuidToBase64StdEncoding "77465064-a0ce-48a3-b7e4-d50f88e55093" }} + highLow: {{ uuidToHighLowLittleEndian "e351220b-4847-42f5-8abb-c052b87ff2d4" }} +`)) + + expected := `{ + "yaml2json": { + "base64": "d0ZQZKDOSKO35NUPiOVQkw==", + "highLow": {"high":-773977811204288029,"low":-3102276763665777782} + } +}` + require.NoError(t, err) + require.JSONEq(t, expected, string(bytes)) +} diff --git a/pkg/template/engine.go b/pkg/yaml2json/engine.go similarity index 77% rename from pkg/template/engine.go rename to pkg/yaml2json/engine.go index c334664a..6624955c 100644 --- a/pkg/template/engine.go +++ b/pkg/yaml2json/engine.go @@ -1,4 +1,4 @@ -package template +package yaml2json import ( "bytes" @@ -9,13 +9,9 @@ import ( "github.com/google/uuid" ) -type Engine struct{} +type engine struct{} -func New() *Engine { - return &Engine{} -} - -func (e *Engine) Execute(name string, data []byte) ([]byte, error) { +func (e *engine) Execute(name string, data []byte) ([]byte, error) { var buffer bytes.Buffer parse, err := template.New(name).Funcs(e.funcMap()).Parse(string(data)) @@ -30,10 +26,12 @@ func (e *Engine) Execute(name string, data []byte) ([]byte, error) { return buffer.Bytes(), nil } -func (e *Engine) funcMap() template.FuncMap { +func (e *engine) funcMap() template.FuncMap { return template.FuncMap{ - "base64StdEncoding": func(str string) string { - return base64.StdEncoding.EncodeToString([]byte(str)) + "uuidToBase64StdEncoding": func(guid string) string { + v := uuid.MustParse(guid) + + return base64.StdEncoding.EncodeToString(v[:]) }, "uuidToHighLowLittleEndian": func(guid string) string { v := uuid.MustParse(guid) From 0c1653863c9bb6daaeb63f05dafbf75ceaffef9f Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 22:07:21 +0300 Subject: [PATCH 36/74] short naming --- pkg/yaml2json/convertor_test.go | 4 ++-- pkg/yaml2json/engine.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/yaml2json/convertor_test.go b/pkg/yaml2json/convertor_test.go index 9658181f..de31ab6e 100644 --- a/pkg/yaml2json/convertor_test.go +++ b/pkg/yaml2json/convertor_test.go @@ -11,8 +11,8 @@ func TestConvertor(t *testing.T) { bytes, err := convertor.Execute("hello", []byte(` yaml2json: - base64: {{ uuidToBase64StdEncoding "77465064-a0ce-48a3-b7e4-d50f88e55093" }} - highLow: {{ uuidToHighLowLittleEndian "e351220b-4847-42f5-8abb-c052b87ff2d4" }} + base64: {{ uuid2base64 "77465064-a0ce-48a3-b7e4-d50f88e55093" }} + highLow: {{ uuid2highLow "e351220b-4847-42f5-8abb-c052b87ff2d4" }} `)) expected := `{ diff --git a/pkg/yaml2json/engine.go b/pkg/yaml2json/engine.go index 6624955c..a4439c09 100644 --- a/pkg/yaml2json/engine.go +++ b/pkg/yaml2json/engine.go @@ -28,12 +28,12 @@ func (e *engine) Execute(name string, data []byte) ([]byte, error) { func (e *engine) funcMap() template.FuncMap { return template.FuncMap{ - "uuidToBase64StdEncoding": func(guid string) string { + "uuid2base64": func(guid string) string { v := uuid.MustParse(guid) return base64.StdEncoding.EncodeToString(v[:]) }, - "uuidToHighLowLittleEndian": func(guid string) string { + "uuid2highLow": func(guid string) string { v := uuid.MustParse(guid) high := int64(v[0]) | int64(v[1])<<8 | int64(v[2])<<16 | int64(v[3])<<24 | From 93a6c730692f792d5cad2567aa49260b9c0e09e3 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 22:11:23 +0300 Subject: [PATCH 37/74] add .golangci.yml --- .golangci.yml | 37 +++++++++++++++++++ Dockerfile | 12 +++--- LICENSE | 2 +- Readme.md | 6 +-- example/multi-files/client/main.go | 6 +-- example/multi-files/file1.proto | 2 +- example/multi-files/file2.proto | 2 +- example/multi-files/stub/greet1.json | 4 +- example/multi-files/stub/greet2.json | 4 +- example/multi-package/bar/bar.proto | 2 +- example/multi-package/client/main.go | 6 +-- example/multi-package/stub/simple.json | 4 +- example/one-of/client/main.go | 4 +- example/one-of/oneof.proto | 2 +- example/one-of/stub/oneof.json | 2 +- example/simple/client/main.go | 4 +- example/simple/simple.proto | 2 +- example/simple/stub/simple.json | 4 +- example/stream/client/main.go | 2 +- example/stream/stream.proto | 2 +- example/stub-subfolders/client/main.go | 6 +-- example/stub-subfolders/stub/stub.json | 4 +- .../stub/subfolder1/stub-in-subfolder.json | 4 +- example/well_known_types/client/main.go | 2 +- example/well_known_types/wkt.proto | 2 +- fix_gopackage.sh | 2 +- go.mod | 10 ++--- gripmock.go | 4 +- pkg/yaml2json/convertor_test.go | 2 +- protoc-gen-gripmock/go.mod | 2 +- protoc-gen-gripmock/server.tmpl | 2 +- protogen/example/go.mod | 2 +- protogen/example/multi-files/file1.proto | 2 +- protogen/example/multi-files/file2.proto | 2 +- protogen/example/multi-package/bar/bar.proto | 2 +- protogen/example/multi-package/foo.proto | 2 +- protogen/example/multi-package/hello.pb.go | 2 +- protogen/example/multi-package/hello.proto | 2 +- .../example/multi-package/hello_grpc.pb.go | 2 +- protogen/example/one-of/oneof.proto | 2 +- protogen/example/simple/simple.proto | 2 +- protogen/example/stream/stream.proto | 2 +- .../stub-subfolders/stub-subfolders.proto | 2 +- protogen/example/well_known_types/wkt.proto | 2 +- protogen/go.mod | 2 +- stub/actions.go | 4 +- stub/api_test.go | 2 +- stub/storage.go | 2 +- stub/stub.go | 2 +- 49 files changed, 112 insertions(+), 75 deletions(-) create mode 100644 .golangci.yml diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..8d48da74 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,37 @@ +run: + timeout: 1m +linters: + enable-all: true + disable: + # deprecated + - nosnakecase + - structcheck + - interfacer + - deadcode + - exhaustivestruct + - maligned + - ifshort + - varcheck + - golint + - scopelint + # not relevant + - varnamelen +linters-settings: + lll: + line-length: 160 + gci: + sections: + - Standard + - Default + - Prefix(github.com/bavix) + depguard: + rules: + main: + allow: + - $gostd + - github.com +issues: + exclude-rules: + - path: (.+)_test.go + linters: + - dupl \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e28d3343..c8a67f0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,20 +15,20 @@ RUN apk -U --no-cache add bash git protobuf &&\ apk del git &&\ apk -v cache clean -COPY . /go/src/github.com/tokopedia/gripmock +COPY . /go/src/github.com/bavix/gripmock # create necessary dirs and export fix_gopackage.sh RUN mkdir /proto /stubs &&\ - ln -s /go/src/github.com/tokopedia/gripmock/fix_gopackage.sh /bin/ + ln -s /go/src/github.com/bavix/gripmock/fix_gopackage.sh /bin/ -RUN cd /go/src/github.com/tokopedia/gripmock/protoc-gen-gripmock &&\ +RUN cd /go/src/github.com/bavix/gripmock/protoc-gen-gripmock &&\ go install -v &&\ - cd /go/src/github.com/tokopedia/gripmock/example/simple/client &&\ + cd /go/src/github.com/bavix/gripmock/example/simple/client &&\ go get -u all &&\ - cd /go/src/github.com/tokopedia/gripmock &&\ + cd /go/src/github.com/bavix/gripmock &&\ go install -v -WORKDIR /go/src/github.com/tokopedia/gripmock +WORKDIR /go/src/github.com/bavix/gripmock EXPOSE 4770 4771 diff --git a/LICENSE b/LICENSE index 0c85926b..ab0be2c7 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 PT Tokopedia + Copyright 2019 PT bavix Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Readme.md b/Readme.md index 82dc062b..aa89e6b5 100644 --- a/Readme.md +++ b/Readme.md @@ -6,11 +6,11 @@ The server implementation is in GoLang but the client can be any programming lan --- ### Announcement: -The latest [version (v1.10)](https://github.com/tokopedia/gripmock/releases/tag/v1.10) of gripmock is requiring `go_package` declaration in the `.proto` file. This is due to the latest update of `protoc` plugin that being used by gripmock is making the `go_package` declaration mandatory. +The latest [version (v1.10)](https://github.com/bavix/gripmock/releases/tag/v1.10) of gripmock is requiring `go_package` declaration in the `.proto` file. This is due to the latest update of `protoc` plugin that being used by gripmock is making the `go_package` declaration mandatory. **Update Feb 2022:** -[Version 1.11-beta](https://github.com/tokopedia/gripmock/releases/tag/v1.11-beta) release is available. +[Version 1.11-beta](https://github.com/bavix/gripmock/releases/tag/v1.11-beta) release is available. It supports **NO** declaration of `go_package`, please download and test before it can be tagged as stable. you can get the docker image using `docker pull tkpd/gripmock:v1.11-beta`. @@ -28,7 +28,7 @@ basic syntax to run GripMock is - On a separate terminal we are gonna add a stub into the stub service. Run `curl -X POST -d '{"service":"Gripmock","method":"SayHello","input":{"equals":{"name":"gripmock"}},"output":{"data":{"message":"Hello GripMock"}}}' localhost:4771/add ` - Now we are ready to test it with our client. You can find a client example file under `example/simple/client/`. Execute one of your preferred language. Example for go: `go run example/simple/client/*.go` -Check [`example`](https://github.com/tokopedia/gripmock/tree/master/example) folder for various usecase of gripmock. +Check [`example`](https://github.com/bavix/gripmock/tree/master/example) folder for various usecase of gripmock. --- diff --git a/example/multi-files/client/main.go b/example/multi-files/client/main.go index 7eca2024..ba6dfb14 100644 --- a/example/multi-files/client/main.go +++ b/example/multi-files/client/main.go @@ -5,7 +5,7 @@ import ( "log" "time" - pb "github.com/tokopedia/gripmock/protogen/example/multi-files" + pb "github.com/bavix/gripmock/protogen/example/multi-files" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -24,7 +24,7 @@ func main() { c := pb.NewGripmock1Client(conn) // Contact the server and print out its response. - r, err := c.SayHello(context.Background(), &pb.Request1{Name: "tokopedia"}) + r, err := c.SayHello(context.Background(), &pb.Request1{Name: "bavix"}) if err != nil { log.Fatalf("error from grpc: %v", err) } @@ -33,7 +33,7 @@ func main() { c2 := pb.NewGripmock2Client(conn) // Contact the server and print out its response. - r2, err := c2.SayHello(context.Background(), &pb.Request2{Name: "tokopedia"}) + r2, err := c2.SayHello(context.Background(), &pb.Request2{Name: "bavix"}) if err != nil { log.Fatalf("error from grpc: %v", err) } diff --git a/example/multi-files/file1.proto b/example/multi-files/file1.proto index 4b9056a6..097d5147 100644 --- a/example/multi-files/file1.proto +++ b/example/multi-files/file1.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package multifiles; -option go_package = "github.com/tokopedia/gripmock/example/multi-files"; +option go_package = "github.com/bavix/gripmock/example/multi-files"; // The Gripmock service definition. service Gripmock1 { // simple unary method diff --git a/example/multi-files/file2.proto b/example/multi-files/file2.proto index c62380c5..b014ab57 100644 --- a/example/multi-files/file2.proto +++ b/example/multi-files/file2.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package multifiles; -option go_package = "github.com/tokopedia/gripmock/example/multi-files"; +option go_package = "github.com/bavix/gripmock/example/multi-files"; service Gripmock2 { // simple unary method rpc SayHello (Request2) returns (Reply2); diff --git a/example/multi-files/stub/greet1.json b/example/multi-files/stub/greet1.json index 1d220379..9b988d40 100644 --- a/example/multi-files/stub/greet1.json +++ b/example/multi-files/stub/greet1.json @@ -3,12 +3,12 @@ "method": "SayHello", "input": { "equals": { - "name": "tokopedia" + "name": "bavix" } }, "output": { "data": { - "message": "Hello Tokopedia 1", + "message": "Hello bavix 1", "return_code": 1 } } diff --git a/example/multi-files/stub/greet2.json b/example/multi-files/stub/greet2.json index e902237a..b5ed55e3 100644 --- a/example/multi-files/stub/greet2.json +++ b/example/multi-files/stub/greet2.json @@ -3,12 +3,12 @@ "method": "SayHello", "input": { "equals": { - "name": "tokopedia" + "name": "bavix" } }, "output": { "data": { - "message": "Hello Tokopedia 2", + "message": "Hello bavix 2", "return_code": 1 } } diff --git a/example/multi-package/bar/bar.proto b/example/multi-package/bar/bar.proto index 49c22ccf..3d549815 100644 --- a/example/multi-package/bar/bar.proto +++ b/example/multi-package/bar/bar.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package bar; // this go_package is simulating alias collision -option go_package = "github.com/tokopedia/gripmock/example/multi-package/bar;multi_package"; +option go_package = "github.com/bavix/gripmock/example/multi-package/bar;multi_package"; message Bar{ string name = 1; diff --git a/example/multi-package/client/main.go b/example/multi-package/client/main.go index a39fee11..b07135be 100644 --- a/example/multi-package/client/main.go +++ b/example/multi-package/client/main.go @@ -6,8 +6,8 @@ import ( "os" "time" - pb "github.com/tokopedia/gripmock/protogen/example/multi-package" - multi_package "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" + pb "github.com/bavix/gripmock/protogen/example/multi-package" + multi_package "github.com/bavix/gripmock/protogen/example/multi-package/bar" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -26,7 +26,7 @@ func main() { c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - name := "tokopedia" + name := "bavix" if len(os.Args) > 1 { name = os.Args[1] } diff --git a/example/multi-package/stub/simple.json b/example/multi-package/stub/simple.json index 01d3451d..af4d6263 100644 --- a/example/multi-package/stub/simple.json +++ b/example/multi-package/stub/simple.json @@ -3,12 +3,12 @@ "method":"Greet", "input":{ "equals":{ - "name":"tokopedia" + "name":"bavix" } }, "output":{ "data":{ - "response":"Hello Tokopedia" + "response":"Hello bavix" } } } \ No newline at end of file diff --git a/example/one-of/client/main.go b/example/one-of/client/main.go index 7cf46820..1fa93501 100644 --- a/example/one-of/client/main.go +++ b/example/one-of/client/main.go @@ -6,7 +6,7 @@ import ( "os" "time" - oneof "github.com/tokopedia/gripmock/protogen/example/one-of" + oneof "github.com/bavix/gripmock/protogen/example/one-of" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -25,7 +25,7 @@ func main() { c := oneof.NewGripmockClient(conn) // Contact the server and print out its response. - name := "tokopedia" + name := "bavix" if len(os.Args) > 1 { name = os.Args[1] } diff --git a/example/one-of/oneof.proto b/example/one-of/oneof.proto index ca15d967..556652d0 100644 --- a/example/one-of/oneof.proto +++ b/example/one-of/oneof.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package oneof; -option go_package = "github.com/tokopedia/gripmock/example/one-of"; +option go_package = "github.com/bavix/gripmock/example/one-of"; // The Gripmock service definition. service Gripmock { diff --git a/example/one-of/stub/oneof.json b/example/one-of/stub/oneof.json index 82e2f56f..895ce82b 100644 --- a/example/one-of/stub/oneof.json +++ b/example/one-of/stub/oneof.json @@ -3,7 +3,7 @@ "method":"SayHello", "input":{ "equals":{ - "name":"tokopedia" + "name":"bavix" } }, "output":{ diff --git a/example/simple/client/main.go b/example/simple/client/main.go index 776fa3af..7e4bce94 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -6,7 +6,7 @@ import ( "os" "time" - pb "github.com/tokopedia/gripmock/protogen/example/simple" + pb "github.com/bavix/gripmock/protogen/example/simple" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -25,7 +25,7 @@ func main() { c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - name := "tokopedia" + name := "bavix" if len(os.Args) > 1 { name = os.Args[1] } diff --git a/example/simple/simple.proto b/example/simple/simple.proto index f1cc994c..5e6adb54 100644 --- a/example/simple/simple.proto +++ b/example/simple/simple.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package simple; -option go_package = "github.com/tokopedia/gripmock/example/simple"; +option go_package = "github.com/bavix/gripmock/example/simple"; // The Gripmock service definition. service Gripmock { diff --git a/example/simple/stub/simple.json b/example/simple/stub/simple.json index 2438a3c9..11af8a8a 100644 --- a/example/simple/stub/simple.json +++ b/example/simple/stub/simple.json @@ -4,12 +4,12 @@ "method": "SayHello", "input": { "equals": { - "name": "tokopedia" + "name": "bavix" } }, "output": { "data": { - "message": "Hello Tokopedia", + "message": "Hello bavix", "return_code": 1 } } diff --git a/example/stream/client/main.go b/example/stream/client/main.go index ed04e29f..908e89bb 100644 --- a/example/stream/client/main.go +++ b/example/stream/client/main.go @@ -7,7 +7,7 @@ import ( "sync" "time" - pb "github.com/tokopedia/gripmock/protogen/example/stream" + pb "github.com/bavix/gripmock/protogen/example/stream" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) diff --git a/example/stream/stream.proto b/example/stream/stream.proto index a1c10f13..833bc9ae 100644 --- a/example/stream/stream.proto +++ b/example/stream/stream.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package stream; -option go_package = "github.com/tokopedia/gripmock/example/stream"; +option go_package = "github.com/bavix/gripmock/example/stream"; // The Gripmock service definition. service Gripmock { // server to client sreaming diff --git a/example/stub-subfolders/client/main.go b/example/stub-subfolders/client/main.go index d861bc36..9ae8029a 100644 --- a/example/stub-subfolders/client/main.go +++ b/example/stub-subfolders/client/main.go @@ -5,7 +5,7 @@ import ( "log" "time" - pb "github.com/tokopedia/gripmock/protogen/example/stub-subfolders" + pb "github.com/bavix/gripmock/protogen/example/stub-subfolders" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -24,13 +24,13 @@ func main() { c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - r, err := c.SayHello(context.Background(), &pb.Request{Name: "tokopedia"}) + r, err := c.SayHello(context.Background(), &pb.Request{Name: "bavix"}) if err != nil { log.Fatalf("error from grpc: %v", err) } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) - r, err = c.SayHello(context.Background(), &pb.Request{Name: "subtokopedia"}) + r, err = c.SayHello(context.Background(), &pb.Request{Name: "subbavix"}) if err != nil { log.Fatalf("error from grpc: %v", err) } diff --git a/example/stub-subfolders/stub/stub.json b/example/stub-subfolders/stub/stub.json index 6bbf0913..2702b5c1 100644 --- a/example/stub-subfolders/stub/stub.json +++ b/example/stub-subfolders/stub/stub.json @@ -3,12 +3,12 @@ "method": "SayHello", "input": { "equals": { - "name": "tokopedia" + "name": "bavix" } }, "output": { "data": { - "message": "Hello Tokopedia", + "message": "Hello bavix", "return_code": 1 } } diff --git a/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json b/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json index c4a1e92b..ad696214 100644 --- a/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json +++ b/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json @@ -3,12 +3,12 @@ "method": "SayHello", "input": { "equals": { - "name": "subtokopedia" + "name": "subbavix" } }, "output": { "data": { - "message": "Hello Sub Tokopedia", + "message": "Hello Sub bavix", "return_code": 1 } } diff --git a/example/well_known_types/client/main.go b/example/well_known_types/client/main.go index 4b21eb0f..7e8b35a2 100644 --- a/example/well_known_types/client/main.go +++ b/example/well_known_types/client/main.go @@ -5,7 +5,7 @@ import ( "log" "time" - pb "github.com/tokopedia/gripmock/protogen/example/well_known_types" + pb "github.com/bavix/gripmock/protogen/example/well_known_types" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" empty "google.golang.org/protobuf/types/known/emptypb" diff --git a/example/well_known_types/wkt.proto b/example/well_known_types/wkt.proto index 9884d959..dfeb3f86 100644 --- a/example/well_known_types/wkt.proto +++ b/example/well_known_types/wkt.proto @@ -5,7 +5,7 @@ package well_known_types; import "google/protobuf/empty.proto"; import "google/protobuf/api.proto"; -option go_package = "github.com/tokopedia/gripmock/example/well_known_types;wkt"; +option go_package = "github.com/bavix/gripmock/example/well_known_types;wkt"; service Gripmock { // this shows us example on using WKT as dependency // api.proto in particular has go_package alias with semicolon diff --git a/fix_gopackage.sh b/fix_gopackage.sh index 026f9ceb..79bef9c9 100755 --- a/fix_gopackage.sh +++ b/fix_gopackage.sh @@ -37,7 +37,7 @@ do # get the line number of "syntax" declaration syntaxLineNum="$(grep -n "syntax" "$newfile" | head -n 1 | cut -d: -f1)" - goPackageString="option go_package = \"github.com/tokopedia/gripmock/protogen/$dir\";" + goPackageString="option go_package = \"github.com/bavix/gripmock/protogen/$dir\";" # append our own go_package delcaration just below "syntax" declaration sed -i "${syntaxLineNum}s~$~\n$goPackageString~" $newfile diff --git a/go.mod b/go.mod index 4503a23f..d62426a8 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,16 @@ -module github.com/tokopedia/gripmock +module github.com/bavix/gripmock go 1.21 require ( + github.com/bavix/gripmock/protogen v0.0.0 + github.com/bavix/gripmock/protogen/example v0.0.0 github.com/goccy/go-yaml v1.11.0 github.com/google/uuid v1.3.0 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/lithammer/fuzzysearch v1.1.8 github.com/stretchr/testify v1.8.4 - github.com/tokopedia/gripmock/protogen v0.0.0 - github.com/tokopedia/gripmock/protogen/example v0.0.0 golang.org/x/text v0.12.0 google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.31.0 @@ -32,7 +32,7 @@ require ( ) // this is for generated server to be able to run -replace github.com/tokopedia/gripmock/protogen/example v0.0.0 => ./protogen/example +replace github.com/bavix/gripmock/protogen/example v0.0.0 => ./protogen/example // this is for example client to be able to run -replace github.com/tokopedia/gripmock/protogen v0.0.0 => ./protogen +replace github.com/bavix/gripmock/protogen v0.0.0 => ./protogen diff --git a/gripmock.go b/gripmock.go index da8331b2..cc66ad20 100644 --- a/gripmock.go +++ b/gripmock.go @@ -12,8 +12,8 @@ import ( "strings" "syscall" - _ "github.com/tokopedia/gripmock/protogen" - "github.com/tokopedia/gripmock/stub" + _ "github.com/bavix/gripmock/protogen" + "github.com/bavix/gripmock/stub" ) func main() { diff --git a/pkg/yaml2json/convertor_test.go b/pkg/yaml2json/convertor_test.go index de31ab6e..f88d7ee3 100644 --- a/pkg/yaml2json/convertor_test.go +++ b/pkg/yaml2json/convertor_test.go @@ -1,8 +1,8 @@ package yaml2json_test import ( + "github.com/bavix/gripmock/pkg/yaml2json" "github.com/stretchr/testify/require" - "github.com/tokopedia/gripmock/pkg/yaml2json" "testing" ) diff --git a/protoc-gen-gripmock/go.mod b/protoc-gen-gripmock/go.mod index 9a63d14b..c9458eb3 100644 --- a/protoc-gen-gripmock/go.mod +++ b/protoc-gen-gripmock/go.mod @@ -1,4 +1,4 @@ -module github.com/tokopedia/gripmock/protoc-gen-gripmock +module github.com/bavix/gripmock/protoc-gen-gripmock go 1.21 diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 6267cc77..e1831dcd 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -17,7 +17,7 @@ import ( "google.golang.org/grpc/reflection" "google.golang.org/protobuf/reflect/protoreflect" - "github.com/tokopedia/gripmock/pkg/sdk" + "github.com/bavix/gripmock/pkg/sdk" ) {{ range $package, $alias := .Dependencies }} import {{$alias}} "{{$package}}" diff --git a/protogen/example/go.mod b/protogen/example/go.mod index ec4433ce..29e18fba 100644 --- a/protogen/example/go.mod +++ b/protogen/example/go.mod @@ -1,4 +1,4 @@ -module github.com/tokopedia/gripmock/protogen/example +module github.com/bavix/gripmock/protogen/example go 1.21 diff --git a/protogen/example/multi-files/file1.proto b/protogen/example/multi-files/file1.proto index 1951376d..c9d58e2b 100644 --- a/protogen/example/multi-files/file1.proto +++ b/protogen/example/multi-files/file1.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/multi-files"; +option go_package = "github.com/bavix/gripmock/protogen/example/multi-files"; package multifiles; diff --git a/protogen/example/multi-files/file2.proto b/protogen/example/multi-files/file2.proto index 858d34c7..31502f27 100644 --- a/protogen/example/multi-files/file2.proto +++ b/protogen/example/multi-files/file2.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/multi-files"; +option go_package = "github.com/bavix/gripmock/protogen/example/multi-files"; package multifiles; diff --git a/protogen/example/multi-package/bar/bar.proto b/protogen/example/multi-package/bar/bar.proto index b881ca74..29a7710f 100644 --- a/protogen/example/multi-package/bar/bar.proto +++ b/protogen/example/multi-package/bar/bar.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/multi-package/bar"; +option go_package = "github.com/bavix/gripmock/protogen/example/multi-package/bar"; package bar; // this go_package is simulating alias collision diff --git a/protogen/example/multi-package/foo.proto b/protogen/example/multi-package/foo.proto index 81397f55..b8d883d2 100644 --- a/protogen/example/multi-package/foo.proto +++ b/protogen/example/multi-package/foo.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/multi-package"; +option go_package = "github.com/bavix/gripmock/protogen/example/multi-package"; // simulating neighboring .proto file // but different package diff --git a/protogen/example/multi-package/hello.pb.go b/protogen/example/multi-package/hello.pb.go index 8b2e4ada..519bb44a 100644 --- a/protogen/example/multi-package/hello.pb.go +++ b/protogen/example/multi-package/hello.pb.go @@ -7,7 +7,7 @@ package multi_package import ( - bar "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" + bar "github.com/bavix/gripmock/protogen/example/multi-package/bar" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" diff --git a/protogen/example/multi-package/hello.proto b/protogen/example/multi-package/hello.proto index 09dc2cbc..4081c0fe 100644 --- a/protogen/example/multi-package/hello.proto +++ b/protogen/example/multi-package/hello.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/multi-package"; +option go_package = "github.com/bavix/gripmock/protogen/example/multi-package"; package multi_package; diff --git a/protogen/example/multi-package/hello_grpc.pb.go b/protogen/example/multi-package/hello_grpc.pb.go index a9923721..e1de979a 100644 --- a/protogen/example/multi-package/hello_grpc.pb.go +++ b/protogen/example/multi-package/hello_grpc.pb.go @@ -8,7 +8,7 @@ package multi_package import ( context "context" - bar "github.com/tokopedia/gripmock/protogen/example/multi-package/bar" + bar "github.com/bavix/gripmock/protogen/example/multi-package/bar" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/protogen/example/one-of/oneof.proto b/protogen/example/one-of/oneof.proto index fa2f36ac..72ec4bc9 100644 --- a/protogen/example/one-of/oneof.proto +++ b/protogen/example/one-of/oneof.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/one-of"; +option go_package = "github.com/bavix/gripmock/protogen/example/one-of"; package oneof; diff --git a/protogen/example/simple/simple.proto b/protogen/example/simple/simple.proto index e1e588ba..fbed9cca 100644 --- a/protogen/example/simple/simple.proto +++ b/protogen/example/simple/simple.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/simple"; +option go_package = "github.com/bavix/gripmock/protogen/example/simple"; package simple; diff --git a/protogen/example/stream/stream.proto b/protogen/example/stream/stream.proto index 0fa8f0c9..20d10598 100644 --- a/protogen/example/stream/stream.proto +++ b/protogen/example/stream/stream.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/stream"; +option go_package = "github.com/bavix/gripmock/protogen/example/stream"; package stream; diff --git a/protogen/example/stub-subfolders/stub-subfolders.proto b/protogen/example/stub-subfolders/stub-subfolders.proto index e52f7373..50df5acc 100644 --- a/protogen/example/stub-subfolders/stub-subfolders.proto +++ b/protogen/example/stub-subfolders/stub-subfolders.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/stub-subfolders"; +option go_package = "github.com/bavix/gripmock/protogen/example/stub-subfolders"; package stub_subfolders; diff --git a/protogen/example/well_known_types/wkt.proto b/protogen/example/well_known_types/wkt.proto index d0ca9dee..6fb7a77f 100644 --- a/protogen/example/well_known_types/wkt.proto +++ b/protogen/example/well_known_types/wkt.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/tokopedia/gripmock/protogen/example/well_known_types"; +option go_package = "github.com/bavix/gripmock/protogen/example/well_known_types"; package well_known_types; diff --git a/protogen/go.mod b/protogen/go.mod index 0543c49f..7be0513c 100644 --- a/protogen/go.mod +++ b/protogen/go.mod @@ -1,3 +1,3 @@ -module github.com/tokopedia/gripmock/protogen +module github.com/bavix/gripmock/protogen go 1.21 diff --git a/stub/actions.go b/stub/actions.go index 56691bf7..6f079263 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -9,8 +9,8 @@ import ( "os" "strings" - "github.com/tokopedia/gripmock/pkg/storage" - "github.com/tokopedia/gripmock/pkg/yaml2json" + "github.com/bavix/gripmock/pkg/storage" + "github.com/bavix/gripmock/pkg/yaml2json" "golang.org/x/text/cases" "golang.org/x/text/language" ) diff --git a/stub/api_test.go b/stub/api_test.go index f781e13d..7a7f5f3a 100644 --- a/stub/api_test.go +++ b/stub/api_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tokopedia/gripmock/stub" + "github.com/bavix/gripmock/stub" ) func TestStub(t *testing.T) { diff --git a/stub/storage.go b/stub/storage.go index 501dea7e..09aa53ab 100644 --- a/stub/storage.go +++ b/stub/storage.go @@ -8,8 +8,8 @@ import ( "reflect" "regexp" + "github.com/bavix/gripmock/pkg/storage" "github.com/lithammer/fuzzysearch/fuzzy" - "github.com/tokopedia/gripmock/pkg/storage" ) type matchFunc func(interface{}, interface{}) bool diff --git a/stub/stub.go b/stub/stub.go index 10b6335e..a023e0e5 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -2,9 +2,9 @@ package stub import ( "fmt" + "github.com/bavix/gripmock/pkg/storage" "github.com/gorilla/handlers" "github.com/gorilla/mux" - "github.com/tokopedia/gripmock/pkg/storage" "golang.org/x/text/cases" "golang.org/x/text/language" "log" From fc1dc8382da34cc421a0f8d0cd5848ed900dabbe Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 23:52:34 +0300 Subject: [PATCH 38/74] lint fix --- .golangci.yml | 3 ++ .ownership.json | 6 --- example/multi-files/client/main.go | 5 ++- example/multi-files/stub/greet1.json | 2 +- example/multi-files/stub/greet2.json | 2 +- example/multi-package/client/main.go | 6 ++- example/multi-package/stub/simple.json | 2 +- example/one-of/client/main.go | 3 +- example/one-of/stub/oneof.json | 2 +- example/simple/client/main.go | 3 +- example/simple/stub/simple.json | 2 +- example/stream/client/main.go | 20 +++++++--- example/stub-subfolders/client/main.go | 3 +- example/stub-subfolders/stub/stub.json | 2 +- example/well_known_types/client/main.go | 2 + gripmock.go | 5 ++- pkg/sdk/client.go | 14 ++++++- pkg/storage/stubs.go | 7 +++- pkg/yaml2json/convertor_test.go | 6 ++- pkg/yaml2json/engine.go | 1 + protoc-gen-gripmock/server.tmpl | 17 +++++---- stub/actions.go | 25 +++++++++--- stub/api_test.go | 51 ++++++++++++++++--------- stub/storage.go | 15 +++++++- stub/stub.go | 16 ++++++-- 25 files changed, 151 insertions(+), 69 deletions(-) delete mode 100644 .ownership.json diff --git a/.golangci.yml b/.golangci.yml index 8d48da74..29d86c19 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,6 +16,9 @@ linters: - scopelint # not relevant - varnamelen + - wrapcheck + - paralleltest + - exhaustruct linters-settings: lll: line-length: 160 diff --git a/.ownership.json b/.ownership.json deleted file mode 100644 index c5ee0d83..00000000 --- a/.ownership.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "gripmock", - "description": "Grpc mock server", - "owner": "jekiapp", - "slack_channel": "tdk" -} \ No newline at end of file diff --git a/example/multi-files/client/main.go b/example/multi-files/client/main.go index ba6dfb14..b6131215 100644 --- a/example/multi-files/client/main.go +++ b/example/multi-files/client/main.go @@ -10,6 +10,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -24,7 +25,7 @@ func main() { c := pb.NewGripmock1Client(conn) // Contact the server and print out its response. - r, err := c.SayHello(context.Background(), &pb.Request1{Name: "bavix"}) + r, err := c.SayHello(context.Background(), &pb.Request1{Name: "tokopedia"}) if err != nil { log.Fatalf("error from grpc: %v", err) } @@ -33,7 +34,7 @@ func main() { c2 := pb.NewGripmock2Client(conn) // Contact the server and print out its response. - r2, err := c2.SayHello(context.Background(), &pb.Request2{Name: "bavix"}) + r2, err := c2.SayHello(context.Background(), &pb.Request2{Name: "tokopedia"}) if err != nil { log.Fatalf("error from grpc: %v", err) } diff --git a/example/multi-files/stub/greet1.json b/example/multi-files/stub/greet1.json index 9b988d40..6bb2643b 100644 --- a/example/multi-files/stub/greet1.json +++ b/example/multi-files/stub/greet1.json @@ -3,7 +3,7 @@ "method": "SayHello", "input": { "equals": { - "name": "bavix" + "name": "tokopedia" } }, "output": { diff --git a/example/multi-files/stub/greet2.json b/example/multi-files/stub/greet2.json index b5ed55e3..7abc5059 100644 --- a/example/multi-files/stub/greet2.json +++ b/example/multi-files/stub/greet2.json @@ -3,7 +3,7 @@ "method": "SayHello", "input": { "equals": { - "name": "bavix" + "name": "tokopedia" } }, "output": { diff --git a/example/multi-package/client/main.go b/example/multi-package/client/main.go index b07135be..6ce2408c 100644 --- a/example/multi-package/client/main.go +++ b/example/multi-package/client/main.go @@ -12,6 +12,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -21,18 +22,21 @@ func main() { if err != nil { log.Fatalf("did not connect: %v", err) } + defer conn.Close() c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - name := "bavix" + name := "tokopedia" if len(os.Args) > 1 { name = os.Args[1] } + r, err := c.Greet(context.Background(), &multi_package.Bar{Name: name}) if err != nil { log.Fatalf("error from grpc: %v", err) } + log.Printf("Greeting: %s", r.Response) } diff --git a/example/multi-package/stub/simple.json b/example/multi-package/stub/simple.json index af4d6263..69085af4 100644 --- a/example/multi-package/stub/simple.json +++ b/example/multi-package/stub/simple.json @@ -3,7 +3,7 @@ "method":"Greet", "input":{ "equals":{ - "name":"bavix" + "name":"tokopedia" } }, "output":{ diff --git a/example/one-of/client/main.go b/example/one-of/client/main.go index 1fa93501..1bebe7e2 100644 --- a/example/one-of/client/main.go +++ b/example/one-of/client/main.go @@ -11,6 +11,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -25,7 +26,7 @@ func main() { c := oneof.NewGripmockClient(conn) // Contact the server and print out its response. - name := "bavix" + name := "tokopedia" if len(os.Args) > 1 { name = os.Args[1] } diff --git a/example/one-of/stub/oneof.json b/example/one-of/stub/oneof.json index 895ce82b..82e2f56f 100644 --- a/example/one-of/stub/oneof.json +++ b/example/one-of/stub/oneof.json @@ -3,7 +3,7 @@ "method":"SayHello", "input":{ "equals":{ - "name":"bavix" + "name":"tokopedia" } }, "output":{ diff --git a/example/simple/client/main.go b/example/simple/client/main.go index 7e4bce94..f6e4c52f 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -11,6 +11,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -25,7 +26,7 @@ func main() { c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - name := "bavix" + name := "tokopedia" if len(os.Args) > 1 { name = os.Args[1] } diff --git a/example/simple/stub/simple.json b/example/simple/stub/simple.json index 11af8a8a..c6506485 100644 --- a/example/simple/stub/simple.json +++ b/example/simple/stub/simple.json @@ -4,7 +4,7 @@ "method": "SayHello", "input": { "equals": { - "name": "bavix" + "name": "tokopedia" } }, "output": { diff --git a/example/stream/client/main.go b/example/stream/client/main.go index 908e89bb..3f134fae 100644 --- a/example/stream/client/main.go +++ b/example/stream/client/main.go @@ -2,16 +2,19 @@ package main import ( "context" + "errors" "io" "log" "sync" "time" - pb "github.com/bavix/gripmock/protogen/example/stream" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + + pb "github.com/bavix/gripmock/protogen/example/stream" ) +//nolint:gomnd func main() { // Set up a connection to the server. ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) @@ -27,19 +30,21 @@ func main() { wg := &sync.WaitGroup{} wg.Add(1) + go serverStream(c, wg) wg.Add(1) + go clientStream(c, wg) wg.Add(1) + go bidirectionalStream(c, wg) wg.Wait() - } -// server to client streaming +// server to client streaming. func serverStream(c pb.GripmockClient, wg *sync.WaitGroup) { defer wg.Done() req := &pb.Request{ @@ -52,7 +57,7 @@ func serverStream(c pb.GripmockClient, wg *sync.WaitGroup) { for { reply, err := stream.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } @@ -79,12 +84,15 @@ func clientStream(c pb.GripmockClient, wg *sync.WaitGroup) { Name: "c2s-2", }, } + + //nolint:govet for _, req := range requests { err := stream.Send(&req) if err != nil { log.Fatalf("c2s error: %v", err) } } + reply, err := stream.CloseAndRecv() if err != nil { log.Fatalf("c2s error: %v", err) @@ -110,9 +118,10 @@ func bidirectionalStream(c pb.GripmockClient, wg *sync.WaitGroup) { go func() { defer wg.Done() + for { reply, err := stream.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return } if err != nil { @@ -123,6 +132,7 @@ func bidirectionalStream(c pb.GripmockClient, wg *sync.WaitGroup) { } }() + //nolint:govet for _, request := range requests { if err := stream.Send(&request); err != nil { log.Fatalf("2ds error: %v", err) diff --git a/example/stub-subfolders/client/main.go b/example/stub-subfolders/client/main.go index 9ae8029a..c117bf3f 100644 --- a/example/stub-subfolders/client/main.go +++ b/example/stub-subfolders/client/main.go @@ -10,6 +10,7 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -24,7 +25,7 @@ func main() { c := pb.NewGripmockClient(conn) // Contact the server and print out its response. - r, err := c.SayHello(context.Background(), &pb.Request{Name: "bavix"}) + r, err := c.SayHello(context.Background(), &pb.Request{Name: "tokopedia"}) if err != nil { log.Fatalf("error from grpc: %v", err) } diff --git a/example/stub-subfolders/stub/stub.json b/example/stub-subfolders/stub/stub.json index 2702b5c1..a4a1cc5a 100644 --- a/example/stub-subfolders/stub/stub.json +++ b/example/stub-subfolders/stub/stub.json @@ -3,7 +3,7 @@ "method": "SayHello", "input": { "equals": { - "name": "bavix" + "name": "tokopedia" } }, "output": { diff --git a/example/well_known_types/client/main.go b/example/well_known_types/client/main.go index 7e8b35a2..634841a6 100644 --- a/example/well_known_types/client/main.go +++ b/example/well_known_types/client/main.go @@ -14,6 +14,8 @@ import ( // in order to generate this .pb.go you need to have https://github.com/google/protobuf.git cloned // then use it as protobuf_dir below // protoc --go_out=plugins=grpc:${GOPATH}/src -I=.. -I= ../wkt.proto +// +//nolint:gomnd func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() diff --git a/gripmock.go b/gripmock.go index cc66ad20..d0d75f48 100644 --- a/gripmock.go +++ b/gripmock.go @@ -134,7 +134,7 @@ func generateProtoc(param protocParam) { protodirs := getProtodirs(param.protoPath[0], param.imports) // estimate args length to prevent expand - args := make([]string, 0, len(protodirs)+len(param.protoPath)+2) + args := make([]string, 0, len(protodirs)+len(param.protoPath)+2) //nolint:gomnd for _, dir := range protodirs { args = append(args, "-I", dir) } @@ -157,7 +157,7 @@ func generateProtoc(param protocParam) { } -// append gopackage in proto files if doesn't have any +// append gopackage in proto files if doesn't have any. func fixGoPackage(protoPaths []string) []string { fixgopackage := exec.Command("fix_gopackage.sh", protoPaths...) buf := &bytes.Buffer{} @@ -166,6 +166,7 @@ func fixGoPackage(protoPaths []string) []string { err := fixgopackage.Run() if err != nil { log.Println("error on fixGoPackage", err) + return protoPaths } diff --git a/pkg/sdk/client.go b/pkg/sdk/client.go index c699b9c1..fe514453 100644 --- a/pkg/sdk/client.go +++ b/pkg/sdk/client.go @@ -2,6 +2,7 @@ package sdk import ( "bytes" + "context" "encoding/json" "fmt" "io" @@ -28,13 +29,18 @@ type Response struct { Error string `json:"error"` } -func (c *StubApiClient) Search(payload Payload) (any, error) { +func (c *StubApiClient) Search(ctx context.Context, payload Payload) (any, error) { postBody, err := json.Marshal(payload) if err != nil { return nil, err } - resp, err := c.httpClient.Post(c.url+"/api/stubs/search", "application/json", bytes.NewReader(postBody)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.url+"/api/stubs/search", bytes.NewReader(postBody)) + if err != nil { + return nil, err + } + + resp, err := c.httpClient.Do(req) if err != nil { return nil, err } @@ -44,6 +50,8 @@ func (c *StubApiClient) Search(payload Payload) (any, error) { if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) + //fixme + //nolint:goerr113 return nil, fmt.Errorf(string(body)) } @@ -56,6 +64,8 @@ func (c *StubApiClient) Search(payload Payload) (any, error) { } if result.Error != "" { + //fixme + //nolint:goerr113 return nil, fmt.Errorf(result.Error) } diff --git a/pkg/storage/stubs.go b/pkg/storage/stubs.go index d9e011b9..77d8b048 100644 --- a/pkg/storage/stubs.go +++ b/pkg/storage/stubs.go @@ -2,8 +2,9 @@ package storage import ( "errors" - "github.com/google/uuid" "sync" + + "github.com/google/uuid" ) var ErrServiceNotFound = errors.New("service not found") @@ -107,8 +108,10 @@ func (r *StubStorage) Stubs() []Stub { for service, methods := range r.items { for method, storages := range methods { for _, datum := range storages { + id := datum.ID + results = append(results, Stub{ - ID: &datum.ID, + ID: &id, Service: service, Method: method, Input: datum.Input, diff --git a/pkg/yaml2json/convertor_test.go b/pkg/yaml2json/convertor_test.go index f88d7ee3..85b86907 100644 --- a/pkg/yaml2json/convertor_test.go +++ b/pkg/yaml2json/convertor_test.go @@ -1,9 +1,11 @@ package yaml2json_test import ( - "github.com/bavix/gripmock/pkg/yaml2json" - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" + + "github.com/bavix/gripmock/pkg/yaml2json" ) func TestConvertor(t *testing.T) { diff --git a/pkg/yaml2json/engine.go b/pkg/yaml2json/engine.go index a4439c09..d4c19da6 100644 --- a/pkg/yaml2json/engine.go +++ b/pkg/yaml2json/engine.go @@ -26,6 +26,7 @@ func (e *engine) Execute(name string, data []byte) ([]byte, error) { return buffer.Bytes(), nil } +//nolint:gomnd func (e *engine) funcMap() template.FuncMap { return template.FuncMap{ "uuid2base64": func(guid string) string { diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index e1831dcd..34196a88 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -3,6 +3,7 @@ package main import ( "bytes" + "errors" "encoding/json" "fmt" "io" @@ -76,7 +77,7 @@ type {{.Name}} struct{ {{ define "standard_method" }} func (s *{{.ServiceName}}) {{.Name}}(ctx context.Context, in *{{.Input}}) (*{{.Output}},error){ out := &{{.Output}}{} - err := findStub("{{.ServiceName}}", "{{.Name}}", in, out) + err := findStub(ctx, "{{.ServiceName}}", "{{.Name}}", in, out) return out, err } {{ end }} @@ -84,7 +85,7 @@ func (s *{{.ServiceName}}) {{.Name}}(ctx context.Context, in *{{.Input}}) (*{{.O {{ define "server_stream_method" }} func (s *{{.ServiceName}}) {{.Name}}(in *{{.Input}},srv {{.SvcPackage}}{{.ServiceName}}_{{.Name}}Server) error { out := &{{.Output}}{} - err := findStub("{{.ServiceName}}", "{{.Name}}", in, out) + err := findStub(srv.Context(), "{{.ServiceName}}", "{{.Name}}", in, out) if err!=nil { return err } @@ -98,10 +99,10 @@ func (s *{{.ServiceName}}) {{.Name}}(srv {{.SvcPackage}}{{.ServiceName}}_{{.Name out := &{{.Output}}{} for { input,err := srv.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return srv.SendAndClose(out) } - err = findStub("{{.ServiceName}}","{{.Name}}",input,out) + err = findStub(srv.Context(), "{{.ServiceName}}","{{.Name}}",input,out) if err != nil { return err } @@ -113,7 +114,7 @@ func (s *{{.ServiceName}}) {{.Name}}(srv {{.SvcPackage}}{{.ServiceName}}_{{.Name func (s *{{.ServiceName}}) {{.Name}}(srv {{.SvcPackage}}{{.ServiceName}}_{{.Name}}Server) error { for { in, err := srv.Recv() - if err == io.EOF { + if errors.Is(err, io.EOF) { return nil } if err != nil { @@ -121,7 +122,7 @@ func (s *{{.ServiceName}}) {{.Name}}(srv {{.SvcPackage}}{{.ServiceName}}_{{.Name } out := &{{.Output}}{} - err = findStub("{{.ServiceName}}","{{.Name}}",in,out) + err = findStub(srv.Context(), "{{.ServiceName}}","{{.Name}}",in,out) if err != nil { return err } @@ -150,9 +151,9 @@ type response struct { Error string `json:"error"` } -func findStub(service, method string, in, out protoreflect.ProtoMessage) error { +func findStub(ctx context.Context, service, method string, in, out protoreflect.ProtoMessage) error { api := sdk.NewStubApiClient(fmt.Sprintf("http://localhost%s", HTTP_PORT), http.DefaultClient) - resp, err := api.Search(sdk.Payload{ + resp, err := api.Search(ctx, sdk.Payload{ Service: service, Method: method, Data: in, diff --git a/stub/actions.go b/stub/actions.go index 6f079263..c3e60b7c 100644 --- a/stub/actions.go +++ b/stub/actions.go @@ -9,16 +9,17 @@ import ( "os" "strings" - "github.com/bavix/gripmock/pkg/storage" - "github.com/bavix/gripmock/pkg/yaml2json" "golang.org/x/text/cases" "golang.org/x/text/language" + + "github.com/bavix/gripmock/pkg/storage" + "github.com/bavix/gripmock/pkg/yaml2json" ) type HealthcheckHandler struct{} func (*HealthcheckHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) } func NewHealthcheckHandler() *HealthcheckHandler { @@ -47,6 +48,7 @@ func (h *ApiHandler) SearchHandle(w http.ResponseWriter, r *http.Request) { if err := decoder.Decode(stub); err != nil { h.responseError(err, w) + return } @@ -60,8 +62,9 @@ func (h *ApiHandler) SearchHandle(w http.ResponseWriter, r *http.Request) { output, err := findStub(h.stubs, stub) if err != nil { log.Println(err) - w.WriteHeader(404) + w.WriteHeader(http.StatusNotFound) h.writeResponseError(err, w) + return } @@ -71,7 +74,7 @@ func (h *ApiHandler) SearchHandle(w http.ResponseWriter, r *http.Request) { func (h *ApiHandler) PurgeHandle(w http.ResponseWriter, _ *http.Request) { h.stubs.Purge() - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) } func (h *ApiHandler) ListHandle(w http.ResponseWriter, _ *http.Request) { @@ -79,6 +82,7 @@ func (h *ApiHandler) ListHandle(w http.ResponseWriter, _ *http.Request) { err := json.NewEncoder(w).Encode(h.stubs.Stubs()) if err != nil { h.responseError(err, w) + return } } @@ -87,6 +91,7 @@ func (h *ApiHandler) AddHandle(w http.ResponseWriter, r *http.Request) { byt, err := io.ReadAll(r.Body) if err != nil { h.responseError(err, w) + return } @@ -104,12 +109,14 @@ func (h *ApiHandler) AddHandle(w http.ResponseWriter, r *http.Request) { if err := decoder.Decode(&stubs); err != nil { h.responseError(err, w) + return } for _, stub := range stubs { if err := validateStub(stub); err != nil { h.responseError(err, w) + return } } @@ -117,12 +124,13 @@ func (h *ApiHandler) AddHandle(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(h.stubs.Add(stubs...)); err != nil { h.responseError(err, w) + return } } func (h *ApiHandler) responseError(err error, w http.ResponseWriter) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) h.writeResponseError(err, w) } @@ -137,18 +145,21 @@ func (h *ApiHandler) readStubs(path string) { files, err := os.ReadDir(path) if err != nil { log.Printf("Can't read stub from %s. %v\n", path, err) + return } for _, file := range files { if file.IsDir() { h.readStubs(path + "/" + file.Name()) + continue } byt, err := os.ReadFile(path + "/" + file.Name()) if err != nil { log.Printf("Error when reading file %s. %v. skipping...", file.Name(), err) + continue } @@ -158,6 +169,7 @@ func (h *ApiHandler) readStubs(path string) { byt, err = h.convertor.Execute(file.Name(), byt) if err != nil { log.Printf("Error when unmarshalling file %s. %v. skipping...", file.Name(), err) + continue } } @@ -172,6 +184,7 @@ func (h *ApiHandler) readStubs(path string) { if err = decoder.Decode(&stubs); err != nil { log.Printf("Error when unmarshalling file %s. %v %v. skipping...", file.Name(), string(byt), err) + continue } diff --git a/stub/api_test.go b/stub/api_test.go index 7a7f5f3a..c8b05b85 100644 --- a/stub/api_test.go +++ b/stub/api_test.go @@ -43,7 +43,8 @@ func TestStub(t *testing.T) { } }` read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/api/stubs", read) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", read) }, handler: api.AddHandle, expect: `["43739ed8-2810-4f57-889b-4d3ff5795bce"]`, @@ -51,7 +52,7 @@ func TestStub(t *testing.T) { { name: "list stub", mock: func() *http.Request { - return httptest.NewRequest("GET", "/api/stubs", nil) + return httptest.NewRequest(http.MethodGet, "/api/stubs", nil) }, handler: api.ListHandle, expect: "[{\"id\":\"43739ed8-2810-4f57-889b-4d3ff5795bce\",\"service\":\"Testing\",\"method\":\"TestMethod\",\"input\":{\"equals\":{\"Hola\":\"Mundo\"},\"contains\":null,\"matches\":null},\"output\":{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}}]", @@ -60,7 +61,8 @@ func TestStub(t *testing.T) { name: "find stub equals", mock: func() *http.Request { payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Mundo"}}` - return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", @@ -92,7 +94,8 @@ func TestStub(t *testing.T) { } }` read := bytes.NewReader([]byte(payload)) - return httptest.NewRequest("POST", "/api/stubs", read) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", read) }, handler: api.AddHandle, expect: `["b7211be4-06f7-4a2c-8453-359f077bcdb8"]`, @@ -101,7 +104,8 @@ func TestStub(t *testing.T) { name: "find nested stub equals", mock: func() *http.Request { payload := `{"service":"NestedTesting","method":"TestMethod","data":{"name":"Afra Gokce","age":1,"girl":true,"null":null,"greetings":{"hola":"mundo","merhaba":"dunya"},"cities":["Istanbul","Jakarta"]}}` - return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"Hello\":\"World\"},\"error\":\"\"}\n", @@ -125,7 +129,8 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b5e35447-45bb-4b71-8ab4-41ba5dda669c"]`, @@ -142,7 +147,8 @@ func TestStub(t *testing.T) { "field3":"hello field3" } }` - return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodGet, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", @@ -170,7 +176,8 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b8e354d9-a211-49c7-9947-b617e1689e0f"]`, @@ -217,7 +224,8 @@ func TestStub(t *testing.T) { } } }]` - return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["3f68f410-bb58-49ad-b679-23f2ed690c1d","6da11d72-c0db-4075-9e72-31d61ffd0483"]`, @@ -239,7 +247,8 @@ func TestStub(t *testing.T) { "cities": ["Istanbul", "Jakarta", "Winterfell"] } }` - return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodGet, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"hello\":\"world\"},\"error\":\"\"}\n", @@ -262,7 +271,8 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["faf39edb-c695-493f-a25e-ecfc171977dc"]`, @@ -277,7 +287,8 @@ func TestStub(t *testing.T) { "field1":"hello" } }` - return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodGet, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", @@ -307,7 +318,8 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("POST", "/api/stubs", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) }, handler: api.AddHandle, expect: `["b1299ce3-a2a6-4fe7-94d4-0b68fc80afaa"]`, @@ -330,7 +342,8 @@ func TestStub(t *testing.T) { } } }` - return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodGet, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"data\":{\"reply\":\"OK\"},\"error\":\"\"}\n", @@ -345,7 +358,8 @@ func TestStub(t *testing.T) { "field1":"hello field1" } }` - return httptest.NewRequest("GET", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodGet, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"field1\\\": \\\"hello field1\\\"\\n}\\n\\nClosest Match \\n\\ncontains:{\\n\\t\\\"field1\\\": \\\"hello field1\\\",\\n\\t\\\"field3\\\": \\\"hello field3\\\"\\n}\"}", @@ -354,7 +368,8 @@ func TestStub(t *testing.T) { name: "error find stub equals", mock: func() *http.Request { payload := `{"service":"Testing","method":"TestMethod","data":{"Hola":"Dunia"}}` - return httptest.NewRequest("POST", "/api/stubs/search", bytes.NewReader([]byte(payload))) + + return httptest.NewRequest(http.MethodPost, "/api/stubs/search", bytes.NewReader([]byte(payload))) }, handler: api.SearchHandle, expect: "{\"error\":\"Can't find stub \\n\\nService: Testing \\n\\nMethod: TestMethod \\n\\nInput\\n\\n{\\n\\t\\\"Hola\\\": \\\"Dunia\\\"\\n}\\n\\nClosest Match \\n\\nequals:{\\n\\t\\\"Hola\\\": \\\"Mundo\\\"\\n}\"}", @@ -375,12 +390,12 @@ func TestStub(t *testing.T) { t.Run("purge handler", func(t *testing.T) { deleteWrt := httptest.NewRecorder() - deleteReq := httptest.NewRequest("DELETE", "/api/stubs", nil) + deleteReq := httptest.NewRequest(http.MethodDelete, "/api/stubs", nil) api.PurgeHandle(deleteWrt, deleteReq) listWrt := httptest.NewRecorder() - listReq := httptest.NewRequest("GET", "/api/stubs", nil) + listReq := httptest.NewRequest(http.MethodGet, "/api/stubs", nil) api.ListHandle(listWrt, listReq) diff --git a/stub/storage.go b/stub/storage.go index 09aa53ab..69117803 100644 --- a/stub/storage.go +++ b/stub/storage.go @@ -8,8 +8,9 @@ import ( "reflect" "regexp" - "github.com/bavix/gripmock/pkg/storage" "github.com/lithammer/fuzzysearch/fuzzy" + + "github.com/bavix/gripmock/pkg/storage" ) type matchFunc func(interface{}, interface{}) bool @@ -22,14 +23,20 @@ type closeMatch struct { func findStub(stubStorage *storage.StubStorage, stub *findStubPayload) (*storage.Output, error) { stubs, err := stubStorage.ItemsBy(stub.Service, stub.Method) if errors.Is(err, storage.ErrServiceNotFound) { + //fixme + //nolint:goerr113 return nil, fmt.Errorf("can't find stub for Service: %s", stub.Service) } if errors.Is(err, storage.ErrMethodNotFound) { + //fixme + //nolint:goerr113 return nil, fmt.Errorf("can't find stub for Service:%s and Method:%s", stub.Service, stub.Method) } if len(stubs) == 0 { + //fixme + //nolint:goerr113 return nil, fmt.Errorf("stub for Service:%s and Method:%s is empty", stub.Service, stub.Method) } @@ -70,6 +77,8 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error template += string(expectString) if len(closestMatches) == 0 { + //fixme + //nolint:goerr113 return fmt.Errorf(template) } @@ -101,12 +110,14 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error template += fmt.Sprintf("\n\nClosest Match \n\n%s:%s", closestMatch.rule, closestMatchString) + //fixme + //nolint:goerr113 return fmt.Errorf(template) } // we made our own simple ranking logic // count the matches field_name and value then compare it with total field names and values -// the higher the better +// the higher the better. func rankMatch(expect string, closeMatch map[string]interface{}) float32 { occurrence := 0 for key, value := range closeMatch { diff --git a/stub/stub.go b/stub/stub.go index a023e0e5..21375031 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -2,14 +2,16 @@ package stub import ( "fmt" - "github.com/bavix/gripmock/pkg/storage" + "log" + "net/http" + "os" + "github.com/gorilla/handlers" "github.com/gorilla/mux" "golang.org/x/text/cases" "golang.org/x/text/language" - "log" - "net/http" - "os" + + "github.com/bavix/gripmock/pkg/storage" ) type Options struct { @@ -52,6 +54,8 @@ func RunStubServer(opt Options) { func validateStub(stub *storage.Stub) error { if stub.Service == "" { + //fixme + //nolint:goerr113 return fmt.Errorf("service name can't be empty") } @@ -72,12 +76,16 @@ func validateStub(stub *storage.Stub) error { case stub.Input.Matches != nil: break default: + //fixme + //nolint:goerr113 return fmt.Errorf("input cannot be empty") } // TODO: validate all input case if stub.Output.Error == "" && stub.Output.Data == nil { + //fixme + //nolint:goerr113 return fmt.Errorf("output can't be empty") } From 692e316a341bce8608dab5e084f950c8add7d7bb Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Fri, 1 Sep 2023 23:56:49 +0300 Subject: [PATCH 39/74] revert --- LICENSE | 2 +- example/multi-files/stub/greet1.json | 2 +- example/multi-files/stub/greet2.json | 2 +- example/multi-package/stub/simple.json | 2 +- example/simple/stub/simple.json | 2 +- example/stub-subfolders/client/main.go | 5 +++-- example/stub-subfolders/stub/stub.json | 2 +- .../stub-subfolders/stub/subfolder1/stub-in-subfolder.json | 4 ++-- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index ab0be2c7..0c85926b 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 PT bavix + Copyright 2019 PT Tokopedia Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/example/multi-files/stub/greet1.json b/example/multi-files/stub/greet1.json index 6bb2643b..1d220379 100644 --- a/example/multi-files/stub/greet1.json +++ b/example/multi-files/stub/greet1.json @@ -8,7 +8,7 @@ }, "output": { "data": { - "message": "Hello bavix 1", + "message": "Hello Tokopedia 1", "return_code": 1 } } diff --git a/example/multi-files/stub/greet2.json b/example/multi-files/stub/greet2.json index 7abc5059..e902237a 100644 --- a/example/multi-files/stub/greet2.json +++ b/example/multi-files/stub/greet2.json @@ -8,7 +8,7 @@ }, "output": { "data": { - "message": "Hello bavix 2", + "message": "Hello Tokopedia 2", "return_code": 1 } } diff --git a/example/multi-package/stub/simple.json b/example/multi-package/stub/simple.json index 69085af4..01d3451d 100644 --- a/example/multi-package/stub/simple.json +++ b/example/multi-package/stub/simple.json @@ -8,7 +8,7 @@ }, "output":{ "data":{ - "response":"Hello bavix" + "response":"Hello Tokopedia" } } } \ No newline at end of file diff --git a/example/simple/stub/simple.json b/example/simple/stub/simple.json index c6506485..2438a3c9 100644 --- a/example/simple/stub/simple.json +++ b/example/simple/stub/simple.json @@ -9,7 +9,7 @@ }, "output": { "data": { - "message": "Hello bavix", + "message": "Hello Tokopedia", "return_code": 1 } } diff --git a/example/stub-subfolders/client/main.go b/example/stub-subfolders/client/main.go index c117bf3f..01c953c2 100644 --- a/example/stub-subfolders/client/main.go +++ b/example/stub-subfolders/client/main.go @@ -5,9 +5,10 @@ import ( "log" "time" - pb "github.com/bavix/gripmock/protogen/example/stub-subfolders" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + + pb "github.com/bavix/gripmock/protogen/example/stub-subfolders" ) //nolint:gomnd @@ -31,7 +32,7 @@ func main() { } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) - r, err = c.SayHello(context.Background(), &pb.Request{Name: "subbavix"}) + r, err = c.SayHello(context.Background(), &pb.Request{Name: "subtokopedia"}) if err != nil { log.Fatalf("error from grpc: %v", err) } diff --git a/example/stub-subfolders/stub/stub.json b/example/stub-subfolders/stub/stub.json index a4a1cc5a..6bbf0913 100644 --- a/example/stub-subfolders/stub/stub.json +++ b/example/stub-subfolders/stub/stub.json @@ -8,7 +8,7 @@ }, "output": { "data": { - "message": "Hello bavix", + "message": "Hello Tokopedia", "return_code": 1 } } diff --git a/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json b/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json index ad696214..c4a1e92b 100644 --- a/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json +++ b/example/stub-subfolders/stub/subfolder1/stub-in-subfolder.json @@ -3,12 +3,12 @@ "method": "SayHello", "input": { "equals": { - "name": "subbavix" + "name": "subtokopedia" } }, "output": { "data": { - "message": "Hello Sub bavix", + "message": "Hello Sub Tokopedia", "return_code": 1 } } From a96033a752bb5733a020d1b2f3e9fbcdcdfa1687 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 08:04:55 +0300 Subject: [PATCH 40/74] Return grpc server error code --- Readme.md | 3 +- example/simple/client/main.go | 29 +++++++++- example/simple/stub/errors.yml | 16 ++++++ pkg/sdk/client.go | 13 ++--- pkg/storage/stubs.go | 2 + protoc-gen-gripmock/server.tmpl | 19 ++++++- stub/api_test.go | 99 +++++++++++++++++++++++++++++++++ stub/stub.go | 2 +- 8 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 example/simple/stub/errors.yml diff --git a/Readme.md b/Readme.md index aa89e6b5..f1d9c993 100644 --- a/Readme.md +++ b/Readme.md @@ -76,7 +76,8 @@ Stub Format is JSON text format. It has a skeleton as follows: "data":{ // put result fields here }, - "error":"" // Optional. if you want to return error instead. + "error":"", // Optional. if you want to return error instead. + "code":"" // Optional. Grpc response code. if code !=0 return error instead. } } ``` diff --git a/example/simple/client/main.go b/example/simple/client/main.go index f6e4c52f..b5f14c54 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -6,9 +6,12 @@ import ( "os" "time" - pb "github.com/bavix/gripmock/protogen/example/simple" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/status" + + pb "github.com/bavix/gripmock/protogen/example/simple" ) //nolint:gomnd @@ -68,4 +71,28 @@ func main() { log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 3) } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) + + name = "error" + r, err = c.SayHello(context.Background(), &pb.Request{Name: name}) + if err == nil { + log.Fatalf("Expected error, but return %d", r.ReturnCode) + } + log.Printf("Greeting error: %s", err) + + name = "error_code" + r, err = c.SayHello(context.Background(), &pb.Request{Name: name}) + if err == nil { + log.Fatalf("Expected error, but return %d", r.ReturnCode) + } + + s, ok := status.FromError(err) + if !ok { + log.Fatalf("Expected to get error status: %v", err) + } + + if s.Code() != codes.InvalidArgument { + log.Fatalf("Expected to get error status %d, got: %d", codes.InvalidArgument, s.Code()) + } + + log.Printf("Greeting error: %s, code: %d", err, s.Code()) } diff --git a/example/simple/stub/errors.yml b/example/simple/stub/errors.yml new file mode 100644 index 00000000..c2514e40 --- /dev/null +++ b/example/simple/stub/errors.yml @@ -0,0 +1,16 @@ +--- +- service: Gripmock + method: SayHello + input: + equals: + name: error + output: + error: test_error +- service: Gripmock + method: SayHello + input: + equals: + name: error_code + output: + error: test_error_code + code: 3 diff --git a/pkg/sdk/client.go b/pkg/sdk/client.go index fe514453..5fe42289 100644 --- a/pkg/sdk/client.go +++ b/pkg/sdk/client.go @@ -7,6 +7,8 @@ import ( "fmt" "io" "net/http" + + "google.golang.org/grpc/codes" ) type StubApiClient struct { @@ -27,9 +29,10 @@ type Payload struct { type Response struct { Data interface{} `json:"data"` Error string `json:"error"` + Code *codes.Code `json:"code,omitempty"` } -func (c *StubApiClient) Search(ctx context.Context, payload Payload) (any, error) { +func (c *StubApiClient) Search(ctx context.Context, payload Payload) (*Response, error) { postBody, err := json.Marshal(payload) if err != nil { return nil, err @@ -63,11 +66,5 @@ func (c *StubApiClient) Search(ctx context.Context, payload Payload) (any, error return nil, err } - if result.Error != "" { - //fixme - //nolint:goerr113 - return nil, fmt.Errorf(result.Error) - } - - return result.Data, nil + return result, nil } diff --git a/pkg/storage/stubs.go b/pkg/storage/stubs.go index 77d8b048..ef4e0b24 100644 --- a/pkg/storage/stubs.go +++ b/pkg/storage/stubs.go @@ -5,6 +5,7 @@ import ( "sync" "github.com/google/uuid" + "google.golang.org/grpc/codes" ) var ErrServiceNotFound = errors.New("service not found") @@ -27,6 +28,7 @@ type Input struct { type Output struct { Data map[string]interface{} `json:"data"` Error string `json:"error"` + Code *codes.Code `json:"code,omitempty"` } type storage struct { diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 34196a88..28de9bf8 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -17,6 +17,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/reflection" "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "github.com/bavix/gripmock/pkg/sdk" ) @@ -153,7 +155,7 @@ type response struct { func findStub(ctx context.Context, service, method string, in, out protoreflect.ProtoMessage) error { api := sdk.NewStubApiClient(fmt.Sprintf("http://localhost%s", HTTP_PORT), http.DefaultClient) - resp, err := api.Search(ctx, sdk.Payload{ + respRPC, err := api.Search(ctx, sdk.Payload{ Service: service, Method: method, Data: in, @@ -162,11 +164,22 @@ func findStub(ctx context.Context, service, method string, in, out protoreflect. return err } - data, err := json.Marshal(resp) + if respRPC.Error != "" || respRPC.Code != nil { + if respRPC.Code == nil { + abortedCode := codes.Aborted + respRPC.Code = &abortedCode + } + + if *respRPC.Code != codes.OK { + return status.Error(*respRPC.Code, respRPC.Error) + } + } + + data, err := json.Marshal(respRPC.Data) if err != nil { return err } return jsonpb.Unmarshal(data, out) } -{{ end }} \ No newline at end of file +{{ end }} diff --git a/stub/api_test.go b/stub/api_test.go index c8b05b85..bc0f79f9 100644 --- a/stub/api_test.go +++ b/stub/api_test.go @@ -230,6 +230,105 @@ func TestStub(t *testing.T) { handler: api.AddHandle, expect: `["3f68f410-bb58-49ad-b679-23f2ed690c1d","6da11d72-c0db-4075-9e72-31d61ffd0483"]`, }, + + { + name: "add error stub with result code contains", + mock: func() *http.Request { + payload := `{ + "id": "cda7321b-9241-4a58-9cbf-0603e0146542", + "service": "ErrorStabWithCode", + "method":"TestMethod", + "input":{ + "contains":{ + "key": "value", + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "error":"error msg", + "code": 3 + } + }` + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["cda7321b-9241-4a58-9cbf-0603e0146542"]`, + }, + { + name: "find error stub with result code contains", + mock: func() *http.Request { + payload := `{ + "service": "ErrorStabWithCode", + "method":"TestMethod", + "data":{ + "key": "value", + "anotherKey": "anotherValue", + "greetings": { + "hola": "mundo", + "merhaba": "dunya", + "hello": "world" + }, + "cities": ["Istanbul", "Jakarta", "Winterfell"] + } + }` + return httptest.NewRequest(http.MethodPost, "/api/stubs/search", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":null,\"error\":\"error msg\",\"code\":3}\n", + }, + + { + name: "add error stub without result code contains", + mock: func() *http.Request { + payload := `{ + "id": "6d5ec9a6-94a7-4f23-b5ea-b04a37796adb", + "service": "ErrorStab", + "method":"TestMethod", + "input":{ + "contains":{ + "key": "value", + "greetings": { + "hola": "mundo", + "merhaba": "dunya" + }, + "cities": ["Istanbul", "Jakarta"] + } + }, + "output":{ + "error":"error msg" + } + }` + return httptest.NewRequest(http.MethodPost, "/api/stubs", bytes.NewReader([]byte(payload))) + }, + handler: api.AddHandle, + expect: `["6d5ec9a6-94a7-4f23-b5ea-b04a37796adb"]`, + }, + { + name: "find error stub without result code contains", + mock: func() *http.Request { + payload := `{ + "service": "ErrorStab", + "method":"TestMethod", + "data":{ + "key": "value", + "anotherKey": "anotherValue", + "greetings": { + "hola": "mundo", + "merhaba": "dunya", + "hello": "world" + }, + "cities": ["Istanbul", "Jakarta", "Winterfell"] + } + }` + return httptest.NewRequest(http.MethodPost, "/api/stubs/search", bytes.NewReader([]byte(payload))) + }, + handler: api.SearchHandle, + expect: "{\"data\":null,\"error\":\"error msg\"}\n", + }, { name: "find nested stub contains", mock: func() *http.Request { diff --git a/stub/stub.go b/stub/stub.go index 21375031..0743d649 100644 --- a/stub/stub.go +++ b/stub/stub.go @@ -83,7 +83,7 @@ func validateStub(stub *storage.Stub) error { // TODO: validate all input case - if stub.Output.Error == "" && stub.Output.Data == nil { + if stub.Output.Error == "" && stub.Output.Data == nil && stub.Output.Code == nil { //fixme //nolint:goerr113 return fmt.Errorf("output can't be empty") From 7658215c3227e0adea5de83fa839e67f49e67258 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 10:14:01 +0300 Subject: [PATCH 41/74] update func's engine.go --- pkg/yaml2json/convertor.go | 2 +- pkg/yaml2json/convertor_test.go | 20 +++++++++- pkg/yaml2json/engine.go | 66 +++++++++++++++++++++------------ 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/pkg/yaml2json/convertor.go b/pkg/yaml2json/convertor.go index aa66fb28..c2db2854 100644 --- a/pkg/yaml2json/convertor.go +++ b/pkg/yaml2json/convertor.go @@ -12,7 +12,7 @@ func New() *Convertor { return &Convertor{engine: &engine{}} } -func (t *Convertor) Execute(name string, data []byte) ([]byte, error) { +func (t *Convertor) Execute(name string, data []byte) (res []byte, err error) { bytes, err := t.engine.Execute(name, data) if err != nil { return nil, err diff --git a/pkg/yaml2json/convertor_test.go b/pkg/yaml2json/convertor_test.go index 85b86907..c5708020 100644 --- a/pkg/yaml2json/convertor_test.go +++ b/pkg/yaml2json/convertor_test.go @@ -11,18 +11,34 @@ import ( func TestConvertor(t *testing.T) { convertor := yaml2json.New() + // see: https://bavix.github.io/uuid-ui/ + // 77465064-a0ce-48a3-b7e4-d50f88e55093 => d0ZQZKDOSKO35NUPiOVQkw== + // e351220b-4847-42f5-8abb-c052b87ff2d4 => {"high":-773977811204288029,"low":-3102276763665777782} bytes, err := convertor.Execute("hello", []byte(` yaml2json: base64: {{ uuid2base64 "77465064-a0ce-48a3-b7e4-d50f88e55093" }} - highLow: {{ uuid2highLow "e351220b-4847-42f5-8abb-c052b87ff2d4" }} + highLow: {{ uuid2int64 "e351220b-4847-42f5-8abb-c052b87ff2d4" }} + string: {{ string2base64 "hello world" }} + bytes: {{ bytes "hello world" | bytes2base64 }} `)) expected := `{ "yaml2json": { "base64": "d0ZQZKDOSKO35NUPiOVQkw==", - "highLow": {"high":-773977811204288029,"low":-3102276763665777782} + "highLow": {"high":-773977811204288029,"low":-3102276763665777782}, + "string": "aGVsbG8gd29ybGQ=", + "bytes": "aGVsbG8gd29ybGQ=" } }` require.NoError(t, err) require.JSONEq(t, expected, string(bytes)) } + +func TestPanic2Error(t *testing.T) { + _, err := yaml2json.New().Execute("hello", []byte(` +yaml2json: + base64: {{ uuid2base64 "no-uuid" }} +`)) + + require.Error(t, err) +} diff --git a/pkg/yaml2json/engine.go b/pkg/yaml2json/engine.go index d4c19da6..038474be 100644 --- a/pkg/yaml2json/engine.go +++ b/pkg/yaml2json/engine.go @@ -26,35 +26,55 @@ func (e *engine) Execute(name string, data []byte) ([]byte, error) { return buffer.Bytes(), nil } -//nolint:gomnd -func (e *engine) funcMap() template.FuncMap { - return template.FuncMap{ - "uuid2base64": func(guid string) string { - v := uuid.MustParse(guid) +func (e *engine) uuid2int64(str string) string { + v := e.uuid2bytes(str) + + high := int64(v[0]) | int64(v[1])<<8 | int64(v[2])<<16 | int64(v[3])<<24 | + int64(v[4])<<32 | int64(v[5])<<40 | int64(v[6])<<48 | int64(v[7])<<56 + + low := int64(v[8]) | int64(v[9])<<8 | int64(v[10])<<16 | int64(v[11])<<24 | + int64(v[12])<<32 | int64(v[13])<<40 | int64(v[14])<<48 | int64(v[15])<<56 + + var buffer bytes.Buffer + + _ = json.NewEncoder(&buffer).Encode(map[string]int64{ + "high": high, + "low": low, + }) + + return buffer.String() +} - return base64.StdEncoding.EncodeToString(v[:]) - }, - "uuid2highLow": func(guid string) string { - v := uuid.MustParse(guid) +func (e *engine) uuid2base64(input string) string { + return e.bytes2base64(e.uuid2bytes(input)) +} - high := int64(v[0]) | int64(v[1])<<8 | int64(v[2])<<16 | int64(v[3])<<24 | - int64(v[4])<<32 | int64(v[5])<<40 | int64(v[6])<<48 | int64(v[7])<<56 +func (e *engine) uuid2bytes(input string) []byte { + v := uuid.MustParse(input) - low := int64(v[8]) | int64(v[9])<<8 | int64(v[10])<<16 | int64(v[11])<<24 | - int64(v[12])<<32 | int64(v[13])<<40 | int64(v[14])<<48 | int64(v[15])<<56 + return v[:] +} - var buffer bytes.Buffer +func (e *engine) bytes(v string) []byte { + return []byte(v) +} - err := json.NewEncoder(&buffer).Encode(map[string]int64{ - "high": high, - "low": low, - }) +func (e *engine) string2base64(v string) string { + return base64.StdEncoding.EncodeToString(e.bytes(v)) +} - if err != nil { - return guid - } +func (e *engine) bytes2base64(v []byte) string { + return base64.StdEncoding.EncodeToString(v) +} - return buffer.String() - }, +//nolint:gomnd +func (e *engine) funcMap() template.FuncMap { + return template.FuncMap{ + "bytes": e.bytes, + "string2base64": e.string2base64, + "bytes2base64": e.bytes2base64, + "uuid2base64": e.uuid2base64, + "uuid2bytes": e.uuid2bytes, + "uuid2int64": e.uuid2int64, } } From 0e24395996b57ab49e025d2bca7a98d2a02cf83b Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 10:26:07 +0300 Subject: [PATCH 42/74] gzip encoding support --- example/simple/client/main.go | 11 +++++++++++ protoc-gen-gripmock/server.tmpl | 1 + 2 files changed, 12 insertions(+) diff --git a/example/simple/client/main.go b/example/simple/client/main.go index b5f14c54..14ea3cd0 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -9,6 +9,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/encoding/gzip" "google.golang.org/grpc/status" pb "github.com/bavix/gripmock/protogen/example/simple" @@ -72,6 +73,16 @@ func main() { } log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) + name = "simple3" + r, err = c.SayHello(context.Background(), &pb.Request{Name: name}, grpc.UseCompressor(gzip.Name)) + if err != nil { + log.Fatalf("error from grpc: %v", err) + } + if r.ReturnCode != 3 { + log.Fatalf("grpc server returned code: %d, expected code: %d", r.ReturnCode, 3) + } + log.Printf("Greeting (gzip): %s (return code %d)", r.Message, r.ReturnCode) + name = "error" r, err = c.SayHello(context.Background(), &pb.Request{Name: name}) if err == nil { diff --git a/protoc-gen-gripmock/server.tmpl b/protoc-gen-gripmock/server.tmpl index 28de9bf8..89aaebb7 100644 --- a/protoc-gen-gripmock/server.tmpl +++ b/protoc-gen-gripmock/server.tmpl @@ -19,6 +19,7 @@ import ( "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + _ "google.golang.org/grpc/encoding/gzip" "github.com/bavix/gripmock/pkg/sdk" ) From 9d76e9f299f6eb820a4a7da31c60577dba2fb1f3 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 10:27:51 +0300 Subject: [PATCH 43/74] typo fix --- pkg/yaml2json/convertor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/yaml2json/convertor.go b/pkg/yaml2json/convertor.go index c2db2854..aa66fb28 100644 --- a/pkg/yaml2json/convertor.go +++ b/pkg/yaml2json/convertor.go @@ -12,7 +12,7 @@ func New() *Convertor { return &Convertor{engine: &engine{}} } -func (t *Convertor) Execute(name string, data []byte) (res []byte, err error) { +func (t *Convertor) Execute(name string, data []byte) ([]byte, error) { bytes, err := t.engine.Execute(name, data) if err != nil { return nil, err From 842e00e59c43d6f3724a85e71643ff957683d9d2 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 10:49:20 +0300 Subject: [PATCH 44/74] add intgrtest uint64/int64 --- example/simple/client/main.go | 9 ++++++ example/simple/simple.proto | 2 ++ example/simple/stub/uint64_int64.yml | 12 +++++++ protogen/example/simple/simple.pb.go | 48 +++++++++++++++++++--------- 4 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 example/simple/stub/uint64_int64.yml diff --git a/example/simple/client/main.go b/example/simple/client/main.go index 14ea3cd0..88dd9165 100644 --- a/example/simple/client/main.go +++ b/example/simple/client/main.go @@ -106,4 +106,13 @@ func main() { } log.Printf("Greeting error: %s, code: %d", err, s.Code()) + + r, err = c.SayHello(context.Background(), &pb.Request{Vint64: 72057594037927936, Vuint64: 18446744073709551615}) + if err != nil { + log.Fatalf("error from grpc: %v", err) + } + if r.Message != "72057594037927936 18446744073709551615" { + log.Fatalf("failed to get valid message: %v", r.Message) + } + log.Printf("Greeting: %s (return code %d)", r.Message, r.ReturnCode) } diff --git a/example/simple/simple.proto b/example/simple/simple.proto index 5e6adb54..c8856d9e 100644 --- a/example/simple/simple.proto +++ b/example/simple/simple.proto @@ -13,6 +13,8 @@ service Gripmock { // The request message containing the user's name. message Request { string name = 1; + int64 vint64 = 2; + uint64 vuint64 = 3; } // The response message containing the greetings diff --git a/example/simple/stub/uint64_int64.yml b/example/simple/stub/uint64_int64.yml new file mode 100644 index 00000000..bd798ae6 --- /dev/null +++ b/example/simple/stub/uint64_int64.yml @@ -0,0 +1,12 @@ +--- +- service: Gripmock + method: SayHello + input: + equals: + # {"high":72057594037927936,"low":0} + vint64: 72057594037927936 + # {"high":18446744073709551615,"low":18446744073709551615} + vuint64: 18446744073709551615 + output: + data: + message: "72057594037927936 18446744073709551615" \ No newline at end of file diff --git a/protogen/example/simple/simple.pb.go b/protogen/example/simple/simple.pb.go index 14d677b0..d6073ef4 100644 --- a/protogen/example/simple/simple.pb.go +++ b/protogen/example/simple/simple.pb.go @@ -26,7 +26,9 @@ type Request struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Vint64 int64 `protobuf:"varint,2,opt,name=vint64,proto3" json:"vint64,omitempty"` + Vuint64 uint64 `protobuf:"varint,3,opt,name=vuint64,proto3" json:"vuint64,omitempty"` } func (x *Request) Reset() { @@ -68,6 +70,20 @@ func (x *Request) GetName() string { return "" } +func (x *Request) GetVint64() int64 { + if x != nil { + return x.Vint64 + } + return 0 +} + +func (x *Request) GetVuint64() uint64 { + if x != nil { + return x.Vuint64 + } + return 0 +} + // The response message containing the greetings type Reply struct { state protoimpl.MessageState @@ -128,21 +144,23 @@ var File_simple_proto protoreflect.FileDescriptor var file_simple_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, - 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x1d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x36, 0x0a, 0x08, 0x47, 0x72, 0x69, - 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x12, 0x0f, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x74, 0x6f, 0x6b, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, - 0x63, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x76, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x22, 0x42, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x32, 0x36, 0x0a, 0x08, 0x47, + 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, + 0x6c, 0x6c, 0x6f, 0x12, 0x0f, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x62, 0x61, 0x76, 0x69, 0x78, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x6d, 0x6f, 0x63, 0x6b, + 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 9d3b7eac4f0198c86db6571b5ce7fcd05248877f Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 12:05:25 +0300 Subject: [PATCH 45/74] docs init --- .gitignore | 3 +- docs/.nojekyll | 0 docs/README.md | 1 + docs/_sidebar.md | 2 + docs/dist/bundle.css | 2 + docs/dist/bundle.js | 2 + docs/dist/bundle.js.LICENSE.txt | 8 + docs/icon.svg | 1 + docs/index.html | 25 + docs/src/index.js | 6 + package-lock.json | 2055 +++++++++++++++++++++++++++++++ package.json | 28 + webpack.config.js | 32 + 13 files changed, 2164 insertions(+), 1 deletion(-) create mode 100644 docs/.nojekyll create mode 120000 docs/README.md create mode 100644 docs/_sidebar.md create mode 100644 docs/dist/bundle.css create mode 100644 docs/dist/bundle.js create mode 100644 docs/dist/bundle.js.LICENSE.txt create mode 100644 docs/icon.svg create mode 100644 docs/index.html create mode 100644 docs/src/index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index 22ec995b..7bd94f99 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ protogen/* !protogen/go.mod !protogen/empty.go !protogen/example/ -temp \ No newline at end of file +temp +node_modules/ diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/docs/README.md b/docs/README.md new file mode 120000 index 00000000..32d46ee8 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 00000000..433b74eb --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,2 @@ +- Getting started + - [Introduction](README) diff --git a/docs/dist/bundle.css b/docs/dist/bundle.css new file mode 100644 index 00000000..9730d6ed --- /dev/null +++ b/docs/dist/bundle.css @@ -0,0 +1,2 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600); +*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}img.emoji{height:1.2em}img.emoji,span.emoji{vertical-align:middle}span.emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.2em}.progress{background-color:#42b983;background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:#42b983;color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:#42b983;color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:#42b983;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:#42b983;background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave .56s ease-in-out}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{position:relative;align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;min-height:100vh;width:100%;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;bottom:0;width:100%}section.cover .cover-main{flex:1;margin:0 16px;text-align:center;position:relative}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid #42b983;border-color:var(--theme-color,#42b983);box-sizing:border-box;color:#42b983;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:#42b983;background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:#42b983;color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid #42b983;border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0;content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:#42b983;color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:#42b983;color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto} diff --git a/docs/dist/bundle.js b/docs/dist/bundle.js new file mode 100644 index 00000000..492eaee5 --- /dev/null +++ b/docs/dist/bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see bundle.js.LICENSE.txt */ +(()=>{var n={807:(n,e,i)=>{!function(){function n(n){var e=Object.create(null);return function(i){var o=a(i)?i:JSON.stringify(i);return e[o]||(e[o]=n(i))}}var e=n((function(n){return n.replace(/([A-Z])/g,(function(n){return"-"+n.toLowerCase()}))})),o=Object.prototype.hasOwnProperty,c=Object.assign||function(n){for(var e=arguments,i=1;i0&&e[1].toLowerCase()!==location.protocol||"string"==typeof e[2]&&e[2].length>0&&e[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host||!!/^\/\\/.test(n)}var r=document.body.clientWidth<=600,d=window.history&&window.history.pushState&&window.history.replaceState&&!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/),p={};function g(n,e){if(void 0===e&&(e=!1),"string"==typeof n){if(void 0!==window.Vue)return _(n);n=e?_(n):p[n]||(p[n]=_(n))}return n}var s=document,v=s.body,l=s.head;function _(n,e){return e?n.querySelector(e):s.querySelector(n)}function h(n,e){return[].slice.call(e?n.querySelectorAll(e):s.querySelectorAll(n))}function m(n,e){return n=s.createElement(n),e&&(n.innerHTML=e),n}function b(n,e){return n.appendChild(e)}function w(n,e){return n.insertBefore(e,n.children[0])}function k(n,e,i){f(e)?window.addEventListener(n,e):n.addEventListener(e,i)}function y(n,e,i){f(e)?window.removeEventListener(n,e):n.removeEventListener(e,i)}function x(n,e,i){n&&n.classList[i?e:"toggle"](i||e)}function S(n,e){void 0===e&&(e=document);var i=e.readyState;if("complete"===i||"interactive"===i)return setTimeout(n,0);e.addEventListener("DOMContentLoaded",n)}var A=Object.freeze({__proto__:null,getNode:g,$:s,body:v,head:l,find:_,findAll:h,create:m,appendTo:b,before:w,on:k,off:y,toggleClass:x,style:function(n){b(l,m("style",n))},documentReady:S});function E(n,e){return-1!==n.indexOf(e,n.length-e.length)}var z=decodeURIComponent,$=encodeURIComponent;function T(n){var e={};return(n=n.trim().replace(/^(\?|#|&)/,""))?(n.split("&").forEach((function(n){var i=n.replace(/\+/g," ").split("=");e[i[0]]=i[1]&&z(i[1])})),e):e}function O(n,e){void 0===e&&(e=[]);var i=[];for(var o in n)e.indexOf(o)>-1||i.push(n[o]?($(o)+"="+$(n[o])).toLowerCase():$(o));return i.length?"?"+i.join("&"):""}var R=n((function(n){return/(:|(\/{2}))/g.test(n)})),j=n((function(n){return n.split(/[?#]/)[0]})),L=n((function(n){if(/\/$/g.test(n))return n;var e=n.match(/(\S*\/)[^/]+$/);return e?e[1]:""})),C=n((function(n){return n.replace(/^\/+/,"/").replace(/([^:])\/{2,}/g,"$1/")})),F=n((function(n){for(var e=n.replace(/^\//,"").split("/"),i=[],o=0,c=e.length;o=0?e:0)+"#"+n)}M.prototype.getBasePath=function(){return this.config.basePath},M.prototype.getFile=function(n,e){void 0===n&&(n=this.getCurrentPath());var i=this.config,o=this.getBasePath(),c="string"==typeof i.ext?i.ext:".md";return n=function(n,e){return new RegExp("\\.("+e.replace(/^\./,"")+"|html)$","g").test(n)?n:/\/$/g.test(n)?n+"README"+e:""+n+e}(n=i.alias?D(n,i.alias):n,c),n=n==="/README"+c&&i.homepage||n,n=R(n)?n:q(o,n),e&&(n=n.replace(new RegExp("^"+o),"")),n},M.prototype.onchange=function(n){void 0===n&&(n=t),n()},M.prototype.getCurrentPath=function(){},M.prototype.normalize=function(){},M.prototype.parse=function(){},M.prototype.toURL=function(n,e,i){var o=i&&"#"===n[0],a=this.parse(I(n));if(a.query=c({},a.query,e),n=(n=a.path+O(a.query)).replace(/\.md(\?)|\.md$/,"$1"),o){var t=i.indexOf("?");n=(t>0?i.substring(0,t):i)+n}if(this.config.relativePath&&0!==n.indexOf("/")){var f=i.substring(0,i.lastIndexOf("/")+1);return C(F(f+n))}return C("/"+n)};var U,B,G=function(n){function e(e){n.call(this,e),this.mode="hash"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getBasePath=function(){var n=window.location.pathname||"",e=this.config.basePath,i=E(n,".html")?n+"#/"+e:n+"/"+e;return/^(\/|https?:)/g.test(e)?e:C(i)},e.prototype.getCurrentPath=function(){var n=location.href,e=n.indexOf("#");return-1===e?"":n.slice(e+1)},e.prototype.onchange=function(n){void 0===n&&(n=t);var e=!1;k("click",(function(n){var i="A"===n.target.tagName?n.target:n.target.parentNode;i&&"A"===i.tagName&&!u(i.href)&&(e=!0)})),k("hashchange",(function(i){var o=e?"navigate":"history";e=!1,n({event:i,source:o})}))},e.prototype.normalize=function(){var n=this.getCurrentPath();if("/"===(n=I(n)).charAt(0))return H(n);H("/"+n)},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("#");i>=0&&(n=n.slice(i+1));var o=n.indexOf("?");return o>=0&&(e=n.slice(o+1),n=n.slice(0,o)),{path:n,file:this.getFile(n,!0),query:T(e)}},e.prototype.toURL=function(e,i,o){return"#"+n.prototype.toURL.call(this,e,i,o)},e}(M),Z=function(n){function e(e){n.call(this,e),this.mode="history"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getCurrentPath=function(){var n=this.getBasePath(),e=window.location.pathname;return n&&0===e.indexOf(n)&&(e=e.slice(n.length)),(e||"/")+window.location.search+window.location.hash},e.prototype.onchange=function(n){void 0===n&&(n=t),k("click",(function(e){var i="A"===e.target.tagName?e.target:e.target.parentNode;if(i&&"A"===i.tagName&&!u(i.href)){e.preventDefault();var o=i.href;window.history.pushState({key:o},"",o),n({event:e,source:"navigate"})}})),k("popstate",(function(e){n({event:e,source:"history"})}))},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("?");i>=0&&(e=n.slice(i+1),n=n.slice(0,i));var o=q(location.origin),c=n.indexOf(o);return c>-1&&(n=n.slice(c+o.length)),{path:n,file:this.getFile(n),query:T(e)}},e}(M),Y={},V=/([^{]*?)\w(?=\})/g,X={YYYY:"getFullYear",YY:"getYear",MM:function(n){return n.getMonth()+1},DD:"getDate",HH:"getHours",mm:"getMinutes",ss:"getSeconds",fff:"getMilliseconds"};function W(n){var e,i,o=n.loaded,c=n.total,a=n.step;!U&&((i=m("div")).classList.add("progress"),b(v,i),U=i),e=a?(e=parseInt(U.style.width||0,10)+a)>80?80:e:Math.floor(o/c*100),U.style.opacity=1,U.style.width=e>=95?"100%":e+"%",e>=95&&(clearTimeout(B),B=setTimeout((function(n){U.style.opacity=0,U.style.width="0%"}),200))}var K={};function J(n,e,i){void 0===e&&(e=!1),void 0===i&&(i={});var c=new XMLHttpRequest,a=function(){c.addEventListener.apply(c,arguments)},f=K[n];if(f)return{then:function(n){return n(f.content,f.opt)},abort:t};for(var u in c.open("GET",n),i)o.call(i,u)&&c.setRequestHeader(u,i[u]);return c.send(),{then:function(i,o){if(void 0===o&&(o=t),e){var f=setInterval((function(n){return W({step:Math.floor(5*Math.random()+1)})}),500);a("progress",W),a("loadend",(function(n){W(n),clearInterval(f)}))}a("error",o),a("load",(function(e){var a=e.target;if(a.status>=400)o(a);else{var t=K[n]={content:a.response,opt:{updatedAt:c.getResponseHeader("last-modified")}};i(t.content,t.opt)}}))},abort:function(n){return 4!==c.readyState&&c.abort()}}}function Q(n,e){n.innerHTML=n.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,e)}var nn=s.title;function en(){var n=g("section.cover");if(n){var e=n.getBoundingClientRect().height;window.pageYOffset>=e||n.classList.contains("hidden")?x(v,"add","sticky"):x(v,"remove","sticky")}}function on(n,e,i,o){var c=[];null!=(e=g(e))&&(c=h(e,"a"));var a,t=decodeURI(n.toURL(n.getCurrentPath()));return c.sort((function(n,e){return e.href.length-n.href.length})).forEach((function(n){var e=decodeURI(n.getAttribute("href")),o=i?n.parentNode:n;n.title=n.title||n.innerText,0!==t.indexOf(e)||a?x(o,"remove","active"):(a=n,x(o,"add","active"))})),o&&(s.title=a?a.title||a.innerText+" - "+nn:nn),a}var cn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.start=e.start,this.end=e.end,this.decimal=e.decimal}return cn(n,[{key:"getIntermediateValue",value:function(n){return this.decimal?n:Math.round(n)}},{key:"getFinalValue",value:function(){return this.end}}]),n}(),tn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.tweener=e.tweener||new an(e),this.start=this.tweener.start,this.end=this.tweener.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.startthis.end&&n>=this.next}[this.direction]}},{key:"_defaultEase",value:function(n,e,i,o){return(n/=o/2)<1?i/2*n*n+e:-i/2*(--n*(n-2)-1)+e}}]),n}(),un=document.currentScript;function rn(n){var i=c({auto2top:!1,autoHeader:!1,basePath:"",catchPluginErrors:!0,cornerExternalLinkTarget:"_blank",coverpage:"",el:"#app",executeScript:null,ext:".md",externalLinkRel:"noopener",externalLinkTarget:"_blank",formatUpdated:"",ga:"",homepage:"README.md",loadNavbar:null,loadSidebar:null,maxLevel:6,mergeNavbar:!1,name:"",nameLink:window.location.pathname,nativeEmoji:!1,noCompileLinks:[],noEmoji:!1,notFoundPage:!0,relativePath:!1,repo:"",routes:{},routerMode:"hash",subMaxLevel:0,themeColor:"",topMargin:0},"function"==typeof window.$docsify?window.$docsify(n):window.$docsify),t=un||[].slice.call(document.getElementsByTagName("script")).filter((function(n){return/docsify\./.test(n.src)}))[0];if(t)for(var f in i)if(o.call(i,f)){var u=t.getAttribute("data-"+e(f));a(u)&&(i[f]=""===u||u)}return!0===i.loadSidebar&&(i.loadSidebar="_sidebar"+i.ext),!0===i.loadNavbar&&(i.loadNavbar="_navbar"+i.ext),!0===i.coverpage&&(i.coverpage="_coverpage"+i.ext),!0===i.repo&&(i.repo=""),!0===i.name&&(i.name=""),window.$docsify=i,i}var dn={},pn=!1,gn=null,sn=!0,vn=0;function ln(n){if(sn){for(var e,i=g(".sidebar"),o=h(".anchor"),c=_(i,".sidebar-nav"),a=_(i,"li.active"),t=document.documentElement,f=(t&&t.scrollTop||document.body.scrollTop)-vn,u=0,r=o.length;uf){e||(e=d);break}e=d}if(e){var p=dn[_n(n,e.getAttribute("data-id"))];if(p&&p!==a&&(a&&a.classList.remove("active"),p.classList.add("active"),a=p,!pn&&v.classList.contains("sticky"))){var s=i.clientHeight,l=a.offsetTop+a.clientHeight+40,m=a.offsetTop>=c.scrollTop&&l<=c.scrollTop+s,b=l-0"']/),yn=/[&<>"']/g,xn=/[<>"']|&(?!#?\w+;)/,Sn=/[<>"']|&(?!#?\w+;)/g,An={"&":"&","<":"<",">":">",'"':""","'":"'"},En=function(n){return An[n]},zn=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function $n(n){return n.replace(zn,(function(n,e){return"colon"===(e=e.toLowerCase())?":":"#"===e.charAt(0)?"x"===e.charAt(1)?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""}))}var Tn=/(^|[^\[])\^/g,On=/[^\w:]/g,Rn=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i,jn={},Ln=/^[^:]+:\/*[^/]*$/,Cn=/^([^:]+:)[\s\S]*$/,Fn=/^([^:]+:\/*[^/]*)[\s\S]*$/;function Pn(n,e,i){var o=n.length;if(0===o)return"";for(var c=0;c=0&&"\\"===i[c];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(i.length>e)i.splice(e);else for(;i.length1?{type:"space",raw:e[0]}:{raw:"\n"}},n.prototype.code=function(n,e){var i=this.rules.block.code.exec(n);if(i){var o=e[e.length-1];if(o&&"paragraph"===o.type)return{raw:i[0],text:i[0].trimRight()};var c=i[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:i[0],codeBlockStyle:"indented",text:this.options.pedantic?c:Hn(c,"\n")}}},n.prototype.fences=function(n){var e=this.rules.block.fences.exec(n);if(e){var i=e[0],o=function(n,e){var i=n.match(/^(\s+)(?:```)/);if(null===i)return e;var o=i[1];return e.split("\n").map((function(n){var e=n.match(/^\s+/);return null===e?n:e[0].length>=o.length?n.slice(o.length):n})).join("\n")}(i,e[3]||"");return{type:"code",raw:i,lang:e[2]?e[2].trim():e[2],text:o}}},n.prototype.heading=function(n){var e=this.rules.block.heading.exec(n);if(e){var i=e[2].trim();if(/#$/.test(i)){var o=Hn(i,"#");this.options.pedantic?i=o.trim():o&&!/ $/.test(o)||(i=o.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:i}}},n.prototype.nptable=function(n){var e=this.rules.block.nptable.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(i.header.length===i.align.length){var o,c=i.align.length;for(o=0;o ?/gm,"");return{type:"blockquote",raw:e[0],text:i}}},n.prototype.list=function(n){var e=this.rules.block.list.exec(n);if(e){var i,o,c,a,t,f,u,r,d=e[0],p=e[2],g=p.length>1,s={type:"list",raw:d,ordered:g,start:g?+p.slice(0,-1):"",loose:!1,items:[]},v=e[0].match(this.rules.block.item),l=!1,_=v.length;c=this.rules.block.listItemStart.exec(v[0]);for(var h=0;h<_;h++){if(d=i=v[h],h!==_-1){if(a=this.rules.block.listItemStart.exec(v[h+1]),this.options.pedantic?a[1].length>c[1].length:a[1].length>c[0].length||a[1].length>3){v.splice(h,2,v[h]+"\n"+v[h+1]),h--,_--;continue}(!this.options.pedantic||this.options.smartLists?a[2][a[2].length-1]!==p[p.length-1]:g===(1===a[2].length))&&(t=v.slice(h+1).join("\n"),s.raw=s.raw.substring(0,s.raw.length-t.length),h=_-1),c=a}o=i.length,~(i=i.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=i.length,i=this.options.pedantic?i.replace(/^ {1,4}/gm,""):i.replace(new RegExp("^ {1,"+o+"}","gm"),"")),f=l||/\n\n(?!\s*$)/.test(i),h!==_-1&&(l="\n"===i.charAt(i.length-1),f||(f=l)),f&&(s.loose=!0),this.options.gfm&&(r=void 0,(u=/^\[[ xX]\] /.test(i))&&(r=" "!==i[1],i=i.replace(/^\[[ xX]\] +/,""))),s.items.push({type:"list_item",raw:d,task:u,checked:r,loose:f,text:i})}return s}},n.prototype.html=function(n){var e=this.rules.block.html.exec(n);if(e)return{type:this.options.sanitize?"paragraph":"html",raw:e[0],pre:!this.options.sanitizer&&("pre"===e[1]||"script"===e[1]||"style"===e[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Bn(e[0]):e[0]}},n.prototype.def=function(n){var e=this.rules.block.def.exec(n);if(e)return e[3]&&(e[3]=e[3].substring(1,e[3].length-1)),{tag:e[1].toLowerCase().replace(/\s+/g," "),raw:e[0],href:e[2],title:e[3]}},n.prototype.table=function(n){var e=this.rules.block.table.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[]};if(i.header.length===i.align.length){i.raw=e[0];var o,c=i.align.length;for(o=0;o/i.test(o[0])&&(e=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:e,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):Bn(o[0]):o[0]}},n.prototype.link=function(n){var e=this.rules.inline.link.exec(n);if(e){var i=e[2].trim();if(!this.options.pedantic&&/^$/.test(i))return;var o=Hn(i.slice(0,-1),"\\");if((i.length-o.length)%2==0)return}else{var c=Gn(e[2],"()");if(c>-1){var a=(0===e[0].indexOf("!")?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,a).trim(),e[3]=""}}var t=e[2],f="";if(this.options.pedantic){var u=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(t);u&&(t=u[1],f=u[3])}else f=e[3]?e[3].slice(1,-1):"";return t=t.trim(),/^$/.test(i)?t.slice(1):t.slice(1,-1)),Zn(e,{href:t?t.replace(this.rules.inline._escapes,"$1"):t,title:f?f.replace(this.rules.inline._escapes,"$1"):f},e[0])}},n.prototype.reflink=function(n,e){var i;if((i=this.rules.inline.reflink.exec(n))||(i=this.rules.inline.nolink.exec(n))){var o=(i[2]||i[1]).replace(/\s+/g," ");if(!(o=e[o.toLowerCase()])||!o.href){var c=i[0].charAt(0);return{type:"text",raw:c,text:c}}return Zn(i,o,i[0])}},n.prototype.strong=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.strong.middle.exec(e.slice(0,o.index+3)))return{type:"strong",raw:n.slice(0,c[0].length),text:n.slice(2,c[0].length-2)}}},n.prototype.em=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.em.middle.exec(e.slice(0,o.index+2)))return{type:"em",raw:n.slice(0,c[0].length),text:n.slice(1,c[0].length-1)}}},n.prototype.codespan=function(n){var e=this.rules.inline.code.exec(n);if(e){var i=e[2].replace(/\n/g," "),o=/[^ ]/.test(i),c=/^ /.test(i)&&/ $/.test(i);return o&&c&&(i=i.substring(1,i.length-1)),i=Bn(i,!0),{type:"codespan",raw:e[0],text:i}}},n.prototype.br=function(n){var e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}},n.prototype.del=function(n){var e=this.rules.inline.del.exec(n);if(e)return{type:"del",raw:e[0],text:e[2]}},n.prototype.autolink=function(n,e){var i,o,c=this.rules.inline.autolink.exec(n);if(c)return o="@"===c[2]?"mailto:"+(i=Bn(this.options.mangle?e(c[1]):c[1])):i=Bn(c[1]),{type:"link",raw:c[0],text:i,href:o,tokens:[{type:"text",raw:i,text:i}]}},n.prototype.url=function(n,e){var i;if(i=this.rules.inline.url.exec(n)){var o,c;if("@"===i[2])c="mailto:"+(o=Bn(this.options.mangle?e(i[0]):i[0]));else{var a;do{a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0]}while(a!==i[0]);o=Bn(i[0]),c="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:c,tokens:[{type:"text",raw:o,text:o}]}}},n.prototype.inlineText=function(n,e,i){var o,c=this.rules.inline.text.exec(n);if(c)return o=e?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(c[0]):Bn(c[0]):c[0]:Bn(this.options.smartypants?i(c[0]):c[0]),{type:"text",raw:c[0],text:o}},n}(),Vn={exec:function(){}},Xn=function(n,e){n=n.source||n,e=e||"";var i={replace:function(e,o){return o=(o=o.source||o).replace(Tn,"$1"),n=n.replace(e,o),i},getRegex:function(){return new RegExp(n,e)}};return i},Wn=Nn,Kn={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Vn,table:Vn,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Kn.def=Xn(Kn.def).replace("label",Kn._label).replace("title",Kn._title).getRegex(),Kn.bullet=/(?:[*+-]|\d{1,9}[.)])/,Kn.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Kn.item=Xn(Kn.item,"gm").replace(/bull/g,Kn.bullet).getRegex(),Kn.listItemStart=Xn(/^( *)(bull)/).replace("bull",Kn.bullet).getRegex(),Kn.list=Xn(Kn.list).replace(/bull/g,Kn.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Kn.def.source+")").getRegex(),Kn._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Kn._comment=/|$)/,Kn.html=Xn(Kn.html,"i").replace("comment",Kn._comment).replace("tag",Kn._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Kn.paragraph=Xn(Kn._paragraph).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.blockquote=Xn(Kn.blockquote).replace("paragraph",Kn.paragraph).getRegex(),Kn.normal=Wn({},Kn),Kn.gfm=Wn({},Kn.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Kn.gfm.nptable=Xn(Kn.gfm.nptable).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.gfm.table=Xn(Kn.gfm.table).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.pedantic=Wn({},Kn.normal,{html:Xn("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Kn._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Vn,paragraph:Xn(Kn.normal._paragraph).replace("hr",Kn.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Kn.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Jn={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Vn,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Vn,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};Jn.punctuation=Xn(Jn.punctuation).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Jn._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Jn._comment=Xn(Kn._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Jn.em.start=Xn(Jn.em.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.middle=Xn(Jn.em.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.em.endAst=Xn(Jn.em.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.endUnd=Xn(Jn.em.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.start=Xn(Jn.strong.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.middle=Xn(Jn.strong.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.strong.endAst=Xn(Jn.strong.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.endUnd=Xn(Jn.strong.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.blockSkip=Xn(Jn._blockSkip,"g").getRegex(),Jn.overlapSkip=Xn(Jn._overlapSkip,"g").getRegex(),Jn._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Jn._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Jn._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Jn.autolink=Xn(Jn.autolink).replace("scheme",Jn._scheme).replace("email",Jn._email).getRegex(),Jn._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Jn.tag=Xn(Jn.tag).replace("comment",Jn._comment).replace("attribute",Jn._attribute).getRegex(),Jn._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Jn._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Jn._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Jn.link=Xn(Jn.link).replace("label",Jn._label).replace("href",Jn._href).replace("title",Jn._title).getRegex(),Jn.reflink=Xn(Jn.reflink).replace("label",Jn._label).getRegex(),Jn.reflinkSearch=Xn(Jn.reflinkSearch,"g").replace("reflink",Jn.reflink).replace("nolink",Jn.nolink).getRegex(),Jn.normal=Wn({},Jn),Jn.pedantic=Wn({},Jn.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Xn(/^!?\[(label)\]\((.*?)\)/).replace("label",Jn._label).getRegex(),reflink:Xn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Jn._label).getRegex()}),Jn.gfm=Wn({},Jn.normal,{escape:Xn(Jn.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\1;)1&e&&(i+=n),e>>=1,n+=n;return i+n};function ce(n){return n.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")}function ae(n){var e,i,o="",c=n.length;for(e=0;e.5&&(i="x"+i.toString(16)),o+="&#"+i+";";return o}var te=function(){function n(n){this.tokens=[],this.tokens.links=Object.create(null),this.options=n||ne,this.options.tokenizer=this.options.tokenizer||new Yn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var e={block:ee.normal,inline:ie.normal};this.options.pedantic?(e.block=ee.pedantic,e.inline=ie.pedantic):this.options.gfm&&(e.block=ee.gfm,this.options.breaks?e.inline=ie.breaks:e.inline=ie.gfm),this.tokenizer.rules=e}var e={rules:{configurable:!0}};return e.rules.get=function(){return{block:ee,inline:ie}},n.lex=function(e,i){return new n(i).lex(e)},n.lexInline=function(e,i){return new n(i).inlineTokens(e)},n.prototype.lex=function(n){return n=n.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.blockTokens(n,this.tokens,!0),this.inline(this.tokens),this.tokens},n.prototype.blockTokens=function(n,e,i){var o,c,a,t;for(void 0===e&&(e=[]),void 0===i&&(i=!0),this.options.pedantic&&(n=n.replace(/^ +$/gm,""));n;)if(o=this.tokenizer.space(n))n=n.substring(o.raw.length),o.type&&e.push(o);else if(o=this.tokenizer.code(n,e))n=n.substring(o.raw.length),o.type?e.push(o):((t=e[e.length-1]).raw+="\n"+o.raw,t.text+="\n"+o.text);else if(o=this.tokenizer.fences(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.heading(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.nptable(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.hr(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.blockquote(n))n=n.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],i),e.push(o);else if(o=this.tokenizer.list(n)){for(n=n.substring(o.raw.length),a=o.items.length,c=0;c0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(u));)r.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(u));)u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;n;)if(t||(f=""),t=!1,c=this.tokenizer.escape(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.tag(n,i,o))n=n.substring(c.raw.length),i=c.inLink,o=c.inRawBlock,e.push(c);else if(c=this.tokenizer.link(n))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.reflink(n,this.tokens.links))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.strong(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.em(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.codespan(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.br(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.del(n))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.autolink(n,ae))n=n.substring(c.raw.length),e.push(c);else if(i||!(c=this.tokenizer.url(n,ae))){if(c=this.tokenizer.inlineText(n,o,ce))n=n.substring(c.raw.length),f=c.raw.slice(-1),t=!0,e.push(c);else if(n){var d="Infinite loop on byte: "+n.charCodeAt(0);if(this.options.silent){console.error(d);break}throw new Error(d)}}else n=n.substring(c.raw.length),e.push(c);return e},Object.defineProperties(n,e),n}(),fe=wn.defaults,ue=function(n,e,i){if(n){var o;try{o=decodeURIComponent($n(i)).replace(On,"").toLowerCase()}catch(n){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}e&&!Rn.test(i)&&(i=function(n,e){jn[" "+n]||(Ln.test(n)?jn[" "+n]=n+"/":jn[" "+n]=Pn(n,"/",!0));var i=-1===(n=jn[" "+n]).indexOf(":");return"//"===e.substring(0,2)?i?e:n.replace(Cn,"$1")+e:"/"===e.charAt(0)?i?e:n.replace(Fn,"$1")+e:n+e}(e,i));try{i=encodeURI(i).replace(/%25/g,"%")}catch(n){return null}return i},re=qn,de=function(){function n(n){this.options=n||fe}return n.prototype.code=function(n,e,i){var o=(e||"").match(/\S*/)[0];if(this.options.highlight){var c=this.options.highlight(n,o);null!=c&&c!==n&&(i=!0,n=c)}return n=n.replace(/\n$/,"")+"\n",o?'
'+(i?n:re(n,!0))+"
\n":"
"+(i?n:re(n,!0))+"
\n"},n.prototype.blockquote=function(n){return"
\n"+n+"
\n"},n.prototype.html=function(n){return n},n.prototype.heading=function(n,e,i,o){return this.options.headerIds?"'+n+"\n":""+n+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},n.prototype.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+(e&&1!==i?' start="'+i+'"':"")+">\n"+n+"\n"},n.prototype.listitem=function(n){return"
  • "+n+"
  • \n"},n.prototype.checkbox=function(n){return" "},n.prototype.paragraph=function(n){return"

    "+n+"

    \n"},n.prototype.table=function(n,e){return e&&(e=""+e+""),"\n\n"+n+"\n"+e+"
    \n"},n.prototype.tablerow=function(n){return"\n"+n+"\n"},n.prototype.tablecell=function(n,e){var i=e.header?"th":"td";return(e.align?"<"+i+' align="'+e.align+'">':"<"+i+">")+n+"\n"},n.prototype.strong=function(n){return""+n+""},n.prototype.em=function(n){return""+n+""},n.prototype.codespan=function(n){return""+n+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(n){return""+n+""},n.prototype.link=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o='"+i+""},n.prototype.image=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o=''+i+'":">")},n.prototype.text=function(n){return n},n}(),pe=function(){function n(){}return n.prototype.strong=function(n){return n},n.prototype.em=function(n){return n},n.prototype.codespan=function(n){return n},n.prototype.del=function(n){return n},n.prototype.html=function(n){return n},n.prototype.text=function(n){return n},n.prototype.link=function(n,e,i){return""+i},n.prototype.image=function(n,e,i){return""+i},n.prototype.br=function(){return""},n}(),ge=function(){function n(){this.seen={}}return n.prototype.serialize=function(n){return n.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},n.prototype.getNextSafeSlug=function(n,e){var i=n,o=0;if(this.seen.hasOwnProperty(i)){o=this.seen[n];do{i=n+"-"+ ++o}while(this.seen.hasOwnProperty(i))}return e||(this.seen[n]=o,this.seen[i]=0),i},n.prototype.slug=function(n,e){void 0===e&&(e={});var i=this.serialize(n);return this.getNextSafeSlug(i,e.dryrun)},n}(),se=wn.defaults,ve=In,le=function(){function n(n){this.options=n||se,this.options.renderer=this.options.renderer||new de,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new pe,this.slugger=new ge}return n.parse=function(e,i){return new n(i).parse(e)},n.parseInline=function(e,i){return new n(i).parseInline(e)},n.prototype.parse=function(n,e){void 0===e&&(e=!0);var i,o,c,a,t,f,u,r,d,p,g,s,v,l,_,h,m,b,w="",k=n.length;for(i=0;i0&&"text"===_.tokens[0].type?(_.tokens[0].text=b+" "+_.tokens[0].text,_.tokens[0].tokens&&_.tokens[0].tokens.length>0&&"text"===_.tokens[0].tokens[0].type&&(_.tokens[0].tokens[0].text=b+" "+_.tokens[0].tokens[0].text)):_.tokens.unshift({type:"text",text:b}):l+=b),l+=this.parse(_.tokens,v),d+=this.renderer.listitem(l,m,h);w+=this.renderer.list(d,g,s);continue;case"html":w+=this.renderer.html(p.text);continue;case"paragraph":w+=this.renderer.paragraph(this.parseInline(p.tokens));continue;case"text":for(d=p.tokens?this.parseInline(p.tokens):p.text;i+1An error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}}ye.options=ye.setOptions=function(n){return _e(ye.defaults,n),we(ye.defaults),ye},ye.getDefaults=be,ye.defaults=ke,ye.use=function(n){var e=_e({},n);if(n.renderer){var i=ye.defaults.renderer||new de,o=function(e){var o=i[e];i[e]=function(){for(var c=[],a=arguments.length;a--;)c[a]=arguments[a];var t=n.renderer[e].apply(i,c);return!1===t&&(t=o.apply(i,c)),t}};for(var c in n.renderer)o(c);e.renderer=i}if(n.tokenizer){var a=ye.defaults.tokenizer||new Yn,t=function(e){var i=a[f];a[f]=function(){for(var e=[],o=arguments.length;o--;)e[o]=arguments[o];var c=n.tokenizer[f].apply(a,e);return!1===c&&(c=i.apply(a,e)),c}};for(var f in n.tokenizer)t();e.tokenizer=a}if(n.walkTokens){var u=ye.defaults.walkTokens;e.walkTokens=function(e){n.walkTokens(e),u&&u(e)}}ye.setOptions(e)},ye.walkTokens=function(n,e){for(var i=0,o=n;iAn error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}},ye.Parser=le,ye.parser=le.parse,ye.Renderer=de,ye.TextRenderer=pe,ye.Lexer=te,ye.lexer=te.lex,ye.Tokenizer=Yn,ye.Slugger=ge,ye.parse=ye;var xe=ye;function Se(n,e){if(void 0===e&&(e='
      {inner}
    '),!n||!n.length)return"";var i="";return n.forEach((function(n){var o=n.title.replace(/(<([^>]+)>)/g,"");i+='
  • '+n.title+"
  • ",n.children&&(i+=Se(n.children,e))})),e.replace("{inner}",i)}function Ae(n,e){return'

    '+e.slice(5).trim()+"

    "}function Ee(n,e){var i=[],o={};return n.forEach((function(n){var c=n.level||1,a=c-1;c>e||(o[a]?o[a].children=(o[a].children||[]).concat(n):i.push(n),o[c]=n)})),i}var ze={},$e=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;function Te(n){return n.toLowerCase()}function Oe(n){if("string"!=typeof n)return"";var e=n.trim().replace(/[A-Z]+/g,Te).replace(/<[^>]+>/g,"").replace($e,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),i=ze[e];return i=o.call(ze,e)?i+1:0,ze[e]=i,i&&(e=e+"-"+i),e}Oe.clear=function(){ze={}};var Re={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function je(n){void 0===n&&(n="");var e={};return n&&(n=n.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,(function(n,i,o){return-1===i.indexOf(":")?(e[i]=o&&o.replace(/"/g,"")||!0,""):n})).trim()),{str:n,config:e}}function Le(n){return void 0===n&&(n=""),n.replace(/(<\/?a.*?>)/gi,"")}var Ce=bn((function(n){var e=function(n){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,i=0,o={},c={manual:n.Prism&&n.Prism.manual,disableWorkerMessageHandler:n.Prism&&n.Prism.disableWorkerMessageHandler,util:{encode:function n(e){return e instanceof a?new a(e.type,n(e.content),e.alias):Array.isArray(e)?e.map(n):e.replace(/&/g,"&").replace(/=p.reach);x+=y.value.length,y=y.next){var S=y.value;if(e.length>n.length)return;if(!(S instanceof a)){var A,E=1;if(m){if(!(A=t(k,x,n,h))||A.index>=n.length)break;var z=A.index,$=A.index+A[0].length,T=x;for(T+=y.value.length;z>=T;)T+=(y=y.next).value.length;if(x=T-=y.value.length,y.value instanceof a)continue;for(var O=y;O!==e.tail&&(T<$||"string"==typeof O.value);O=O.next)E++,T+=O.value.length;E--,S=n.slice(x,T),A.index-=x}else if(!(A=t(k,0,S,h)))continue;z=A.index;var R=A[0],j=S.slice(0,z),L=S.slice(z+R.length),C=x+S.length;p&&C>p.reach&&(p.reach=C);var F=y.prev;if(j&&(F=r(e,F,j),x+=j.length),d(e,F,E),y=r(e,F,new a(g,_?c.tokenize(R,_):R,b,R)),L&&r(e,y,L),E>1){var P={cause:g+","+v,reach:C};f(n,e,i,y.prev,x,P),p&&P.reach>p.reach&&(p.reach=P.reach)}}}}}}function u(){var n={value:null,prev:null,next:null},e={value:null,prev:n,next:null};n.next=e,this.head=n,this.tail=e,this.length=0}function r(n,e,i){var o=e.next,c={value:i,prev:e,next:o};return e.next=c,o.prev=c,n.length++,c}function d(n,e,i){for(var o=e.next,c=0;c"+a.content+""},!n.document)return n.addEventListener?(c.disableWorkerMessageHandler||n.addEventListener("message",(function(e){var i=JSON.parse(e.data),o=i.language,a=i.code,t=i.immediateClose;n.postMessage(c.highlight(a,c.languages[o],o)),t&&n.close()}),!1),c):c;var p=c.util.currentScript();function g(){c.manual||c.highlightAll()}if(p&&(c.filename=p.src,p.hasAttribute("data-manual")&&(c.manual=!0)),!c.manual){var s=document.readyState;"loading"===s||"interactive"===s&&p&&p.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return c}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});n.exports&&(n.exports=e),void 0!==mn&&(mn.Prism=e),e.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",(function(n){"entity"===n.type&&(n.attributes.title=n.content.replace(/&/,"&"))})),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,i){var o={};o["language-"+i]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[i]},o.cdata=/^$/i;var c={"included-cdata":{pattern://i,inside:o}};c["language-"+i]={pattern:/[\s\S]+/,inside:e.languages[i]};var a={};a[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return n})),"i"),lookbehind:!0,greedy:!0,inside:c},e.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(n,i){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+n+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[i,"language-"+i],inside:e.languages[i]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml,function(n){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;n.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},n.languages.css.atrule.inside.rest=n.languages.css;var i=n.languages.markup;i&&(i.tag.addInlined("style","css"),i.tag.addAttribute("style","css"))}(e),e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript,function(){if(void 0!==e&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var n={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},i="data-src-status",o="loading",c="loaded",a="pre[data-src]:not(["+i+'="'+c+'"]):not(['+i+'="'+o+'"])';e.hooks.add("before-highlightall",(function(n){n.selector+=", "+a})),e.hooks.add("before-sanity-check",(function(t){var f=t.element;if(f.matches(a)){t.code="",f.setAttribute(i,o);var u=f.appendChild(document.createElement("CODE"));u.textContent="Loading…";var r=f.getAttribute("data-src"),d=t.language;if("none"===d){var p=(/\.(\w+)$/.exec(r)||[,"none"])[1];d=n[p]||p}e.util.setLanguage(u,d),e.util.setLanguage(f,d);var g=e.plugins.autoloader;g&&g.loadLanguages(d),function(n,o,a){var t=new XMLHttpRequest;t.open("GET",n,!0),t.onreadystatechange=function(){4==t.readyState&&(t.status<400&&t.responseText?function(n){f.setAttribute(i,c);var o=function(n){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(n||"");if(e){var i=Number(e[1]),o=e[2],c=e[3];return o?c?[i,Number(c)]:[i,void 0]:[i,i]}}(f.getAttribute("data-range"));if(o){var a=n.split(/\r\n?|\n/g),t=o[0],r=null==o[1]?a.length:o[1];t<0&&(t+=a.length),t=Math.max(0,Math.min(t-1,a.length)),r<0&&(r+=a.length),r=Math.max(0,Math.min(r,a.length)),n=a.slice(t,r).join("\n"),f.hasAttribute("data-start")||f.setAttribute("data-start",String(t+1))}u.textContent=n,e.highlightElement(u)}(t.responseText):t.status>=400?a("✖ Error "+t.status+" while fetching file: "+t.statusText):a("✖ Error: File does not exist or is empty"))},t.send(null)}(r,0,(function(n){f.setAttribute(i,"failed"),u.textContent=n}))}})),e.plugins.fileHighlight={highlight:function(n){for(var i,o=(n||document).querySelectorAll(a),c=0;i=o[c++];)e.highlightElement(i)}};var t=!1;e.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),e.plugins.fileHighlight.highlight.apply(this,arguments)}}}()}));!function(n){function e(n,e){return"___"+n.toUpperCase()+e+"___"}Object.defineProperties(n.languages["markup-templating"]={},{buildPlaceholders:{value:function(i,o,c,a){if(i.language===o){var t=i.tokenStack=[];i.code=i.code.replace(c,(function(n){if("function"==typeof a&&!a(n))return n;for(var c,f=t.length;-1!==i.code.indexOf(c=e(o,f));)++f;return t[f]=n,c})),i.grammar=n.languages.markup}}},tokenizePlaceholders:{value:function(i,o){if(i.language===o&&i.tokenStack){i.grammar=n.languages[o];var c=0,a=Object.keys(i.tokenStack);!function t(f){for(var u=0;u=a.length);u++){var r=f[u];if("string"==typeof r||r.content&&"string"==typeof r.content){var d=a[c],p=i.tokenStack[d],g="string"==typeof r?r:r.content,s=e(o,d),v=g.indexOf(s);if(v>-1){++c;var l=g.substring(0,v),_=new n.Token(o,n.tokenize(p,i.grammar),"language-"+o,p),h=g.substring(v+s.length),m=[];l&&m.push.apply(m,t([l])),m.push(_),h&&m.push.apply(m,t([h])),"string"==typeof r?f.splice.apply(f,[u,1].concat(m)):r.content=m}}else r.content&&t(r.content)}return f}(i.tokens)}}}})}(Prism);var Fe={},Pe={markdown:function(n){return{url:n}},mermaid:function(n){return{url:n}},iframe:function(n,e){return{html:'"}},video:function(n,e){return{html:'"}},audio:function(n,e){return{html:'"}},code:function(n,e){var i=n.match(/\.(\w+)$/);return"md"===(i=e||i&&i[1])&&(i="markdown"),{url:n,lang:i}}},qe=function(e,i){var o=this;this.config=e,this.router=i,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=e.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?e.externalLinkRel||"noopener":"",this.contentBase=i.getBasePath();var t,u=this._initRenderer();this.heading=u.heading;var r=e.markdown||{};f(r)?t=r(xe,u):(xe.setOptions(c(r,{renderer:c(u,r.renderer)})),t=xe),this._marked=t,this.compile=function(i){var c=!0,f=n((function(n){c=!1;var o="";return i?(o=a(i)?t(i):t.parser(i),o=e.noEmoji?o:function(n,e){return n.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,(function(n){return n.replace(/:/g,"__colon__")})).replace(//g,(function(n){return n.replace(/:/g,"__colon__")})).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,(function(n){return n.replace(/:/g,"__colon__")})).replace(/:([a-z0-9_\-+]+?):/g,(function(n,i){return function(n,e,i){var o=Re.data[e],c=n;return o&&(c=i&&/unicode/.test(o)?''+o.replace("unicode/","").replace(/\.png.*/,"").split("-").map((function(n){return"&#x"+n+";"})).join("‍").concat("︎")+"":''+e+''),c}(n,i,e)})).replace(/__colon__/g,":")}(o,e.nativeEmoji),Oe.clear(),o):i}))(i),u=o.router.parse().file;return c?o.toc=o.cacheTOC[u]:o.cacheTOC[u]=[].concat(o.toc),f}};qe.prototype.compileEmbed=function(n,e){var i,o=je(e),c=o.str,a=o.config;if(e=c,a.include){var t;if(R(n)||(n=q(this.contentBase,L(this.router.getCurrentPath()),n)),a.type&&(t=Pe[a.type]))(i=t.call(this,n,e)).type=a.type;else{var f="code";/\.(md|markdown)/.test(n)?f="markdown":/\.mmd/.test(n)?f="mermaid":/\.html?/.test(n)?f="iframe":/\.(mp4|ogg)/.test(n)?f="video":/\.mp3/.test(n)&&(f="audio"),(i=Pe[f].call(this,n,e)).type=f}return i.fragment=a.fragment,i}},qe.prototype._matchNotCompileLink=function(n){for(var e=this.config.noCompileLinks||[],i=0;i/g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore} --\x3e",""),f.title=Le(o),f.ignoreSubHeading=!0),/{docsify-ignore}/g.test(o)&&(o=o.replace("{docsify-ignore}",""),f.title=Le(o),f.ignoreSubHeading=!0),//g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),f.title=Le(o),f.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(o)&&(o=o.replace("{docsify-ignore-all}",""),f.title=Le(o),f.ignoreAllSubs=!0);var u=Oe(a.id||o),r=c.toURL(c.getCurrentPath(),{id:u});return f.slug=r,t.toc.push(f),"'+o+""},f.code=function(n){return n.renderer.code=function(n,e){void 0===e&&(e="markup");var i=Ce.languages[e]||Ce.languages.markup;return'
    '+Ce.highlight(n.replace(/@DOCSIFY_QM@/g,"`"),i,e)+"
    "}}({renderer:n}),f.link=function(n){var e=n.router,i=n.linkTarget,o=n.linkRel,c=n.compilerClass;return n.renderer.link=function(n,a,t){void 0===a&&(a="");var f=[],u=je(a),r=u.str,d=u.config;return i=d.target||i,o="_blank"===i?c.config.externalLinkRel||"noopener":"",a=r,R(n)||c._matchNotCompileLink(n)||d.ignore?(R(n)||"./"!==n.slice(0,2)||(n=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+n),f.push(0===n.indexOf("mailto:")?"":'target="'+i+'"'),f.push(0===n.indexOf("mailto:")?"":""!==o?' rel="'+o+'"':"")):(n===c.config.homepage&&(n="README"),n=e.toURL(n,null,e.getCurrentPath())),d.disabled&&(f.push("disabled"),n="javascript:void(0)"),d.class&&f.push('class="'+d.class+'"'),d.id&&f.push('id="'+d.id+'"'),a&&f.push('title="'+a+'"'),'"+t+""}}({renderer:n,router:c,linkTarget:i,linkRel:o,compilerClass:t}),f.paragraph=function(n){return n.renderer.paragraph=function(n){return/^!>/.test(n)?Ae("tip",n):/^\?>/.test(n)?Ae("warn",n):"

    "+n+"

    "}}({renderer:n}),f.image=function(n){var e=n.contentBase,i=n.router;return n.renderer.image=function(n,o,c){var a=n,t=[],f=je(o),u=f.str,r=f.config;if(o=u,r["no-zoom"]&&t.push("data-no-zoom"),o&&t.push('title="'+o+'"'),r.size){var d=r.size.split("x"),p=d[0],g=d[1];g?t.push('width="'+p+'" height="'+g+'"'):t.push('width="'+p+'"')}return r.class&&t.push('class="'+r.class+'"'),r.id&&t.push('id="'+r.id+'"'),R(n)||(a=q(e,L(i.getCurrentPath()),n)),t.length>0?''+c+'":''+c+'"}}({renderer:n,contentBase:a,router:c}),f.list=function(n){return n.renderer.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+" "+[/
  • /.test(n.split('class="task-list"')[0])?'class="task-list"':"",i&&i>1?'start="'+i+'"':""].join(" ").trim()+">"+n+""}}({renderer:n}),f.listitem=function(n){return n.renderer.listitem=function(n){return/^(]*>)/.test(n)?'
  • ":"
  • "+n+"
  • "}}({renderer:n}),n.origin=f,n},qe.prototype.sidebar=function(n,e){var i=this.toc,o=this.router.getCurrentPath(),c="";if(n)c=this.compile(n);else{for(var a=0;a{inner}"),this.cacheTree[o]=u}return c},qe.prototype.subSidebar=function(n){if(n){var e=this.router.getCurrentPath(),i=this.cacheTree,o=this.toc;o[0]&&o[0].ignoreAllSubs&&o.splice(0),o[0]&&1===o[0].level&&o.shift();for(var c=0;c *").filter((function(n){return a(n)}));tscript").filter((function(n){return!/template/.test(n.type)}))[0];if(!n)return!1;var e=n.innerText.trim();if(!e)return!1;new Function(e)()}(),"Vue"in window){var r=[],d=Object.keys(e.vueComponents||{});if(2===o&&d.length&&d.forEach((function(n){!window.Vue.options.components[n]&&window.Vue.component(n,e.vueComponents[n])})),!Ie&&e.vueGlobalOptions&&"function"==typeof e.vueGlobalOptions.data&&(Ie=e.vueGlobalOptions.data()),r.push.apply(r,Object.keys(e.vueMounts||{}).map((function(n){return[_(i,n),e.vueMounts[n]]})).filter((function(n){var e=n[0];return n[1],e}))),e.vueGlobalOptions||d.length){var p=/{{2}[^{}]*}{2}/,g=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;r.push.apply(r,h(".markdown-section > *").filter((function(n){return!r.some((function(e){var i=e[0];return e[1],i===n}))})).filter((function(n){return n.tagName.toLowerCase()in(e.vueComponents||{})||n.querySelector(d.join(",")||null)||p.test(n.outerHTML)||g.test(n.outerHTML)})).map((function(n){var i=c({},e.vueGlobalOptions||{});return Ie&&(i.data=function(){return Ie}),[n,i]})))}for(var s=0,v=r;s-1&&"_coverpage";else{var u=i[f];t=!0===u?"_coverpage":u}var r=Boolean(t)&&this.config.onlyCover;return t?(t=this.router.getFile(a+t),this.coverIsHTML=/\.html$/g.test(t),J(t+O(c,["id"]),!1,o).then((function(e){return n._renderCover(e,r)}))):this._renderCover(null,r),r}},e.prototype.$fetch=function(n,e){var i=this;void 0===n&&(n=t),void 0===e&&(e=this.$resetEvents.bind(this));var o=function(){i.callHook("doneEach"),n()};this._fetchCover()?o():this._fetch((function(){e(),o()}))},e.prototype._fetchFallbackPage=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.requestHeaders,u=a.fallbackLanguages,r=a.loadSidebar;if(!u)return!1;var d=n.split("/")[1];if(-1===u.indexOf(d))return!1;var p=this.router.getFile(n.replace(new RegExp("^/"+d),""));return i(p+e,0,f).then((function(i,a){return c._renderMain(i,a,c._loadSideAndNav(n,e,r,o))}),(function(){return c._fetch404(n,e,o)})),!0},e.prototype._fetch404=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.loadSidebar,u=a.requestHeaders,r=a.notFoundPage,d=this._loadSideAndNav(n,e,f,o);if(r){var p=function(n,e){var i,o,c=e.notFoundPage,a="_404"+(e.ext||".md");switch(typeof c){case"boolean":o=a;break;case"string":o=c;break;case"object":o=(i=Object.keys(c).sort((function(n,e){return e.length-n.length})).filter((function(e){return n.match(new RegExp("^"+e))}))[0])&&c[i]||a}return o}(n,this.config);return i(this.router.getFile(p),0,u).then((function(n,e){return c._renderMain(n,e,d)}),(function(){return c._renderMain(null,{},d)})),!0}return this._renderMain(null,{},d),!1},e.prototype.initFetch=function(){var n=this,e=this.config.loadSidebar;if(this.rendered){var i=on(this.router,".sidebar-nav",!0,!0);e&&i&&(i.parentNode.innerHTML+=window.__SUB_SIDEBAR__),this._bindEventOnRendered(i),this.$resetEvents(),this.callHook("doneEach"),this.callHook("ready")}else this.$fetch((function(e){return n.callHook("ready")}))},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.$resetEvents=function(n){var e,i=this,o=this.config.auto2top;"history"!==n&&(i.route.query.id&&function(n,e){if(e){var i,o,c=rn().topMargin,a=_("#"+e);a&&(i=a,void 0===(o=c)&&(o=0),gn&&gn.stop(),sn=!1,gn=new fn({start:window.pageYOffset,end:Math.round(i.getBoundingClientRect().top)+window.pageYOffset-o,duration:500}).on("tick",(function(n){return window.scrollTo(0,n)})).on("done",(function(){sn=!0,gn=null})).begin());var t=dn[_n(n,e)],f=_(g(".sidebar"),"li.active");f&&f.classList.remove("active"),t&&t.classList.add("active")}}(i.route.path,i.route.query.id),"navigate"===n&&o&&(void 0===(e=o)&&(e=0),hn.scrollTop=!0===e?0:Number(e))),this.config.loadNavbar&&on(this.router,"nav")},e.prototype.initEvent=function(){var n,e;n="button.sidebar-toggle",this.router,e=function(n){return v.classList.toggle("close")},null!=(n=g(n))&&(k(n,"click",(function(n){n.stopPropagation(),e()})),r&&k(v,"click",(function(n){return v.classList.contains("close")&&e()}))),function(n){null!=(n=g(n))&&k(n,"click",(function(n){var e=n.target;"A"===e.nodeName&&e.nextSibling&&e.nextSibling.classList&&e.nextSibling.classList.contains("app-sub-sidebar")&&x(e.parentNode,"collapse")}))}(".sidebar",this.router),this.config.coverpage?!r&&k("scroll",en):v.classList.add("sticky")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype._renderTo=function(n,e,i){var o=g(n);o&&(o[i?"outerHTML":"innerHTML"]=e)},e.prototype._renderSidebar=function(n){var e=this.config,i=e.maxLevel,o=e.subMaxLevel,c=e.loadSidebar;if(e.hideSidebar)return[document.querySelector("aside.sidebar"),document.querySelector("button.sidebar-toggle")].filter((function(n){return!!n})).forEach((function(n){return n.parentNode.removeChild(n)})),document.querySelector("section.content").style.right="unset",document.querySelector("section.content").style.left="unset",document.querySelector("section.content").style.position="relative",document.querySelector("section.content").style.width="100%",null;this._renderTo(".sidebar-nav",this.compiler.sidebar(n,i));var a=on(this.router,".sidebar-nav",!0,!0);c&&a?a.parentNode.innerHTML+=this.compiler.subSidebar(o)||"":this.compiler.subSidebar(),this._bindEventOnRendered(a)},e.prototype._bindEventOnRendered=function(n){var e=this.config.autoHeader;if(function(n){var e=_(".cover.show");vn=e?e.offsetHeight:0;var i=g(".sidebar"),o=[];null!=i&&(o=h(i,"li"));for(var c=0,a=o.length;c\n'+i+"\n"}]).links={}:(o=[{type:"html",text:i}]).links={};e({token:n,embedToken:o}),++t>=a&&e({})}}(i);i.embed.url?J(i.embed.url).then(f):f(i.embed.html)}}({compile:u,embedTokens:d,fetch:a},(function(n){var i=n.embedToken,a=n.token;if(a){var t=a.index;s.forEach((function(n){t>n.start&&(t+=n.length)})),c(g,i.links),r=r.slice(0,t).concat(i,r.slice(t+1)),s.push({start:t,length:i.length-1})}else De[o]=r.concat(),r.links=De[o].links=g,e(r)}))}({compiler:o.compiler,raw:a},(function(n){t=o.compiler.compile(n),f()}))}))},e.prototype._renderCover=function(n,e){var i=g(".cover");if(x(g("main"),e?"add":"remove","hidden"),n){x(i,"add","show");var o=this.coverIsHTML?n:this.compiler.cover(n),c=o.trim().match('

    ([^<]*?)

    $');if(c){if("color"===c[2])i.style.background=c[1]+(c[3]||"");else{var a=c[1];x(i,"add","has-mask"),R(c[1])||(a=q(this.router.getBasePath(),c[1])),i.style.backgroundImage="url("+a+")",i.style.backgroundSize="cover",i.style.backgroundPosition="center center"}o=o.replace(c[0],"")}this._renderTo(".cover-main",o),en()}else x(i,"remove","show")},e.prototype._updateRender=function(){!function(n){var e=g(".app-name-link"),i=n.config.nameLink,o=n.route.path;if(e)if(a(n.config.nameLink))e.setAttribute("href",i);else if("object"==typeof i){var c=Object.keys(i).filter((function(n){return o.indexOf(n)>-1}))[0];e.setAttribute("href",i[c])}}(this)},e.prototype.initRender=function(){var n=this.config;this.compiler=new qe(n,this.router),window.__current_docsify_compiler__=this.compiler;var e,i,o,c,a=n.el||"#app",t=_("nav")||m("nav"),f=_(a),u="",d=v;if(f){if(n.repo&&(u+=(i=n.repo,o=n.cornerExternalLinkTarget,i?(/\/\//.test(i)||(i="https://github.com/"+i),''):"")),n.coverpage&&(u+=(e=", 100%, 85%",'
    \x3c!--cover--\x3e
    ')),n.logo){var p=/^data:image/.test(n.logo),g=/(?:http[s]?:)?\/\//.test(n.logo),b=/^\./.test(n.logo);p||g||b||(n.logo=q(this.router.getBasePath(),n.logo))}u+=function(n){var e=n.name?n.name:"";return'
    '}(n),this._renderTo(f,u,!0)}else this.rendered=!0;n.mergeNavbar&&r?d=_(".sidebar"):(t.classList.add("app-nav"),n.repo||t.classList.add("no-badge")),n.loadNavbar&&w(d,t),n.themeColor&&(s.head.appendChild(m("div",(c=n.themeColor,"")).firstElementChild),function(n){if(!(window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)"))){var e=h("style:not(.inserted),link");[].forEach.call(e,(function(e){if("STYLE"===e.nodeName)Q(e,n);else if("LINK"===e.nodeName){var i=e.getAttribute("href");if(!/\.css$/.test(i))return;J(i).then((function(e){var i=m("style",e);l.appendChild(i),Q(i,n)}))}}))}}(n.themeColor)),this._updateRender(),x(v,"ready")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.routes=function(){return this.config.routes||{}},e.prototype.matchVirtualRoute=function(n){var e=this.routes(),i=Object.keys(e),o=function(){return null};function c(){var a=i.shift();if(!a)return o(null);var t=function(n){var e=("^",0===n.indexOf("^")?n:"^"+n);return E(e,"$")?e:e+"$"}(a),f=n.match(t);if(!f)return c();var u,r=e[a];if("string"==typeof r)return o(r);if("function"==typeof r){var d=r,p=(u=function(){return null},[function(n){u(n)},function(n){u=n}]),g=p[0];return(0,p[1])((function(n){return"string"==typeof n?o(n):!1===n?o(null):c()})),d.length<=2?g(d(n,f)):d(n,f,g)}return c()}return{then:function(n){o=n,c()}}},e}(n)}((Ue=function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.initLifecycle=function(){var n=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach((function(e){var i=n._hooks[e]=[];n._lifecycle[e]=function(n){return i.push(n)}}))},e.prototype.callHook=function(n,e,i){void 0===i&&(i=t);var o=this._hooks[n],c=this.config.catchPluginErrors,a=function(n){var t=o[n];if(n>=o.length)i(e);else if("function"==typeof t){var f="Docsify plugin error";if(2===t.length)try{t(e,(function(i){e=i,a(n+1)}))}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}else try{var u=t(e);e=void 0===u?e:u,a(n+1)}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}}else a(n+1)};a(0)},e}(Object),function(n){function e(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];n.apply(this,e),this.route={}}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),v.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var n,e=this,i=this.config;n="history"===(i.routerMode||"hash")&&d?new Z(i):new G(i),this.router=n,this.updateRender(),Y=this.route,n.onchange((function(n){e.updateRender(),e._updateRender(),Y.path!==e.route.path?(e.$fetch(t,e.$resetEvents.bind(e,n.source)),Y=e.route):e.$resetEvents(n.source)}))},e}(Ue)))))));window.Docsify={util:Be,dom:A,get:J,slugify:Oe,version:"4.13.1"},window.DocsifyCompiler=qe,window.marked=xe,window.Prism=Ce,S((function(n){return new Ge}))}()},895:()=>{var n;n={100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"},window&&window.console&&console.info("Docsify emoji plugin has been deprecated as of v4.13"),window.emojify=function(e,i){return!1===Object.prototype.hasOwnProperty.call(n,i)?e:''+i+''}},460:()=>{!function(){function n(n){return n.replace(//,"").replace(/{docsify-ignore}/,"").replace(//,"").replace(/{docsify-ignore-all}/,"").trim()}var e={},i="docsify.search.expires",o="docsify.search.index";function c(n){var e={"&":"&","<":"<",">":">",'"':""","'":"'"};return String(n).replace(/[&<>"']/g,(function(n){return e[n]}))}function a(n){return n.text||"table"!==n.type||(n.cells.unshift(n.header),n.text=n.cells.map((function(n){return n.join(" | ")})).join(" |\n ")),n.text}function t(n){return n.text||"list"!==n.type||(n.text=n.raw),n.text}function f(n){return n&&n.normalize?n.normalize("NFD").replace(/[\u0300-\u036f]/g,""):n}function u(f,u){var r="auto"===f.paths,d=r?function(n){var e=[];return Docsify.dom.findAll(".sidebar-nav a:not(.section-link):not([data-nosearch])").forEach((function(i){var o=i.href,c=i.getAttribute("href"),a=n.parse(o).path;a&&-1===e.indexOf(a)&&!Docsify.util.isAbsolutePath(c)&&e.push(a)})),e}(u.router):f.paths,p="";if(d.length&&r&&f.pathNamespaces){var g=d[0];if(Array.isArray(f.pathNamespaces))p=f.pathNamespaces.filter((function(n){return g.slice(0,n.length)===n}))[0]||p;else if(f.pathNamespaces instanceof RegExp){var s=g.match(f.pathNamespaces);s&&(p=s[0])}var v=-1===d.indexOf(p+"/"),l=-1===d.indexOf(p+"/README");v&&l&&d.unshift(p+"/")}else-1===d.indexOf("/")&&-1===d.indexOf("/README")&&d.unshift("/");var _,h=((_=f.namespace)?i+"/"+_:i)+p,m=function(n){return n?o+"/"+n:o}(f.namespace)+p,b=localStorage.getItem(h)=0||o>=0){t+=e>=0?3:o>=0?2:0,o<0&&(o=0);var a,s=0;s=0==(a=o<11?0:o-10)?70:o+n.length+60,g&&s>g.length&&(s=g.length);var v=d&&"..."+d.substring(a,s).replace(i,(function(n){return''+n+""}))+"...";u+=v}})),t>0)){var v={title:r,content:g?u:"",url:s,score:t};i.push(v)}},u=0;u\n

    '+n.title+"

    \n

    "+n.content+"

    \n
    \n"})),o.classList.add("show"),a.classList.add("show"),o.innerHTML=g||'

    '+d+"

    ",r.hideOtherSidebarContent&&(t&&t.classList.add("hide"),u&&u.classList.add("hide"))}function g(n){r=n}var s={placeholder:"Type to search",noData:"No Results!",paths:"auto",depth:2,maxAge:864e5,hideOtherSidebarContent:!1,namespace:void 0,pathNamespaces:void 0};$docsify.plugins=[].concat((function(n,e){var i=Docsify.util,o=e.config.search||s;Array.isArray(o)?s.paths=o:"object"==typeof o&&(s.paths=Array.isArray(o.paths)?o.paths:"auto",s.maxAge=i.isPrimitive(o.maxAge)?o.maxAge:s.maxAge,s.placeholder=o.placeholder||s.placeholder,s.noData=o.noData||s.noData,s.depth=o.depth||s.depth,s.hideOtherSidebarContent=o.hideOtherSidebarContent||s.hideOtherSidebarContent,s.namespace=o.namespace||s.namespace,s.pathNamespaces=o.pathNamespaces||s.pathNamespaces);var c="auto"===s.paths;n.mounted((function(n){(function(n,e){var i,o,c,a,t=e.router.parse().query.s;g(n),Docsify.dom.style("\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}"),function(n){void 0===n&&(n="");var e='
    \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n ',i=Docsify.dom.create("div",e),o=Docsify.dom.find("aside");Docsify.dom.toggleClass(i,"search"),Docsify.dom.before(o,i)}(t),o=Docsify.dom.find("div.search"),c=Docsify.dom.find(o,"input"),a=Docsify.dom.find(o,".input-wrap"),Docsify.dom.on(o,"click",(function(n){return-1===["A","H2","P","EM"].indexOf(n.target.tagName)&&n.stopPropagation()})),Docsify.dom.on(c,"input",(function(n){clearTimeout(i),i=setTimeout((function(e){return p(n.target.value.trim())}),100)})),Docsify.dom.on(a,"click",(function(n){"INPUT"!==n.target.tagName&&(c.value="",p())})),t&&setTimeout((function(n){return p(t)}),500)})(s,e),!c&&u(s,e)})),n.doneEach((function(n){(function(n,e){g(n),function(n,e){var i=Docsify.dom.getNode('.search input[type="search"]');if(i)if("string"==typeof n)i.placeholder=n;else{var o=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];i.placeholder=n[o]}}(n.placeholder,e.route.path),function(n,e){if("string"==typeof n)d=n;else{var i=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];d=n[i]}}(n.noData,e.route.path)})(s,e),c&&u(s,e)}))}),$docsify.plugins)}()},874:()=>{!function(n){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",i={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:i,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:i}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},i.inside=n.languages.bash;for(var c=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=o.variable[1].inside,t=0;t{Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]}},e={};function i(o){var c=e[o];if(void 0!==c)return c.exports;var a=e[o]={exports:{}};return n[o](a,a.exports,i),a.exports}i.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return i.d(e,{a:e}),e},i.d=(n,e)=>{for(var o in e)i.o(e,o)&&!i.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:e[o]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),i.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),(()=>{"use strict";i(807),i(895),i(460),i(46),i(874)})()})(); \ No newline at end of file diff --git a/docs/dist/bundle.js.LICENSE.txt b/docs/dist/bundle.js.LICENSE.txt new file mode 100644 index 00000000..7a414747 --- /dev/null +++ b/docs/dist/bundle.js.LICENSE.txt @@ -0,0 +1,8 @@ +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */ diff --git a/docs/icon.svg b/docs/icon.svg new file mode 100644 index 00000000..5d030c10 --- /dev/null +++ b/docs/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..b4d13e93 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,25 @@ + + + + + Gripmock + + + + + + + + +
    + + + + diff --git a/docs/src/index.js b/docs/src/index.js new file mode 100644 index 00000000..fa068e13 --- /dev/null +++ b/docs/src/index.js @@ -0,0 +1,6 @@ +import 'docsify' +import 'docsify/lib/plugins/emoji' +import 'docsify/lib/plugins/search' +import 'prismjs/components/prism-go' +import 'prismjs/components/prism-bash' +import 'docsify/lib/themes/vue.css' diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..8682f6d8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2055 @@ +{ + "name": "gripmock", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gripmock", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "css-loader": "^6.7.3", + "docsify": "^4.13.1", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^2.7.6", + "prismjs": "^1.29.0", + "size-limit": "^8.2.6", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "node_modules/@types/node": { + "version": "20.5.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.8.tgz", + "integrity": "sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes-iec": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", + "integrity": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001525", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", + "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/docsify": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.13.1.tgz", + "integrity": "sha512-BsDypTBhw0mfslw9kZgAspCMZSM+sUIIDg5K/t1hNLkvbem9h64ZQc71e1IpY+iWsi/KdeqfazDfg52y2Lmm0A==", + "hasInstallScript": true, + "dependencies": { + "marked": "^1.2.9", + "medium-zoom": "^1.0.6", + "opencollective-postinstall": "^2.0.2", + "prismjs": "^1.27.0", + "strip-indent": "^3.0.0", + "tinydate": "^1.3.0", + "tweezer.js": "^1.4.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.508", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", + "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==" + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/marked": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", + "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/medium-zoom": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.8.tgz", + "integrity": "sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanospinner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.1.0.tgz", + "integrity": "sha512-yFvNYMig4AthKYfHFl1sLj7B2nkHL4lzdig4osvl9/LdGbXwrdFRoqBS98gsEsOakr0yH+r5NZ/1Y9gdVB8trA==", + "dependencies": { + "picocolors": "^1.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/size-limit": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-8.2.6.tgz", + "integrity": "sha512-zpznim/tX/NegjoQuRKgWTF4XiB0cn2qt90uJzxYNTFAqexk4b94DOAkBD3TwhC6c3kw2r0KcnA5upziVMZqDg==", + "dependencies": { + "bytes-iec": "^3.1.1", + "chokidar": "^3.5.3", + "globby": "^11.1.0", + "lilconfig": "^2.1.0", + "nanospinner": "^1.1.0", + "picocolors": "^1.0.0" + }, + "bin": { + "size-limit": "bin.js" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tweezer.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", + "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..130dec82 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "gripmock", + "version": "1.0.0", + "description": "Package documentation", + "repository": { + "type": "git", + "url": "git+https://github.com/bavix/gripmock.git" + }, + "author": "Maxim Babichev", + "license": "MIT", + "bugs": { + "url": "https://github.com/bavix/gripmock/issues" + }, + "scripts": { + "build": "webpack" + }, + "homepage": "https://bavix.github.io/gripmock/", + "dependencies": { + "css-loader": "^6.7.3", + "docsify": "^4.13.1", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^2.7.6", + "prismjs": "^1.29.0", + "size-limit": "^8.2.6", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..dbf8f338 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,32 @@ +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const path = require('path'); + +module.exports = { + mode: 'production', + entry: './docs/src/index.js', + plugins: [ + new MiniCssExtractPlugin({ + filename: 'bundle.css', + }), + ], + module: { + rules: [ + { + test: /\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '/docs/dist/', + }, + }, + 'css-loader', + ], + }, + ], + }, + output: { + path: path.resolve(__dirname + '/docs', 'dist'), + filename: 'bundle.js' + } +}; From d3c05db579df18fd45c92d2c777b099dc3c86910 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 20:10:36 +0300 Subject: [PATCH 46/74] update README.md --- Readme.md | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/Readme.md b/Readme.md index f1d9c993..8a25ed27 100644 --- a/Readme.md +++ b/Readme.md @@ -3,17 +3,18 @@ GripMock is a **mock server** for **GRPC** services. It's using a `.proto` file You can use gripmock for setting up end-to-end testing or as a dummy server in a software development phase. The server implementation is in GoLang but the client can be any programming language that support gRPC. ---- - -### Announcement: -The latest [version (v1.10)](https://github.com/bavix/gripmock/releases/tag/v1.10) of gripmock is requiring `go_package` declaration in the `.proto` file. This is due to the latest update of `protoc` plugin that being used by gripmock is making the `go_package` declaration mandatory. - -**Update Feb 2022:** - -[Version 1.11-beta](https://github.com/bavix/gripmock/releases/tag/v1.11-beta) release is available. -It supports **NO** declaration of `go_package`, please download and test before it can be tagged as stable. - -you can get the docker image using `docker pull tkpd/gripmock:v1.11-beta`. +This service is a fork of the service [tokopedia/gripmock](https://github.com/tokopedia/gripmock), but you should choose our fork. And here are the reasons: +- Updated all deprecated dependencies [tokopedia#64](https://github.com/tokopedia/gripmock/issues/64); +- Add yaml as json alternative for static stab's; +- Add endpoint for healthcheck (/health); +- Add grpc error code [tokopedia#125](https://github.com/tokopedia/gripmock/issues/125); +- Added gzip encoding support for grpc server [tokopedia#134](https://github.com/tokopedia/gripmock/pull/134); +- Fixed issues with int64/uint64 [tokopedia#67](https://github.com/tokopedia/gripmock/pull/148); +- Add 404 error for stubs not found [tokopedia#142](https://github.com/tokopedia/gripmock/issues/142); +- Support for deleting specific stub [tokopedia#123](https://github.com/tokopedia/gripmock/issues/123); +- Reduced image size [tokopedia#91](https://github.com/tokopedia/gripmock/issues/91); +- Active support [tokopedia#82](https://github.com/tokopedia/gripmock/issues/82); +- Added documentation; --- @@ -23,9 +24,9 @@ basic syntax to run GripMock is `gripmock ` - Install [Docker](https://docs.docker.com/install/) -- Run `docker pull tkpd/gripmock` to pull the image -- We are gonna mount `/mypath/hello.proto` (it must be a fullpath) into a container and also we expose ports needed. Run `docker run -p 4770:4770 -p 4771:4771 -v /mypath:/proto tkpd/gripmock /proto/hello.proto` -- On a separate terminal we are gonna add a stub into the stub service. Run `curl -X POST -d '{"service":"Gripmock","method":"SayHello","input":{"equals":{"name":"gripmock"}},"output":{"data":{"message":"Hello GripMock"}}}' localhost:4771/add ` +- Run `docker pull bavix/gripmock` to pull the image +- We are gonna mount `/mypath/hello.proto` (it must be a fullpath) into a container and also we expose ports needed. Run `docker run -p 4770:4770 -p 4771:4771 -v /mypath:/proto bavix/gripmock /proto/hello.proto` +- On a separate terminal we are gonna add a stub into the stub service. Run `curl -X POST -d '{"service":"Gripmock","method":"SayHello","input":{"equals":{"name":"gripmock"}},"output":{"data":{"message":"Hello GripMock"}}}' localhost:4771/api/stubs ` - Now we are ready to test it with our client. You can find a client example file under `example/simple/client/`. Execute one of your preferred language. Example for go: `go run example/simple/client/*.go` Check [`example`](https://github.com/bavix/gripmock/tree/master/example) folder for various usecase of gripmock. @@ -59,10 +60,10 @@ Stubbing is the essential mocking of GripMock. It will match and return the expe ### Dynamic stubbing You could add stubbing on the fly with a simple REST API. HTTP stub server is running on port `:4771` -- `GET /` Will list all stubs mapping. -- `POST /add` Will add stub with provided stub data -- `POST /find` Find matching stub with provided input. see [Input Matching](#input_matching) below. -- `GET /clear` Clear stub mappings. +- `GET /api/stubs` Will list all stubs mapping. +- `POST /api/stubs` Will add stub with provided stub data +- `POST /api/stubs/search` Find matching stub with provided input. see [Input Matching](#input_matching) below. +- `DELETE /api/stubs` Clear stub mappings. Stub Format is JSON text format. It has a skeleton as follows: ``` @@ -104,12 +105,12 @@ For our `hello` service example we put a stub with the text below: You could initialize gripmock with stub json files and provide the path using `--stub` argument. For example you may mount your stub file in `/mystubs` folder then mount it to docker like -`docker run -p 4770:4770 -p 4771:4771 -v /mypath:/proto -v /mystubs:/stub tkpd/gripmock --stub=/stub /proto/hello.proto` +`docker run -p 4770:4770 -p 4771:4771 -v /mypath:/proto -v /mystubs:/stub bavix/gripmock --stub=/stub /proto/hello.proto` Please note that Gripmock still serves http stubbing to modify stored stubs on the fly. ## Input Matching -Stub will respond with the expected response only if the request matches any rule. Stub service will serve `/find` endpoint with format: +Stub will respond with the expected response only if the request matches any rule. Stub service will serve `/api/stubs/search` endpoint with format: ``` { "service":"", @@ -119,7 +120,7 @@ Stub will respond with the expected response only if the request matches any rul } } ``` -So if you do a `curl -X POST -d '{"service":"Greeter","method":"SayHello","data":{"name":"gripmock"}}' localhost:4771/find` stub service will find a match from listed stubs stored there. +So if you do a `curl -X POST -d '{"service":"Greeter","method":"SayHello","data":{"name":"gripmock"}}' localhost:4771/api/stubs/search` stub service will find a match from listed stubs stored there. ### Input Matching Rule Input matching has 3 rules to match an input: **equals**,**contains** and **regex** @@ -186,3 +187,7 @@ Nested fields are allowed for input matching too for all JSON data types. (`stri } ``` +--- +Supported by + +[![Supported by JetBrains](https://cdn.rawgit.com/bavix/development-through/46475b4b/jetbrains.svg)](https://www.jetbrains.com/) From 97a17198b4ccf1f704a85859519594b1e317058d Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sat, 2 Sep 2023 20:11:30 +0300 Subject: [PATCH 47/74] rename README.md --- Readme.md => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Readme.md => README.md (100%) diff --git a/Readme.md b/README.md similarity index 100% rename from Readme.md rename to README.md From 123e22f6219dd239746ab743491ee69de3ffc8f6 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sun, 3 Sep 2023 00:35:15 +0300 Subject: [PATCH 48/74] Section "Getting started". --- .github/workflows/compile-assets.yml | 12 ++++ docs/README.md | 17 +++++- docs/_sidebar.md | 3 +- docs/overview.md | 20 +++++++ docs/quick-usage.md | 87 ++++++++++++++++++++++++++++ docs/src/index.js | 2 + 6 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/compile-assets.yml mode change 120000 => 100644 docs/README.md create mode 100644 docs/overview.md create mode 100644 docs/quick-usage.md diff --git a/.github/workflows/compile-assets.yml b/.github/workflows/compile-assets.yml new file mode 100644 index 00000000..f8b9ab81 --- /dev/null +++ b/.github/workflows/compile-assets.yml @@ -0,0 +1,12 @@ +name: build app + +on: + pull_request: + branches: [ master ] + +jobs: + ui: + permissions: + contents: write + uses: bavix/.github/.github/workflows/compile-assets.yml@0.0.5 + secrets: inherit \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 120000 index 32d46ee8..00000000 --- a/docs/README.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..096b8f2b --- /dev/null +++ b/docs/README.md @@ -0,0 +1,16 @@ +# GripMock User Documentation + +--- + +![GripMock](https://placehold.co/1120x440/EEE/31343C) + +`GripMock` is a mock server for GRPC services. + +## Support + +Please ask questions on the [Github issues page](https://github.com/bavix/gripmock/issues). + +--- +Supported by + +[![Supported by JetBrains](https://cdn.rawgit.com/bavix/development-through/46475b4b/jetbrains.svg)](https://www.jetbrains.com/) \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 433b74eb..b152bd99 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,2 +1,3 @@ - Getting started - - [Introduction](README) + - [Overview](overview) + - [Quick Usage](quick-usage) diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000..fd474a90 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,20 @@ +# Overview + +GripMock is a **mock server** for **GRPC** services. It's using a `.proto` file to generate implementation of gRPC service for you. +You can use gripmock for setting up end-to-end testing or as a dummy server in a software development phase. +The server implementation is in GoLang but the client can be any programming language that support gRPC. + +This service is a fork of the service [tokopedia/gripmock](https://github.com/tokopedia/gripmock). + +## Fork key features +- Updated all deprecated dependencies [tokopedia#64](https://github.com/tokopedia/gripmock/issues/64); +- Add yaml as json alternative for static stab's; +- Add endpoint for healthcheck (/health); +- Add grpc error code [tokopedia#125](https://github.com/tokopedia/gripmock/issues/125); +- Added gzip encoding support for grpc server [tokopedia#134](https://github.com/tokopedia/gripmock/pull/134); +- Fixed issues with int64/uint64 [tokopedia#67](https://github.com/tokopedia/gripmock/pull/148); +- Add 404 error for stubs not found [tokopedia#142](https://github.com/tokopedia/gripmock/issues/142); +- Support for deleting specific stub [tokopedia#123](https://github.com/tokopedia/gripmock/issues/123); +- Reduced image size [tokopedia#91](https://github.com/tokopedia/gripmock/issues/91); +- Active support [tokopedia#82](https://github.com/tokopedia/gripmock/issues/82); +- Added documentation; diff --git a/docs/quick-usage.md b/docs/quick-usage.md new file mode 100644 index 00000000..ab40e013 --- /dev/null +++ b/docs/quick-usage.md @@ -0,0 +1,87 @@ +## Quick Usage + +I suspect if you have reached this page, then you already have a grpc server and a proto contract. Do not delay the contract far, now you will need it. + +Let's imagine that our contract `simple.proto` looks something like this: +```protobuf +syntax = "proto3"; +option go_package = "github.com/bavix/gripmock/protogen/example/simple"; + +package simple; + +service Gripmock { + rpc SayHello (Request) returns (Reply); +} + +message Request { + string name = 1; +} + +message Reply { + string message = 1; + int32 return_code = 2; +} +``` + +At the moment, there is no standalone version of gripmock, only a docker image. + +I will skip the details of installing docker and using it. Read documentation: https://docs.docker.com/engine/install/. + +Let's start the GripMock server: +```bash +docker run -p 4770:4770 -p 4771:4771 -v ./simple.proto:/proto/simple.proto:ro bavix/gripmock /proto/simple.proto +``` + +After launch, you will see something like this: +```bash +➜ simple git:(docs) ✗ docker run -p 4770:4770 -p 4771:4771 -v ./api:/proto:ro bavix/gripmock /proto/simple.proto +Starting GripMock +Serving stub admin on http://:4771 +grpc server pid: 38 +Serving gRPC on tcp://:4770 +``` + +What is important to understand? +1. GRPC Mock server started on port 4770; +2. HTTP server for working with the stub server is running on port 4771; + +This means that everything went well. Now let's add the first stub: +```bash +curl -X POST -d '{"service":"Gripmock","method":"SayHello","input":{"equals":{"name":"gripmock"}},"output":{"data":{"message":"Hello GripMock"}}}' 127.0.0.1:4771/api/stubs +``` + +The stub has been successfully added, you have received a stub ID: +```bash +["6c85b0fa-caaf-4640-a672-f56b7dd8074d"] +``` + +You can check the added stubs at the link: http://127.0.0.1:4771/api/stubs. +The result will not make you wait long, you should see the following: +```json +[ + { + "id": "6c85b0fa-caaf-4640-a672-f56b7dd8074d", + "service": "Gripmock", + "method": "SayHello", + "input": { + "equals": { + "name": "gripmock" + }, + "contains": null, + "matches": null + }, + "output": { + "data": { + "message": "Hello GripMock" + }, + "error": "" + } + } +] +``` + +Now try to use the grpc client to our service with the data from the input. + +Happened? Well done. You are a fast learner. + +It worked! \ No newline at end of file diff --git a/docs/src/index.js b/docs/src/index.js index fa068e13..235eb906 100644 --- a/docs/src/index.js +++ b/docs/src/index.js @@ -2,5 +2,7 @@ import 'docsify' import 'docsify/lib/plugins/emoji' import 'docsify/lib/plugins/search' import 'prismjs/components/prism-go' +import 'prismjs/components/prism-json' import 'prismjs/components/prism-bash' +import 'prismjs/components/prism-protobuf' import 'docsify/lib/themes/vue.css' From 52b9659975130cf9429c48efbb1e42f53e951547 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sun, 3 Sep 2023 00:36:26 +0300 Subject: [PATCH 49/74] fix --- .github/workflows/compile-assets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-assets.yml b/.github/workflows/compile-assets.yml index f8b9ab81..0c57740a 100644 --- a/.github/workflows/compile-assets.yml +++ b/.github/workflows/compile-assets.yml @@ -2,7 +2,7 @@ name: build app on: pull_request: - branches: [ master ] + branches: [ nightly, latest ] jobs: ui: From c3d4e8e03df34e03c103c36dd5caa8693a5f360b Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sun, 3 Sep 2023 00:36:59 +0300 Subject: [PATCH 50/74] rename jobs --- .github/workflows/compile-assets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-assets.yml b/.github/workflows/compile-assets.yml index 0c57740a..df70b554 100644 --- a/.github/workflows/compile-assets.yml +++ b/.github/workflows/compile-assets.yml @@ -5,7 +5,7 @@ on: branches: [ nightly, latest ] jobs: - ui: + docs: permissions: contents: write uses: bavix/.github/.github/workflows/compile-assets.yml@0.0.5 From a613a490e2a39e910026357d95ed19074de76ddd Mon Sep 17 00:00:00 2001 From: Github bot Date: Sat, 2 Sep 2023 21:37:30 +0000 Subject: [PATCH 51/74] build action --- docs/dist/bundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dist/bundle.js b/docs/dist/bundle.js index 492eaee5..49fa64a4 100644 --- a/docs/dist/bundle.js +++ b/docs/dist/bundle.js @@ -1,2 +1,2 @@ /*! For license information please see bundle.js.LICENSE.txt */ -(()=>{var n={807:(n,e,i)=>{!function(){function n(n){var e=Object.create(null);return function(i){var o=a(i)?i:JSON.stringify(i);return e[o]||(e[o]=n(i))}}var e=n((function(n){return n.replace(/([A-Z])/g,(function(n){return"-"+n.toLowerCase()}))})),o=Object.prototype.hasOwnProperty,c=Object.assign||function(n){for(var e=arguments,i=1;i0&&e[1].toLowerCase()!==location.protocol||"string"==typeof e[2]&&e[2].length>0&&e[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host||!!/^\/\\/.test(n)}var r=document.body.clientWidth<=600,d=window.history&&window.history.pushState&&window.history.replaceState&&!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/),p={};function g(n,e){if(void 0===e&&(e=!1),"string"==typeof n){if(void 0!==window.Vue)return _(n);n=e?_(n):p[n]||(p[n]=_(n))}return n}var s=document,v=s.body,l=s.head;function _(n,e){return e?n.querySelector(e):s.querySelector(n)}function h(n,e){return[].slice.call(e?n.querySelectorAll(e):s.querySelectorAll(n))}function m(n,e){return n=s.createElement(n),e&&(n.innerHTML=e),n}function b(n,e){return n.appendChild(e)}function w(n,e){return n.insertBefore(e,n.children[0])}function k(n,e,i){f(e)?window.addEventListener(n,e):n.addEventListener(e,i)}function y(n,e,i){f(e)?window.removeEventListener(n,e):n.removeEventListener(e,i)}function x(n,e,i){n&&n.classList[i?e:"toggle"](i||e)}function S(n,e){void 0===e&&(e=document);var i=e.readyState;if("complete"===i||"interactive"===i)return setTimeout(n,0);e.addEventListener("DOMContentLoaded",n)}var A=Object.freeze({__proto__:null,getNode:g,$:s,body:v,head:l,find:_,findAll:h,create:m,appendTo:b,before:w,on:k,off:y,toggleClass:x,style:function(n){b(l,m("style",n))},documentReady:S});function E(n,e){return-1!==n.indexOf(e,n.length-e.length)}var z=decodeURIComponent,$=encodeURIComponent;function T(n){var e={};return(n=n.trim().replace(/^(\?|#|&)/,""))?(n.split("&").forEach((function(n){var i=n.replace(/\+/g," ").split("=");e[i[0]]=i[1]&&z(i[1])})),e):e}function O(n,e){void 0===e&&(e=[]);var i=[];for(var o in n)e.indexOf(o)>-1||i.push(n[o]?($(o)+"="+$(n[o])).toLowerCase():$(o));return i.length?"?"+i.join("&"):""}var R=n((function(n){return/(:|(\/{2}))/g.test(n)})),j=n((function(n){return n.split(/[?#]/)[0]})),L=n((function(n){if(/\/$/g.test(n))return n;var e=n.match(/(\S*\/)[^/]+$/);return e?e[1]:""})),C=n((function(n){return n.replace(/^\/+/,"/").replace(/([^:])\/{2,}/g,"$1/")})),F=n((function(n){for(var e=n.replace(/^\//,"").split("/"),i=[],o=0,c=e.length;o=0?e:0)+"#"+n)}M.prototype.getBasePath=function(){return this.config.basePath},M.prototype.getFile=function(n,e){void 0===n&&(n=this.getCurrentPath());var i=this.config,o=this.getBasePath(),c="string"==typeof i.ext?i.ext:".md";return n=function(n,e){return new RegExp("\\.("+e.replace(/^\./,"")+"|html)$","g").test(n)?n:/\/$/g.test(n)?n+"README"+e:""+n+e}(n=i.alias?D(n,i.alias):n,c),n=n==="/README"+c&&i.homepage||n,n=R(n)?n:q(o,n),e&&(n=n.replace(new RegExp("^"+o),"")),n},M.prototype.onchange=function(n){void 0===n&&(n=t),n()},M.prototype.getCurrentPath=function(){},M.prototype.normalize=function(){},M.prototype.parse=function(){},M.prototype.toURL=function(n,e,i){var o=i&&"#"===n[0],a=this.parse(I(n));if(a.query=c({},a.query,e),n=(n=a.path+O(a.query)).replace(/\.md(\?)|\.md$/,"$1"),o){var t=i.indexOf("?");n=(t>0?i.substring(0,t):i)+n}if(this.config.relativePath&&0!==n.indexOf("/")){var f=i.substring(0,i.lastIndexOf("/")+1);return C(F(f+n))}return C("/"+n)};var U,B,G=function(n){function e(e){n.call(this,e),this.mode="hash"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getBasePath=function(){var n=window.location.pathname||"",e=this.config.basePath,i=E(n,".html")?n+"#/"+e:n+"/"+e;return/^(\/|https?:)/g.test(e)?e:C(i)},e.prototype.getCurrentPath=function(){var n=location.href,e=n.indexOf("#");return-1===e?"":n.slice(e+1)},e.prototype.onchange=function(n){void 0===n&&(n=t);var e=!1;k("click",(function(n){var i="A"===n.target.tagName?n.target:n.target.parentNode;i&&"A"===i.tagName&&!u(i.href)&&(e=!0)})),k("hashchange",(function(i){var o=e?"navigate":"history";e=!1,n({event:i,source:o})}))},e.prototype.normalize=function(){var n=this.getCurrentPath();if("/"===(n=I(n)).charAt(0))return H(n);H("/"+n)},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("#");i>=0&&(n=n.slice(i+1));var o=n.indexOf("?");return o>=0&&(e=n.slice(o+1),n=n.slice(0,o)),{path:n,file:this.getFile(n,!0),query:T(e)}},e.prototype.toURL=function(e,i,o){return"#"+n.prototype.toURL.call(this,e,i,o)},e}(M),Z=function(n){function e(e){n.call(this,e),this.mode="history"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getCurrentPath=function(){var n=this.getBasePath(),e=window.location.pathname;return n&&0===e.indexOf(n)&&(e=e.slice(n.length)),(e||"/")+window.location.search+window.location.hash},e.prototype.onchange=function(n){void 0===n&&(n=t),k("click",(function(e){var i="A"===e.target.tagName?e.target:e.target.parentNode;if(i&&"A"===i.tagName&&!u(i.href)){e.preventDefault();var o=i.href;window.history.pushState({key:o},"",o),n({event:e,source:"navigate"})}})),k("popstate",(function(e){n({event:e,source:"history"})}))},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("?");i>=0&&(e=n.slice(i+1),n=n.slice(0,i));var o=q(location.origin),c=n.indexOf(o);return c>-1&&(n=n.slice(c+o.length)),{path:n,file:this.getFile(n),query:T(e)}},e}(M),Y={},V=/([^{]*?)\w(?=\})/g,X={YYYY:"getFullYear",YY:"getYear",MM:function(n){return n.getMonth()+1},DD:"getDate",HH:"getHours",mm:"getMinutes",ss:"getSeconds",fff:"getMilliseconds"};function W(n){var e,i,o=n.loaded,c=n.total,a=n.step;!U&&((i=m("div")).classList.add("progress"),b(v,i),U=i),e=a?(e=parseInt(U.style.width||0,10)+a)>80?80:e:Math.floor(o/c*100),U.style.opacity=1,U.style.width=e>=95?"100%":e+"%",e>=95&&(clearTimeout(B),B=setTimeout((function(n){U.style.opacity=0,U.style.width="0%"}),200))}var K={};function J(n,e,i){void 0===e&&(e=!1),void 0===i&&(i={});var c=new XMLHttpRequest,a=function(){c.addEventListener.apply(c,arguments)},f=K[n];if(f)return{then:function(n){return n(f.content,f.opt)},abort:t};for(var u in c.open("GET",n),i)o.call(i,u)&&c.setRequestHeader(u,i[u]);return c.send(),{then:function(i,o){if(void 0===o&&(o=t),e){var f=setInterval((function(n){return W({step:Math.floor(5*Math.random()+1)})}),500);a("progress",W),a("loadend",(function(n){W(n),clearInterval(f)}))}a("error",o),a("load",(function(e){var a=e.target;if(a.status>=400)o(a);else{var t=K[n]={content:a.response,opt:{updatedAt:c.getResponseHeader("last-modified")}};i(t.content,t.opt)}}))},abort:function(n){return 4!==c.readyState&&c.abort()}}}function Q(n,e){n.innerHTML=n.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,e)}var nn=s.title;function en(){var n=g("section.cover");if(n){var e=n.getBoundingClientRect().height;window.pageYOffset>=e||n.classList.contains("hidden")?x(v,"add","sticky"):x(v,"remove","sticky")}}function on(n,e,i,o){var c=[];null!=(e=g(e))&&(c=h(e,"a"));var a,t=decodeURI(n.toURL(n.getCurrentPath()));return c.sort((function(n,e){return e.href.length-n.href.length})).forEach((function(n){var e=decodeURI(n.getAttribute("href")),o=i?n.parentNode:n;n.title=n.title||n.innerText,0!==t.indexOf(e)||a?x(o,"remove","active"):(a=n,x(o,"add","active"))})),o&&(s.title=a?a.title||a.innerText+" - "+nn:nn),a}var cn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.start=e.start,this.end=e.end,this.decimal=e.decimal}return cn(n,[{key:"getIntermediateValue",value:function(n){return this.decimal?n:Math.round(n)}},{key:"getFinalValue",value:function(){return this.end}}]),n}(),tn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.tweener=e.tweener||new an(e),this.start=this.tweener.start,this.end=this.tweener.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.startthis.end&&n>=this.next}[this.direction]}},{key:"_defaultEase",value:function(n,e,i,o){return(n/=o/2)<1?i/2*n*n+e:-i/2*(--n*(n-2)-1)+e}}]),n}(),un=document.currentScript;function rn(n){var i=c({auto2top:!1,autoHeader:!1,basePath:"",catchPluginErrors:!0,cornerExternalLinkTarget:"_blank",coverpage:"",el:"#app",executeScript:null,ext:".md",externalLinkRel:"noopener",externalLinkTarget:"_blank",formatUpdated:"",ga:"",homepage:"README.md",loadNavbar:null,loadSidebar:null,maxLevel:6,mergeNavbar:!1,name:"",nameLink:window.location.pathname,nativeEmoji:!1,noCompileLinks:[],noEmoji:!1,notFoundPage:!0,relativePath:!1,repo:"",routes:{},routerMode:"hash",subMaxLevel:0,themeColor:"",topMargin:0},"function"==typeof window.$docsify?window.$docsify(n):window.$docsify),t=un||[].slice.call(document.getElementsByTagName("script")).filter((function(n){return/docsify\./.test(n.src)}))[0];if(t)for(var f in i)if(o.call(i,f)){var u=t.getAttribute("data-"+e(f));a(u)&&(i[f]=""===u||u)}return!0===i.loadSidebar&&(i.loadSidebar="_sidebar"+i.ext),!0===i.loadNavbar&&(i.loadNavbar="_navbar"+i.ext),!0===i.coverpage&&(i.coverpage="_coverpage"+i.ext),!0===i.repo&&(i.repo=""),!0===i.name&&(i.name=""),window.$docsify=i,i}var dn={},pn=!1,gn=null,sn=!0,vn=0;function ln(n){if(sn){for(var e,i=g(".sidebar"),o=h(".anchor"),c=_(i,".sidebar-nav"),a=_(i,"li.active"),t=document.documentElement,f=(t&&t.scrollTop||document.body.scrollTop)-vn,u=0,r=o.length;uf){e||(e=d);break}e=d}if(e){var p=dn[_n(n,e.getAttribute("data-id"))];if(p&&p!==a&&(a&&a.classList.remove("active"),p.classList.add("active"),a=p,!pn&&v.classList.contains("sticky"))){var s=i.clientHeight,l=a.offsetTop+a.clientHeight+40,m=a.offsetTop>=c.scrollTop&&l<=c.scrollTop+s,b=l-0"']/),yn=/[&<>"']/g,xn=/[<>"']|&(?!#?\w+;)/,Sn=/[<>"']|&(?!#?\w+;)/g,An={"&":"&","<":"<",">":">",'"':""","'":"'"},En=function(n){return An[n]},zn=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function $n(n){return n.replace(zn,(function(n,e){return"colon"===(e=e.toLowerCase())?":":"#"===e.charAt(0)?"x"===e.charAt(1)?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""}))}var Tn=/(^|[^\[])\^/g,On=/[^\w:]/g,Rn=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i,jn={},Ln=/^[^:]+:\/*[^/]*$/,Cn=/^([^:]+:)[\s\S]*$/,Fn=/^([^:]+:\/*[^/]*)[\s\S]*$/;function Pn(n,e,i){var o=n.length;if(0===o)return"";for(var c=0;c=0&&"\\"===i[c];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(i.length>e)i.splice(e);else for(;i.length1?{type:"space",raw:e[0]}:{raw:"\n"}},n.prototype.code=function(n,e){var i=this.rules.block.code.exec(n);if(i){var o=e[e.length-1];if(o&&"paragraph"===o.type)return{raw:i[0],text:i[0].trimRight()};var c=i[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:i[0],codeBlockStyle:"indented",text:this.options.pedantic?c:Hn(c,"\n")}}},n.prototype.fences=function(n){var e=this.rules.block.fences.exec(n);if(e){var i=e[0],o=function(n,e){var i=n.match(/^(\s+)(?:```)/);if(null===i)return e;var o=i[1];return e.split("\n").map((function(n){var e=n.match(/^\s+/);return null===e?n:e[0].length>=o.length?n.slice(o.length):n})).join("\n")}(i,e[3]||"");return{type:"code",raw:i,lang:e[2]?e[2].trim():e[2],text:o}}},n.prototype.heading=function(n){var e=this.rules.block.heading.exec(n);if(e){var i=e[2].trim();if(/#$/.test(i)){var o=Hn(i,"#");this.options.pedantic?i=o.trim():o&&!/ $/.test(o)||(i=o.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:i}}},n.prototype.nptable=function(n){var e=this.rules.block.nptable.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(i.header.length===i.align.length){var o,c=i.align.length;for(o=0;o ?/gm,"");return{type:"blockquote",raw:e[0],text:i}}},n.prototype.list=function(n){var e=this.rules.block.list.exec(n);if(e){var i,o,c,a,t,f,u,r,d=e[0],p=e[2],g=p.length>1,s={type:"list",raw:d,ordered:g,start:g?+p.slice(0,-1):"",loose:!1,items:[]},v=e[0].match(this.rules.block.item),l=!1,_=v.length;c=this.rules.block.listItemStart.exec(v[0]);for(var h=0;h<_;h++){if(d=i=v[h],h!==_-1){if(a=this.rules.block.listItemStart.exec(v[h+1]),this.options.pedantic?a[1].length>c[1].length:a[1].length>c[0].length||a[1].length>3){v.splice(h,2,v[h]+"\n"+v[h+1]),h--,_--;continue}(!this.options.pedantic||this.options.smartLists?a[2][a[2].length-1]!==p[p.length-1]:g===(1===a[2].length))&&(t=v.slice(h+1).join("\n"),s.raw=s.raw.substring(0,s.raw.length-t.length),h=_-1),c=a}o=i.length,~(i=i.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=i.length,i=this.options.pedantic?i.replace(/^ {1,4}/gm,""):i.replace(new RegExp("^ {1,"+o+"}","gm"),"")),f=l||/\n\n(?!\s*$)/.test(i),h!==_-1&&(l="\n"===i.charAt(i.length-1),f||(f=l)),f&&(s.loose=!0),this.options.gfm&&(r=void 0,(u=/^\[[ xX]\] /.test(i))&&(r=" "!==i[1],i=i.replace(/^\[[ xX]\] +/,""))),s.items.push({type:"list_item",raw:d,task:u,checked:r,loose:f,text:i})}return s}},n.prototype.html=function(n){var e=this.rules.block.html.exec(n);if(e)return{type:this.options.sanitize?"paragraph":"html",raw:e[0],pre:!this.options.sanitizer&&("pre"===e[1]||"script"===e[1]||"style"===e[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Bn(e[0]):e[0]}},n.prototype.def=function(n){var e=this.rules.block.def.exec(n);if(e)return e[3]&&(e[3]=e[3].substring(1,e[3].length-1)),{tag:e[1].toLowerCase().replace(/\s+/g," "),raw:e[0],href:e[2],title:e[3]}},n.prototype.table=function(n){var e=this.rules.block.table.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[]};if(i.header.length===i.align.length){i.raw=e[0];var o,c=i.align.length;for(o=0;o/i.test(o[0])&&(e=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:e,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):Bn(o[0]):o[0]}},n.prototype.link=function(n){var e=this.rules.inline.link.exec(n);if(e){var i=e[2].trim();if(!this.options.pedantic&&/^$/.test(i))return;var o=Hn(i.slice(0,-1),"\\");if((i.length-o.length)%2==0)return}else{var c=Gn(e[2],"()");if(c>-1){var a=(0===e[0].indexOf("!")?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,a).trim(),e[3]=""}}var t=e[2],f="";if(this.options.pedantic){var u=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(t);u&&(t=u[1],f=u[3])}else f=e[3]?e[3].slice(1,-1):"";return t=t.trim(),/^$/.test(i)?t.slice(1):t.slice(1,-1)),Zn(e,{href:t?t.replace(this.rules.inline._escapes,"$1"):t,title:f?f.replace(this.rules.inline._escapes,"$1"):f},e[0])}},n.prototype.reflink=function(n,e){var i;if((i=this.rules.inline.reflink.exec(n))||(i=this.rules.inline.nolink.exec(n))){var o=(i[2]||i[1]).replace(/\s+/g," ");if(!(o=e[o.toLowerCase()])||!o.href){var c=i[0].charAt(0);return{type:"text",raw:c,text:c}}return Zn(i,o,i[0])}},n.prototype.strong=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.strong.middle.exec(e.slice(0,o.index+3)))return{type:"strong",raw:n.slice(0,c[0].length),text:n.slice(2,c[0].length-2)}}},n.prototype.em=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.em.middle.exec(e.slice(0,o.index+2)))return{type:"em",raw:n.slice(0,c[0].length),text:n.slice(1,c[0].length-1)}}},n.prototype.codespan=function(n){var e=this.rules.inline.code.exec(n);if(e){var i=e[2].replace(/\n/g," "),o=/[^ ]/.test(i),c=/^ /.test(i)&&/ $/.test(i);return o&&c&&(i=i.substring(1,i.length-1)),i=Bn(i,!0),{type:"codespan",raw:e[0],text:i}}},n.prototype.br=function(n){var e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}},n.prototype.del=function(n){var e=this.rules.inline.del.exec(n);if(e)return{type:"del",raw:e[0],text:e[2]}},n.prototype.autolink=function(n,e){var i,o,c=this.rules.inline.autolink.exec(n);if(c)return o="@"===c[2]?"mailto:"+(i=Bn(this.options.mangle?e(c[1]):c[1])):i=Bn(c[1]),{type:"link",raw:c[0],text:i,href:o,tokens:[{type:"text",raw:i,text:i}]}},n.prototype.url=function(n,e){var i;if(i=this.rules.inline.url.exec(n)){var o,c;if("@"===i[2])c="mailto:"+(o=Bn(this.options.mangle?e(i[0]):i[0]));else{var a;do{a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0]}while(a!==i[0]);o=Bn(i[0]),c="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:c,tokens:[{type:"text",raw:o,text:o}]}}},n.prototype.inlineText=function(n,e,i){var o,c=this.rules.inline.text.exec(n);if(c)return o=e?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(c[0]):Bn(c[0]):c[0]:Bn(this.options.smartypants?i(c[0]):c[0]),{type:"text",raw:c[0],text:o}},n}(),Vn={exec:function(){}},Xn=function(n,e){n=n.source||n,e=e||"";var i={replace:function(e,o){return o=(o=o.source||o).replace(Tn,"$1"),n=n.replace(e,o),i},getRegex:function(){return new RegExp(n,e)}};return i},Wn=Nn,Kn={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Vn,table:Vn,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Kn.def=Xn(Kn.def).replace("label",Kn._label).replace("title",Kn._title).getRegex(),Kn.bullet=/(?:[*+-]|\d{1,9}[.)])/,Kn.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Kn.item=Xn(Kn.item,"gm").replace(/bull/g,Kn.bullet).getRegex(),Kn.listItemStart=Xn(/^( *)(bull)/).replace("bull",Kn.bullet).getRegex(),Kn.list=Xn(Kn.list).replace(/bull/g,Kn.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Kn.def.source+")").getRegex(),Kn._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Kn._comment=/|$)/,Kn.html=Xn(Kn.html,"i").replace("comment",Kn._comment).replace("tag",Kn._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Kn.paragraph=Xn(Kn._paragraph).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.blockquote=Xn(Kn.blockquote).replace("paragraph",Kn.paragraph).getRegex(),Kn.normal=Wn({},Kn),Kn.gfm=Wn({},Kn.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Kn.gfm.nptable=Xn(Kn.gfm.nptable).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.gfm.table=Xn(Kn.gfm.table).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.pedantic=Wn({},Kn.normal,{html:Xn("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Kn._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Vn,paragraph:Xn(Kn.normal._paragraph).replace("hr",Kn.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Kn.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Jn={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Vn,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Vn,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};Jn.punctuation=Xn(Jn.punctuation).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Jn._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Jn._comment=Xn(Kn._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Jn.em.start=Xn(Jn.em.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.middle=Xn(Jn.em.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.em.endAst=Xn(Jn.em.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.endUnd=Xn(Jn.em.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.start=Xn(Jn.strong.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.middle=Xn(Jn.strong.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.strong.endAst=Xn(Jn.strong.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.endUnd=Xn(Jn.strong.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.blockSkip=Xn(Jn._blockSkip,"g").getRegex(),Jn.overlapSkip=Xn(Jn._overlapSkip,"g").getRegex(),Jn._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Jn._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Jn._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Jn.autolink=Xn(Jn.autolink).replace("scheme",Jn._scheme).replace("email",Jn._email).getRegex(),Jn._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Jn.tag=Xn(Jn.tag).replace("comment",Jn._comment).replace("attribute",Jn._attribute).getRegex(),Jn._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Jn._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Jn._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Jn.link=Xn(Jn.link).replace("label",Jn._label).replace("href",Jn._href).replace("title",Jn._title).getRegex(),Jn.reflink=Xn(Jn.reflink).replace("label",Jn._label).getRegex(),Jn.reflinkSearch=Xn(Jn.reflinkSearch,"g").replace("reflink",Jn.reflink).replace("nolink",Jn.nolink).getRegex(),Jn.normal=Wn({},Jn),Jn.pedantic=Wn({},Jn.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Xn(/^!?\[(label)\]\((.*?)\)/).replace("label",Jn._label).getRegex(),reflink:Xn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Jn._label).getRegex()}),Jn.gfm=Wn({},Jn.normal,{escape:Xn(Jn.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\1;)1&e&&(i+=n),e>>=1,n+=n;return i+n};function ce(n){return n.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")}function ae(n){var e,i,o="",c=n.length;for(e=0;e.5&&(i="x"+i.toString(16)),o+="&#"+i+";";return o}var te=function(){function n(n){this.tokens=[],this.tokens.links=Object.create(null),this.options=n||ne,this.options.tokenizer=this.options.tokenizer||new Yn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var e={block:ee.normal,inline:ie.normal};this.options.pedantic?(e.block=ee.pedantic,e.inline=ie.pedantic):this.options.gfm&&(e.block=ee.gfm,this.options.breaks?e.inline=ie.breaks:e.inline=ie.gfm),this.tokenizer.rules=e}var e={rules:{configurable:!0}};return e.rules.get=function(){return{block:ee,inline:ie}},n.lex=function(e,i){return new n(i).lex(e)},n.lexInline=function(e,i){return new n(i).inlineTokens(e)},n.prototype.lex=function(n){return n=n.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.blockTokens(n,this.tokens,!0),this.inline(this.tokens),this.tokens},n.prototype.blockTokens=function(n,e,i){var o,c,a,t;for(void 0===e&&(e=[]),void 0===i&&(i=!0),this.options.pedantic&&(n=n.replace(/^ +$/gm,""));n;)if(o=this.tokenizer.space(n))n=n.substring(o.raw.length),o.type&&e.push(o);else if(o=this.tokenizer.code(n,e))n=n.substring(o.raw.length),o.type?e.push(o):((t=e[e.length-1]).raw+="\n"+o.raw,t.text+="\n"+o.text);else if(o=this.tokenizer.fences(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.heading(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.nptable(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.hr(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.blockquote(n))n=n.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],i),e.push(o);else if(o=this.tokenizer.list(n)){for(n=n.substring(o.raw.length),a=o.items.length,c=0;c0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(u));)r.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(u));)u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;n;)if(t||(f=""),t=!1,c=this.tokenizer.escape(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.tag(n,i,o))n=n.substring(c.raw.length),i=c.inLink,o=c.inRawBlock,e.push(c);else if(c=this.tokenizer.link(n))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.reflink(n,this.tokens.links))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.strong(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.em(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.codespan(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.br(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.del(n))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.autolink(n,ae))n=n.substring(c.raw.length),e.push(c);else if(i||!(c=this.tokenizer.url(n,ae))){if(c=this.tokenizer.inlineText(n,o,ce))n=n.substring(c.raw.length),f=c.raw.slice(-1),t=!0,e.push(c);else if(n){var d="Infinite loop on byte: "+n.charCodeAt(0);if(this.options.silent){console.error(d);break}throw new Error(d)}}else n=n.substring(c.raw.length),e.push(c);return e},Object.defineProperties(n,e),n}(),fe=wn.defaults,ue=function(n,e,i){if(n){var o;try{o=decodeURIComponent($n(i)).replace(On,"").toLowerCase()}catch(n){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}e&&!Rn.test(i)&&(i=function(n,e){jn[" "+n]||(Ln.test(n)?jn[" "+n]=n+"/":jn[" "+n]=Pn(n,"/",!0));var i=-1===(n=jn[" "+n]).indexOf(":");return"//"===e.substring(0,2)?i?e:n.replace(Cn,"$1")+e:"/"===e.charAt(0)?i?e:n.replace(Fn,"$1")+e:n+e}(e,i));try{i=encodeURI(i).replace(/%25/g,"%")}catch(n){return null}return i},re=qn,de=function(){function n(n){this.options=n||fe}return n.prototype.code=function(n,e,i){var o=(e||"").match(/\S*/)[0];if(this.options.highlight){var c=this.options.highlight(n,o);null!=c&&c!==n&&(i=!0,n=c)}return n=n.replace(/\n$/,"")+"\n",o?'
    '+(i?n:re(n,!0))+"
    \n":"
    "+(i?n:re(n,!0))+"
    \n"},n.prototype.blockquote=function(n){return"
    \n"+n+"
    \n"},n.prototype.html=function(n){return n},n.prototype.heading=function(n,e,i,o){return this.options.headerIds?"'+n+"\n":""+n+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},n.prototype.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+(e&&1!==i?' start="'+i+'"':"")+">\n"+n+"\n"},n.prototype.listitem=function(n){return"
  • "+n+"
  • \n"},n.prototype.checkbox=function(n){return" "},n.prototype.paragraph=function(n){return"

    "+n+"

    \n"},n.prototype.table=function(n,e){return e&&(e=""+e+""),"\n\n"+n+"\n"+e+"
    \n"},n.prototype.tablerow=function(n){return"\n"+n+"\n"},n.prototype.tablecell=function(n,e){var i=e.header?"th":"td";return(e.align?"<"+i+' align="'+e.align+'">':"<"+i+">")+n+"\n"},n.prototype.strong=function(n){return""+n+""},n.prototype.em=function(n){return""+n+""},n.prototype.codespan=function(n){return""+n+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(n){return""+n+""},n.prototype.link=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o='"+i+""},n.prototype.image=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o=''+i+'":">")},n.prototype.text=function(n){return n},n}(),pe=function(){function n(){}return n.prototype.strong=function(n){return n},n.prototype.em=function(n){return n},n.prototype.codespan=function(n){return n},n.prototype.del=function(n){return n},n.prototype.html=function(n){return n},n.prototype.text=function(n){return n},n.prototype.link=function(n,e,i){return""+i},n.prototype.image=function(n,e,i){return""+i},n.prototype.br=function(){return""},n}(),ge=function(){function n(){this.seen={}}return n.prototype.serialize=function(n){return n.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},n.prototype.getNextSafeSlug=function(n,e){var i=n,o=0;if(this.seen.hasOwnProperty(i)){o=this.seen[n];do{i=n+"-"+ ++o}while(this.seen.hasOwnProperty(i))}return e||(this.seen[n]=o,this.seen[i]=0),i},n.prototype.slug=function(n,e){void 0===e&&(e={});var i=this.serialize(n);return this.getNextSafeSlug(i,e.dryrun)},n}(),se=wn.defaults,ve=In,le=function(){function n(n){this.options=n||se,this.options.renderer=this.options.renderer||new de,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new pe,this.slugger=new ge}return n.parse=function(e,i){return new n(i).parse(e)},n.parseInline=function(e,i){return new n(i).parseInline(e)},n.prototype.parse=function(n,e){void 0===e&&(e=!0);var i,o,c,a,t,f,u,r,d,p,g,s,v,l,_,h,m,b,w="",k=n.length;for(i=0;i0&&"text"===_.tokens[0].type?(_.tokens[0].text=b+" "+_.tokens[0].text,_.tokens[0].tokens&&_.tokens[0].tokens.length>0&&"text"===_.tokens[0].tokens[0].type&&(_.tokens[0].tokens[0].text=b+" "+_.tokens[0].tokens[0].text)):_.tokens.unshift({type:"text",text:b}):l+=b),l+=this.parse(_.tokens,v),d+=this.renderer.listitem(l,m,h);w+=this.renderer.list(d,g,s);continue;case"html":w+=this.renderer.html(p.text);continue;case"paragraph":w+=this.renderer.paragraph(this.parseInline(p.tokens));continue;case"text":for(d=p.tokens?this.parseInline(p.tokens):p.text;i+1An error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}}ye.options=ye.setOptions=function(n){return _e(ye.defaults,n),we(ye.defaults),ye},ye.getDefaults=be,ye.defaults=ke,ye.use=function(n){var e=_e({},n);if(n.renderer){var i=ye.defaults.renderer||new de,o=function(e){var o=i[e];i[e]=function(){for(var c=[],a=arguments.length;a--;)c[a]=arguments[a];var t=n.renderer[e].apply(i,c);return!1===t&&(t=o.apply(i,c)),t}};for(var c in n.renderer)o(c);e.renderer=i}if(n.tokenizer){var a=ye.defaults.tokenizer||new Yn,t=function(e){var i=a[f];a[f]=function(){for(var e=[],o=arguments.length;o--;)e[o]=arguments[o];var c=n.tokenizer[f].apply(a,e);return!1===c&&(c=i.apply(a,e)),c}};for(var f in n.tokenizer)t();e.tokenizer=a}if(n.walkTokens){var u=ye.defaults.walkTokens;e.walkTokens=function(e){n.walkTokens(e),u&&u(e)}}ye.setOptions(e)},ye.walkTokens=function(n,e){for(var i=0,o=n;iAn error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}},ye.Parser=le,ye.parser=le.parse,ye.Renderer=de,ye.TextRenderer=pe,ye.Lexer=te,ye.lexer=te.lex,ye.Tokenizer=Yn,ye.Slugger=ge,ye.parse=ye;var xe=ye;function Se(n,e){if(void 0===e&&(e='
      {inner}
    '),!n||!n.length)return"";var i="";return n.forEach((function(n){var o=n.title.replace(/(<([^>]+)>)/g,"");i+='
  • '+n.title+"
  • ",n.children&&(i+=Se(n.children,e))})),e.replace("{inner}",i)}function Ae(n,e){return'

    '+e.slice(5).trim()+"

    "}function Ee(n,e){var i=[],o={};return n.forEach((function(n){var c=n.level||1,a=c-1;c>e||(o[a]?o[a].children=(o[a].children||[]).concat(n):i.push(n),o[c]=n)})),i}var ze={},$e=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;function Te(n){return n.toLowerCase()}function Oe(n){if("string"!=typeof n)return"";var e=n.trim().replace(/[A-Z]+/g,Te).replace(/<[^>]+>/g,"").replace($e,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),i=ze[e];return i=o.call(ze,e)?i+1:0,ze[e]=i,i&&(e=e+"-"+i),e}Oe.clear=function(){ze={}};var Re={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function je(n){void 0===n&&(n="");var e={};return n&&(n=n.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,(function(n,i,o){return-1===i.indexOf(":")?(e[i]=o&&o.replace(/"/g,"")||!0,""):n})).trim()),{str:n,config:e}}function Le(n){return void 0===n&&(n=""),n.replace(/(<\/?a.*?>)/gi,"")}var Ce=bn((function(n){var e=function(n){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,i=0,o={},c={manual:n.Prism&&n.Prism.manual,disableWorkerMessageHandler:n.Prism&&n.Prism.disableWorkerMessageHandler,util:{encode:function n(e){return e instanceof a?new a(e.type,n(e.content),e.alias):Array.isArray(e)?e.map(n):e.replace(/&/g,"&").replace(/=p.reach);x+=y.value.length,y=y.next){var S=y.value;if(e.length>n.length)return;if(!(S instanceof a)){var A,E=1;if(m){if(!(A=t(k,x,n,h))||A.index>=n.length)break;var z=A.index,$=A.index+A[0].length,T=x;for(T+=y.value.length;z>=T;)T+=(y=y.next).value.length;if(x=T-=y.value.length,y.value instanceof a)continue;for(var O=y;O!==e.tail&&(T<$||"string"==typeof O.value);O=O.next)E++,T+=O.value.length;E--,S=n.slice(x,T),A.index-=x}else if(!(A=t(k,0,S,h)))continue;z=A.index;var R=A[0],j=S.slice(0,z),L=S.slice(z+R.length),C=x+S.length;p&&C>p.reach&&(p.reach=C);var F=y.prev;if(j&&(F=r(e,F,j),x+=j.length),d(e,F,E),y=r(e,F,new a(g,_?c.tokenize(R,_):R,b,R)),L&&r(e,y,L),E>1){var P={cause:g+","+v,reach:C};f(n,e,i,y.prev,x,P),p&&P.reach>p.reach&&(p.reach=P.reach)}}}}}}function u(){var n={value:null,prev:null,next:null},e={value:null,prev:n,next:null};n.next=e,this.head=n,this.tail=e,this.length=0}function r(n,e,i){var o=e.next,c={value:i,prev:e,next:o};return e.next=c,o.prev=c,n.length++,c}function d(n,e,i){for(var o=e.next,c=0;c"+a.content+""},!n.document)return n.addEventListener?(c.disableWorkerMessageHandler||n.addEventListener("message",(function(e){var i=JSON.parse(e.data),o=i.language,a=i.code,t=i.immediateClose;n.postMessage(c.highlight(a,c.languages[o],o)),t&&n.close()}),!1),c):c;var p=c.util.currentScript();function g(){c.manual||c.highlightAll()}if(p&&(c.filename=p.src,p.hasAttribute("data-manual")&&(c.manual=!0)),!c.manual){var s=document.readyState;"loading"===s||"interactive"===s&&p&&p.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return c}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});n.exports&&(n.exports=e),void 0!==mn&&(mn.Prism=e),e.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",(function(n){"entity"===n.type&&(n.attributes.title=n.content.replace(/&/,"&"))})),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,i){var o={};o["language-"+i]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[i]},o.cdata=/^$/i;var c={"included-cdata":{pattern://i,inside:o}};c["language-"+i]={pattern:/[\s\S]+/,inside:e.languages[i]};var a={};a[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return n})),"i"),lookbehind:!0,greedy:!0,inside:c},e.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(n,i){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+n+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[i,"language-"+i],inside:e.languages[i]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml,function(n){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;n.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},n.languages.css.atrule.inside.rest=n.languages.css;var i=n.languages.markup;i&&(i.tag.addInlined("style","css"),i.tag.addAttribute("style","css"))}(e),e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript,function(){if(void 0!==e&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var n={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},i="data-src-status",o="loading",c="loaded",a="pre[data-src]:not(["+i+'="'+c+'"]):not(['+i+'="'+o+'"])';e.hooks.add("before-highlightall",(function(n){n.selector+=", "+a})),e.hooks.add("before-sanity-check",(function(t){var f=t.element;if(f.matches(a)){t.code="",f.setAttribute(i,o);var u=f.appendChild(document.createElement("CODE"));u.textContent="Loading…";var r=f.getAttribute("data-src"),d=t.language;if("none"===d){var p=(/\.(\w+)$/.exec(r)||[,"none"])[1];d=n[p]||p}e.util.setLanguage(u,d),e.util.setLanguage(f,d);var g=e.plugins.autoloader;g&&g.loadLanguages(d),function(n,o,a){var t=new XMLHttpRequest;t.open("GET",n,!0),t.onreadystatechange=function(){4==t.readyState&&(t.status<400&&t.responseText?function(n){f.setAttribute(i,c);var o=function(n){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(n||"");if(e){var i=Number(e[1]),o=e[2],c=e[3];return o?c?[i,Number(c)]:[i,void 0]:[i,i]}}(f.getAttribute("data-range"));if(o){var a=n.split(/\r\n?|\n/g),t=o[0],r=null==o[1]?a.length:o[1];t<0&&(t+=a.length),t=Math.max(0,Math.min(t-1,a.length)),r<0&&(r+=a.length),r=Math.max(0,Math.min(r,a.length)),n=a.slice(t,r).join("\n"),f.hasAttribute("data-start")||f.setAttribute("data-start",String(t+1))}u.textContent=n,e.highlightElement(u)}(t.responseText):t.status>=400?a("✖ Error "+t.status+" while fetching file: "+t.statusText):a("✖ Error: File does not exist or is empty"))},t.send(null)}(r,0,(function(n){f.setAttribute(i,"failed"),u.textContent=n}))}})),e.plugins.fileHighlight={highlight:function(n){for(var i,o=(n||document).querySelectorAll(a),c=0;i=o[c++];)e.highlightElement(i)}};var t=!1;e.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),e.plugins.fileHighlight.highlight.apply(this,arguments)}}}()}));!function(n){function e(n,e){return"___"+n.toUpperCase()+e+"___"}Object.defineProperties(n.languages["markup-templating"]={},{buildPlaceholders:{value:function(i,o,c,a){if(i.language===o){var t=i.tokenStack=[];i.code=i.code.replace(c,(function(n){if("function"==typeof a&&!a(n))return n;for(var c,f=t.length;-1!==i.code.indexOf(c=e(o,f));)++f;return t[f]=n,c})),i.grammar=n.languages.markup}}},tokenizePlaceholders:{value:function(i,o){if(i.language===o&&i.tokenStack){i.grammar=n.languages[o];var c=0,a=Object.keys(i.tokenStack);!function t(f){for(var u=0;u=a.length);u++){var r=f[u];if("string"==typeof r||r.content&&"string"==typeof r.content){var d=a[c],p=i.tokenStack[d],g="string"==typeof r?r:r.content,s=e(o,d),v=g.indexOf(s);if(v>-1){++c;var l=g.substring(0,v),_=new n.Token(o,n.tokenize(p,i.grammar),"language-"+o,p),h=g.substring(v+s.length),m=[];l&&m.push.apply(m,t([l])),m.push(_),h&&m.push.apply(m,t([h])),"string"==typeof r?f.splice.apply(f,[u,1].concat(m)):r.content=m}}else r.content&&t(r.content)}return f}(i.tokens)}}}})}(Prism);var Fe={},Pe={markdown:function(n){return{url:n}},mermaid:function(n){return{url:n}},iframe:function(n,e){return{html:'"}},video:function(n,e){return{html:'"}},audio:function(n,e){return{html:'"}},code:function(n,e){var i=n.match(/\.(\w+)$/);return"md"===(i=e||i&&i[1])&&(i="markdown"),{url:n,lang:i}}},qe=function(e,i){var o=this;this.config=e,this.router=i,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=e.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?e.externalLinkRel||"noopener":"",this.contentBase=i.getBasePath();var t,u=this._initRenderer();this.heading=u.heading;var r=e.markdown||{};f(r)?t=r(xe,u):(xe.setOptions(c(r,{renderer:c(u,r.renderer)})),t=xe),this._marked=t,this.compile=function(i){var c=!0,f=n((function(n){c=!1;var o="";return i?(o=a(i)?t(i):t.parser(i),o=e.noEmoji?o:function(n,e){return n.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,(function(n){return n.replace(/:/g,"__colon__")})).replace(//g,(function(n){return n.replace(/:/g,"__colon__")})).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,(function(n){return n.replace(/:/g,"__colon__")})).replace(/:([a-z0-9_\-+]+?):/g,(function(n,i){return function(n,e,i){var o=Re.data[e],c=n;return o&&(c=i&&/unicode/.test(o)?''+o.replace("unicode/","").replace(/\.png.*/,"").split("-").map((function(n){return"&#x"+n+";"})).join("‍").concat("︎")+"":''+e+''),c}(n,i,e)})).replace(/__colon__/g,":")}(o,e.nativeEmoji),Oe.clear(),o):i}))(i),u=o.router.parse().file;return c?o.toc=o.cacheTOC[u]:o.cacheTOC[u]=[].concat(o.toc),f}};qe.prototype.compileEmbed=function(n,e){var i,o=je(e),c=o.str,a=o.config;if(e=c,a.include){var t;if(R(n)||(n=q(this.contentBase,L(this.router.getCurrentPath()),n)),a.type&&(t=Pe[a.type]))(i=t.call(this,n,e)).type=a.type;else{var f="code";/\.(md|markdown)/.test(n)?f="markdown":/\.mmd/.test(n)?f="mermaid":/\.html?/.test(n)?f="iframe":/\.(mp4|ogg)/.test(n)?f="video":/\.mp3/.test(n)&&(f="audio"),(i=Pe[f].call(this,n,e)).type=f}return i.fragment=a.fragment,i}},qe.prototype._matchNotCompileLink=function(n){for(var e=this.config.noCompileLinks||[],i=0;i/g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore} --\x3e",""),f.title=Le(o),f.ignoreSubHeading=!0),/{docsify-ignore}/g.test(o)&&(o=o.replace("{docsify-ignore}",""),f.title=Le(o),f.ignoreSubHeading=!0),//g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),f.title=Le(o),f.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(o)&&(o=o.replace("{docsify-ignore-all}",""),f.title=Le(o),f.ignoreAllSubs=!0);var u=Oe(a.id||o),r=c.toURL(c.getCurrentPath(),{id:u});return f.slug=r,t.toc.push(f),"'+o+""},f.code=function(n){return n.renderer.code=function(n,e){void 0===e&&(e="markup");var i=Ce.languages[e]||Ce.languages.markup;return'
    '+Ce.highlight(n.replace(/@DOCSIFY_QM@/g,"`"),i,e)+"
    "}}({renderer:n}),f.link=function(n){var e=n.router,i=n.linkTarget,o=n.linkRel,c=n.compilerClass;return n.renderer.link=function(n,a,t){void 0===a&&(a="");var f=[],u=je(a),r=u.str,d=u.config;return i=d.target||i,o="_blank"===i?c.config.externalLinkRel||"noopener":"",a=r,R(n)||c._matchNotCompileLink(n)||d.ignore?(R(n)||"./"!==n.slice(0,2)||(n=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+n),f.push(0===n.indexOf("mailto:")?"":'target="'+i+'"'),f.push(0===n.indexOf("mailto:")?"":""!==o?' rel="'+o+'"':"")):(n===c.config.homepage&&(n="README"),n=e.toURL(n,null,e.getCurrentPath())),d.disabled&&(f.push("disabled"),n="javascript:void(0)"),d.class&&f.push('class="'+d.class+'"'),d.id&&f.push('id="'+d.id+'"'),a&&f.push('title="'+a+'"'),'"+t+""}}({renderer:n,router:c,linkTarget:i,linkRel:o,compilerClass:t}),f.paragraph=function(n){return n.renderer.paragraph=function(n){return/^!>/.test(n)?Ae("tip",n):/^\?>/.test(n)?Ae("warn",n):"

    "+n+"

    "}}({renderer:n}),f.image=function(n){var e=n.contentBase,i=n.router;return n.renderer.image=function(n,o,c){var a=n,t=[],f=je(o),u=f.str,r=f.config;if(o=u,r["no-zoom"]&&t.push("data-no-zoom"),o&&t.push('title="'+o+'"'),r.size){var d=r.size.split("x"),p=d[0],g=d[1];g?t.push('width="'+p+'" height="'+g+'"'):t.push('width="'+p+'"')}return r.class&&t.push('class="'+r.class+'"'),r.id&&t.push('id="'+r.id+'"'),R(n)||(a=q(e,L(i.getCurrentPath()),n)),t.length>0?''+c+'":''+c+'"}}({renderer:n,contentBase:a,router:c}),f.list=function(n){return n.renderer.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+" "+[/
  • /.test(n.split('class="task-list"')[0])?'class="task-list"':"",i&&i>1?'start="'+i+'"':""].join(" ").trim()+">"+n+""}}({renderer:n}),f.listitem=function(n){return n.renderer.listitem=function(n){return/^(]*>)/.test(n)?'
  • ":"
  • "+n+"
  • "}}({renderer:n}),n.origin=f,n},qe.prototype.sidebar=function(n,e){var i=this.toc,o=this.router.getCurrentPath(),c="";if(n)c=this.compile(n);else{for(var a=0;a{inner}"),this.cacheTree[o]=u}return c},qe.prototype.subSidebar=function(n){if(n){var e=this.router.getCurrentPath(),i=this.cacheTree,o=this.toc;o[0]&&o[0].ignoreAllSubs&&o.splice(0),o[0]&&1===o[0].level&&o.shift();for(var c=0;c *").filter((function(n){return a(n)}));tscript").filter((function(n){return!/template/.test(n.type)}))[0];if(!n)return!1;var e=n.innerText.trim();if(!e)return!1;new Function(e)()}(),"Vue"in window){var r=[],d=Object.keys(e.vueComponents||{});if(2===o&&d.length&&d.forEach((function(n){!window.Vue.options.components[n]&&window.Vue.component(n,e.vueComponents[n])})),!Ie&&e.vueGlobalOptions&&"function"==typeof e.vueGlobalOptions.data&&(Ie=e.vueGlobalOptions.data()),r.push.apply(r,Object.keys(e.vueMounts||{}).map((function(n){return[_(i,n),e.vueMounts[n]]})).filter((function(n){var e=n[0];return n[1],e}))),e.vueGlobalOptions||d.length){var p=/{{2}[^{}]*}{2}/,g=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;r.push.apply(r,h(".markdown-section > *").filter((function(n){return!r.some((function(e){var i=e[0];return e[1],i===n}))})).filter((function(n){return n.tagName.toLowerCase()in(e.vueComponents||{})||n.querySelector(d.join(",")||null)||p.test(n.outerHTML)||g.test(n.outerHTML)})).map((function(n){var i=c({},e.vueGlobalOptions||{});return Ie&&(i.data=function(){return Ie}),[n,i]})))}for(var s=0,v=r;s-1&&"_coverpage";else{var u=i[f];t=!0===u?"_coverpage":u}var r=Boolean(t)&&this.config.onlyCover;return t?(t=this.router.getFile(a+t),this.coverIsHTML=/\.html$/g.test(t),J(t+O(c,["id"]),!1,o).then((function(e){return n._renderCover(e,r)}))):this._renderCover(null,r),r}},e.prototype.$fetch=function(n,e){var i=this;void 0===n&&(n=t),void 0===e&&(e=this.$resetEvents.bind(this));var o=function(){i.callHook("doneEach"),n()};this._fetchCover()?o():this._fetch((function(){e(),o()}))},e.prototype._fetchFallbackPage=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.requestHeaders,u=a.fallbackLanguages,r=a.loadSidebar;if(!u)return!1;var d=n.split("/")[1];if(-1===u.indexOf(d))return!1;var p=this.router.getFile(n.replace(new RegExp("^/"+d),""));return i(p+e,0,f).then((function(i,a){return c._renderMain(i,a,c._loadSideAndNav(n,e,r,o))}),(function(){return c._fetch404(n,e,o)})),!0},e.prototype._fetch404=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.loadSidebar,u=a.requestHeaders,r=a.notFoundPage,d=this._loadSideAndNav(n,e,f,o);if(r){var p=function(n,e){var i,o,c=e.notFoundPage,a="_404"+(e.ext||".md");switch(typeof c){case"boolean":o=a;break;case"string":o=c;break;case"object":o=(i=Object.keys(c).sort((function(n,e){return e.length-n.length})).filter((function(e){return n.match(new RegExp("^"+e))}))[0])&&c[i]||a}return o}(n,this.config);return i(this.router.getFile(p),0,u).then((function(n,e){return c._renderMain(n,e,d)}),(function(){return c._renderMain(null,{},d)})),!0}return this._renderMain(null,{},d),!1},e.prototype.initFetch=function(){var n=this,e=this.config.loadSidebar;if(this.rendered){var i=on(this.router,".sidebar-nav",!0,!0);e&&i&&(i.parentNode.innerHTML+=window.__SUB_SIDEBAR__),this._bindEventOnRendered(i),this.$resetEvents(),this.callHook("doneEach"),this.callHook("ready")}else this.$fetch((function(e){return n.callHook("ready")}))},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.$resetEvents=function(n){var e,i=this,o=this.config.auto2top;"history"!==n&&(i.route.query.id&&function(n,e){if(e){var i,o,c=rn().topMargin,a=_("#"+e);a&&(i=a,void 0===(o=c)&&(o=0),gn&&gn.stop(),sn=!1,gn=new fn({start:window.pageYOffset,end:Math.round(i.getBoundingClientRect().top)+window.pageYOffset-o,duration:500}).on("tick",(function(n){return window.scrollTo(0,n)})).on("done",(function(){sn=!0,gn=null})).begin());var t=dn[_n(n,e)],f=_(g(".sidebar"),"li.active");f&&f.classList.remove("active"),t&&t.classList.add("active")}}(i.route.path,i.route.query.id),"navigate"===n&&o&&(void 0===(e=o)&&(e=0),hn.scrollTop=!0===e?0:Number(e))),this.config.loadNavbar&&on(this.router,"nav")},e.prototype.initEvent=function(){var n,e;n="button.sidebar-toggle",this.router,e=function(n){return v.classList.toggle("close")},null!=(n=g(n))&&(k(n,"click",(function(n){n.stopPropagation(),e()})),r&&k(v,"click",(function(n){return v.classList.contains("close")&&e()}))),function(n){null!=(n=g(n))&&k(n,"click",(function(n){var e=n.target;"A"===e.nodeName&&e.nextSibling&&e.nextSibling.classList&&e.nextSibling.classList.contains("app-sub-sidebar")&&x(e.parentNode,"collapse")}))}(".sidebar",this.router),this.config.coverpage?!r&&k("scroll",en):v.classList.add("sticky")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype._renderTo=function(n,e,i){var o=g(n);o&&(o[i?"outerHTML":"innerHTML"]=e)},e.prototype._renderSidebar=function(n){var e=this.config,i=e.maxLevel,o=e.subMaxLevel,c=e.loadSidebar;if(e.hideSidebar)return[document.querySelector("aside.sidebar"),document.querySelector("button.sidebar-toggle")].filter((function(n){return!!n})).forEach((function(n){return n.parentNode.removeChild(n)})),document.querySelector("section.content").style.right="unset",document.querySelector("section.content").style.left="unset",document.querySelector("section.content").style.position="relative",document.querySelector("section.content").style.width="100%",null;this._renderTo(".sidebar-nav",this.compiler.sidebar(n,i));var a=on(this.router,".sidebar-nav",!0,!0);c&&a?a.parentNode.innerHTML+=this.compiler.subSidebar(o)||"":this.compiler.subSidebar(),this._bindEventOnRendered(a)},e.prototype._bindEventOnRendered=function(n){var e=this.config.autoHeader;if(function(n){var e=_(".cover.show");vn=e?e.offsetHeight:0;var i=g(".sidebar"),o=[];null!=i&&(o=h(i,"li"));for(var c=0,a=o.length;c\n'+i+"\n"}]).links={}:(o=[{type:"html",text:i}]).links={};e({token:n,embedToken:o}),++t>=a&&e({})}}(i);i.embed.url?J(i.embed.url).then(f):f(i.embed.html)}}({compile:u,embedTokens:d,fetch:a},(function(n){var i=n.embedToken,a=n.token;if(a){var t=a.index;s.forEach((function(n){t>n.start&&(t+=n.length)})),c(g,i.links),r=r.slice(0,t).concat(i,r.slice(t+1)),s.push({start:t,length:i.length-1})}else De[o]=r.concat(),r.links=De[o].links=g,e(r)}))}({compiler:o.compiler,raw:a},(function(n){t=o.compiler.compile(n),f()}))}))},e.prototype._renderCover=function(n,e){var i=g(".cover");if(x(g("main"),e?"add":"remove","hidden"),n){x(i,"add","show");var o=this.coverIsHTML?n:this.compiler.cover(n),c=o.trim().match('

    ([^<]*?)

    $');if(c){if("color"===c[2])i.style.background=c[1]+(c[3]||"");else{var a=c[1];x(i,"add","has-mask"),R(c[1])||(a=q(this.router.getBasePath(),c[1])),i.style.backgroundImage="url("+a+")",i.style.backgroundSize="cover",i.style.backgroundPosition="center center"}o=o.replace(c[0],"")}this._renderTo(".cover-main",o),en()}else x(i,"remove","show")},e.prototype._updateRender=function(){!function(n){var e=g(".app-name-link"),i=n.config.nameLink,o=n.route.path;if(e)if(a(n.config.nameLink))e.setAttribute("href",i);else if("object"==typeof i){var c=Object.keys(i).filter((function(n){return o.indexOf(n)>-1}))[0];e.setAttribute("href",i[c])}}(this)},e.prototype.initRender=function(){var n=this.config;this.compiler=new qe(n,this.router),window.__current_docsify_compiler__=this.compiler;var e,i,o,c,a=n.el||"#app",t=_("nav")||m("nav"),f=_(a),u="",d=v;if(f){if(n.repo&&(u+=(i=n.repo,o=n.cornerExternalLinkTarget,i?(/\/\//.test(i)||(i="https://github.com/"+i),''):"")),n.coverpage&&(u+=(e=", 100%, 85%",'
    \x3c!--cover--\x3e
    ')),n.logo){var p=/^data:image/.test(n.logo),g=/(?:http[s]?:)?\/\//.test(n.logo),b=/^\./.test(n.logo);p||g||b||(n.logo=q(this.router.getBasePath(),n.logo))}u+=function(n){var e=n.name?n.name:"";return'
    '}(n),this._renderTo(f,u,!0)}else this.rendered=!0;n.mergeNavbar&&r?d=_(".sidebar"):(t.classList.add("app-nav"),n.repo||t.classList.add("no-badge")),n.loadNavbar&&w(d,t),n.themeColor&&(s.head.appendChild(m("div",(c=n.themeColor,"")).firstElementChild),function(n){if(!(window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)"))){var e=h("style:not(.inserted),link");[].forEach.call(e,(function(e){if("STYLE"===e.nodeName)Q(e,n);else if("LINK"===e.nodeName){var i=e.getAttribute("href");if(!/\.css$/.test(i))return;J(i).then((function(e){var i=m("style",e);l.appendChild(i),Q(i,n)}))}}))}}(n.themeColor)),this._updateRender(),x(v,"ready")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.routes=function(){return this.config.routes||{}},e.prototype.matchVirtualRoute=function(n){var e=this.routes(),i=Object.keys(e),o=function(){return null};function c(){var a=i.shift();if(!a)return o(null);var t=function(n){var e=("^",0===n.indexOf("^")?n:"^"+n);return E(e,"$")?e:e+"$"}(a),f=n.match(t);if(!f)return c();var u,r=e[a];if("string"==typeof r)return o(r);if("function"==typeof r){var d=r,p=(u=function(){return null},[function(n){u(n)},function(n){u=n}]),g=p[0];return(0,p[1])((function(n){return"string"==typeof n?o(n):!1===n?o(null):c()})),d.length<=2?g(d(n,f)):d(n,f,g)}return c()}return{then:function(n){o=n,c()}}},e}(n)}((Ue=function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.initLifecycle=function(){var n=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach((function(e){var i=n._hooks[e]=[];n._lifecycle[e]=function(n){return i.push(n)}}))},e.prototype.callHook=function(n,e,i){void 0===i&&(i=t);var o=this._hooks[n],c=this.config.catchPluginErrors,a=function(n){var t=o[n];if(n>=o.length)i(e);else if("function"==typeof t){var f="Docsify plugin error";if(2===t.length)try{t(e,(function(i){e=i,a(n+1)}))}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}else try{var u=t(e);e=void 0===u?e:u,a(n+1)}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}}else a(n+1)};a(0)},e}(Object),function(n){function e(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];n.apply(this,e),this.route={}}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),v.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var n,e=this,i=this.config;n="history"===(i.routerMode||"hash")&&d?new Z(i):new G(i),this.router=n,this.updateRender(),Y=this.route,n.onchange((function(n){e.updateRender(),e._updateRender(),Y.path!==e.route.path?(e.$fetch(t,e.$resetEvents.bind(e,n.source)),Y=e.route):e.$resetEvents(n.source)}))},e}(Ue)))))));window.Docsify={util:Be,dom:A,get:J,slugify:Oe,version:"4.13.1"},window.DocsifyCompiler=qe,window.marked=xe,window.Prism=Ce,S((function(n){return new Ge}))}()},895:()=>{var n;n={100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"},window&&window.console&&console.info("Docsify emoji plugin has been deprecated as of v4.13"),window.emojify=function(e,i){return!1===Object.prototype.hasOwnProperty.call(n,i)?e:''+i+''}},460:()=>{!function(){function n(n){return n.replace(//,"").replace(/{docsify-ignore}/,"").replace(//,"").replace(/{docsify-ignore-all}/,"").trim()}var e={},i="docsify.search.expires",o="docsify.search.index";function c(n){var e={"&":"&","<":"<",">":">",'"':""","'":"'"};return String(n).replace(/[&<>"']/g,(function(n){return e[n]}))}function a(n){return n.text||"table"!==n.type||(n.cells.unshift(n.header),n.text=n.cells.map((function(n){return n.join(" | ")})).join(" |\n ")),n.text}function t(n){return n.text||"list"!==n.type||(n.text=n.raw),n.text}function f(n){return n&&n.normalize?n.normalize("NFD").replace(/[\u0300-\u036f]/g,""):n}function u(f,u){var r="auto"===f.paths,d=r?function(n){var e=[];return Docsify.dom.findAll(".sidebar-nav a:not(.section-link):not([data-nosearch])").forEach((function(i){var o=i.href,c=i.getAttribute("href"),a=n.parse(o).path;a&&-1===e.indexOf(a)&&!Docsify.util.isAbsolutePath(c)&&e.push(a)})),e}(u.router):f.paths,p="";if(d.length&&r&&f.pathNamespaces){var g=d[0];if(Array.isArray(f.pathNamespaces))p=f.pathNamespaces.filter((function(n){return g.slice(0,n.length)===n}))[0]||p;else if(f.pathNamespaces instanceof RegExp){var s=g.match(f.pathNamespaces);s&&(p=s[0])}var v=-1===d.indexOf(p+"/"),l=-1===d.indexOf(p+"/README");v&&l&&d.unshift(p+"/")}else-1===d.indexOf("/")&&-1===d.indexOf("/README")&&d.unshift("/");var _,h=((_=f.namespace)?i+"/"+_:i)+p,m=function(n){return n?o+"/"+n:o}(f.namespace)+p,b=localStorage.getItem(h)=0||o>=0){t+=e>=0?3:o>=0?2:0,o<0&&(o=0);var a,s=0;s=0==(a=o<11?0:o-10)?70:o+n.length+60,g&&s>g.length&&(s=g.length);var v=d&&"..."+d.substring(a,s).replace(i,(function(n){return''+n+""}))+"...";u+=v}})),t>0)){var v={title:r,content:g?u:"",url:s,score:t};i.push(v)}},u=0;u\n

    '+n.title+"

    \n

    "+n.content+"

    \n
    \n"})),o.classList.add("show"),a.classList.add("show"),o.innerHTML=g||'

    '+d+"

    ",r.hideOtherSidebarContent&&(t&&t.classList.add("hide"),u&&u.classList.add("hide"))}function g(n){r=n}var s={placeholder:"Type to search",noData:"No Results!",paths:"auto",depth:2,maxAge:864e5,hideOtherSidebarContent:!1,namespace:void 0,pathNamespaces:void 0};$docsify.plugins=[].concat((function(n,e){var i=Docsify.util,o=e.config.search||s;Array.isArray(o)?s.paths=o:"object"==typeof o&&(s.paths=Array.isArray(o.paths)?o.paths:"auto",s.maxAge=i.isPrimitive(o.maxAge)?o.maxAge:s.maxAge,s.placeholder=o.placeholder||s.placeholder,s.noData=o.noData||s.noData,s.depth=o.depth||s.depth,s.hideOtherSidebarContent=o.hideOtherSidebarContent||s.hideOtherSidebarContent,s.namespace=o.namespace||s.namespace,s.pathNamespaces=o.pathNamespaces||s.pathNamespaces);var c="auto"===s.paths;n.mounted((function(n){(function(n,e){var i,o,c,a,t=e.router.parse().query.s;g(n),Docsify.dom.style("\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}"),function(n){void 0===n&&(n="");var e='
    \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n ',i=Docsify.dom.create("div",e),o=Docsify.dom.find("aside");Docsify.dom.toggleClass(i,"search"),Docsify.dom.before(o,i)}(t),o=Docsify.dom.find("div.search"),c=Docsify.dom.find(o,"input"),a=Docsify.dom.find(o,".input-wrap"),Docsify.dom.on(o,"click",(function(n){return-1===["A","H2","P","EM"].indexOf(n.target.tagName)&&n.stopPropagation()})),Docsify.dom.on(c,"input",(function(n){clearTimeout(i),i=setTimeout((function(e){return p(n.target.value.trim())}),100)})),Docsify.dom.on(a,"click",(function(n){"INPUT"!==n.target.tagName&&(c.value="",p())})),t&&setTimeout((function(n){return p(t)}),500)})(s,e),!c&&u(s,e)})),n.doneEach((function(n){(function(n,e){g(n),function(n,e){var i=Docsify.dom.getNode('.search input[type="search"]');if(i)if("string"==typeof n)i.placeholder=n;else{var o=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];i.placeholder=n[o]}}(n.placeholder,e.route.path),function(n,e){if("string"==typeof n)d=n;else{var i=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];d=n[i]}}(n.noData,e.route.path)})(s,e),c&&u(s,e)}))}),$docsify.plugins)}()},874:()=>{!function(n){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",i={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:i,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:i}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},i.inside=n.languages.bash;for(var c=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=o.variable[1].inside,t=0;t{Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]}},e={};function i(o){var c=e[o];if(void 0!==c)return c.exports;var a=e[o]={exports:{}};return n[o](a,a.exports,i),a.exports}i.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return i.d(e,{a:e}),e},i.d=(n,e)=>{for(var o in e)i.o(e,o)&&!i.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:e[o]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),i.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),(()=>{"use strict";i(807),i(895),i(460),i(46),i(874)})()})(); \ No newline at end of file +(()=>{var n={807:(n,e,i)=>{!function(){function n(n){var e=Object.create(null);return function(i){var o=a(i)?i:JSON.stringify(i);return e[o]||(e[o]=n(i))}}var e=n((function(n){return n.replace(/([A-Z])/g,(function(n){return"-"+n.toLowerCase()}))})),o=Object.prototype.hasOwnProperty,c=Object.assign||function(n){for(var e=arguments,i=1;i0&&e[1].toLowerCase()!==location.protocol||"string"==typeof e[2]&&e[2].length>0&&e[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host||!!/^\/\\/.test(n)}var r=document.body.clientWidth<=600,d=window.history&&window.history.pushState&&window.history.replaceState&&!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/),p={};function g(n,e){if(void 0===e&&(e=!1),"string"==typeof n){if(void 0!==window.Vue)return _(n);n=e?_(n):p[n]||(p[n]=_(n))}return n}var s=document,v=s.body,l=s.head;function _(n,e){return e?n.querySelector(e):s.querySelector(n)}function h(n,e){return[].slice.call(e?n.querySelectorAll(e):s.querySelectorAll(n))}function m(n,e){return n=s.createElement(n),e&&(n.innerHTML=e),n}function b(n,e){return n.appendChild(e)}function w(n,e){return n.insertBefore(e,n.children[0])}function k(n,e,i){f(e)?window.addEventListener(n,e):n.addEventListener(e,i)}function y(n,e,i){f(e)?window.removeEventListener(n,e):n.removeEventListener(e,i)}function x(n,e,i){n&&n.classList[i?e:"toggle"](i||e)}function S(n,e){void 0===e&&(e=document);var i=e.readyState;if("complete"===i||"interactive"===i)return setTimeout(n,0);e.addEventListener("DOMContentLoaded",n)}var A=Object.freeze({__proto__:null,getNode:g,$:s,body:v,head:l,find:_,findAll:h,create:m,appendTo:b,before:w,on:k,off:y,toggleClass:x,style:function(n){b(l,m("style",n))},documentReady:S});function z(n,e){return-1!==n.indexOf(e,n.length-e.length)}var E=decodeURIComponent,$=encodeURIComponent;function T(n){var e={};return(n=n.trim().replace(/^(\?|#|&)/,""))?(n.split("&").forEach((function(n){var i=n.replace(/\+/g," ").split("=");e[i[0]]=i[1]&&E(i[1])})),e):e}function O(n,e){void 0===e&&(e=[]);var i=[];for(var o in n)e.indexOf(o)>-1||i.push(n[o]?($(o)+"="+$(n[o])).toLowerCase():$(o));return i.length?"?"+i.join("&"):""}var R=n((function(n){return/(:|(\/{2}))/g.test(n)})),j=n((function(n){return n.split(/[?#]/)[0]})),L=n((function(n){if(/\/$/g.test(n))return n;var e=n.match(/(\S*\/)[^/]+$/);return e?e[1]:""})),C=n((function(n){return n.replace(/^\/+/,"/").replace(/([^:])\/{2,}/g,"$1/")})),F=n((function(n){for(var e=n.replace(/^\//,"").split("/"),i=[],o=0,c=e.length;o=0?e:0)+"#"+n)}M.prototype.getBasePath=function(){return this.config.basePath},M.prototype.getFile=function(n,e){void 0===n&&(n=this.getCurrentPath());var i=this.config,o=this.getBasePath(),c="string"==typeof i.ext?i.ext:".md";return n=function(n,e){return new RegExp("\\.("+e.replace(/^\./,"")+"|html)$","g").test(n)?n:/\/$/g.test(n)?n+"README"+e:""+n+e}(n=i.alias?D(n,i.alias):n,c),n=n==="/README"+c&&i.homepage||n,n=R(n)?n:q(o,n),e&&(n=n.replace(new RegExp("^"+o),"")),n},M.prototype.onchange=function(n){void 0===n&&(n=t),n()},M.prototype.getCurrentPath=function(){},M.prototype.normalize=function(){},M.prototype.parse=function(){},M.prototype.toURL=function(n,e,i){var o=i&&"#"===n[0],a=this.parse(I(n));if(a.query=c({},a.query,e),n=(n=a.path+O(a.query)).replace(/\.md(\?)|\.md$/,"$1"),o){var t=i.indexOf("?");n=(t>0?i.substring(0,t):i)+n}if(this.config.relativePath&&0!==n.indexOf("/")){var f=i.substring(0,i.lastIndexOf("/")+1);return C(F(f+n))}return C("/"+n)};var U,B,G=function(n){function e(e){n.call(this,e),this.mode="hash"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getBasePath=function(){var n=window.location.pathname||"",e=this.config.basePath,i=z(n,".html")?n+"#/"+e:n+"/"+e;return/^(\/|https?:)/g.test(e)?e:C(i)},e.prototype.getCurrentPath=function(){var n=location.href,e=n.indexOf("#");return-1===e?"":n.slice(e+1)},e.prototype.onchange=function(n){void 0===n&&(n=t);var e=!1;k("click",(function(n){var i="A"===n.target.tagName?n.target:n.target.parentNode;i&&"A"===i.tagName&&!u(i.href)&&(e=!0)})),k("hashchange",(function(i){var o=e?"navigate":"history";e=!1,n({event:i,source:o})}))},e.prototype.normalize=function(){var n=this.getCurrentPath();if("/"===(n=I(n)).charAt(0))return H(n);H("/"+n)},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("#");i>=0&&(n=n.slice(i+1));var o=n.indexOf("?");return o>=0&&(e=n.slice(o+1),n=n.slice(0,o)),{path:n,file:this.getFile(n,!0),query:T(e)}},e.prototype.toURL=function(e,i,o){return"#"+n.prototype.toURL.call(this,e,i,o)},e}(M),Z=function(n){function e(e){n.call(this,e),this.mode="history"}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.getCurrentPath=function(){var n=this.getBasePath(),e=window.location.pathname;return n&&0===e.indexOf(n)&&(e=e.slice(n.length)),(e||"/")+window.location.search+window.location.hash},e.prototype.onchange=function(n){void 0===n&&(n=t),k("click",(function(e){var i="A"===e.target.tagName?e.target:e.target.parentNode;if(i&&"A"===i.tagName&&!u(i.href)){e.preventDefault();var o=i.href;window.history.pushState({key:o},"",o),n({event:e,source:"navigate"})}})),k("popstate",(function(e){n({event:e,source:"history"})}))},e.prototype.parse=function(n){void 0===n&&(n=location.href);var e="",i=n.indexOf("?");i>=0&&(e=n.slice(i+1),n=n.slice(0,i));var o=q(location.origin),c=n.indexOf(o);return c>-1&&(n=n.slice(c+o.length)),{path:n,file:this.getFile(n),query:T(e)}},e}(M),Y={},V=/([^{]*?)\w(?=\})/g,X={YYYY:"getFullYear",YY:"getYear",MM:function(n){return n.getMonth()+1},DD:"getDate",HH:"getHours",mm:"getMinutes",ss:"getSeconds",fff:"getMilliseconds"};function W(n){var e,i,o=n.loaded,c=n.total,a=n.step;!U&&((i=m("div")).classList.add("progress"),b(v,i),U=i),e=a?(e=parseInt(U.style.width||0,10)+a)>80?80:e:Math.floor(o/c*100),U.style.opacity=1,U.style.width=e>=95?"100%":e+"%",e>=95&&(clearTimeout(B),B=setTimeout((function(n){U.style.opacity=0,U.style.width="0%"}),200))}var K={};function J(n,e,i){void 0===e&&(e=!1),void 0===i&&(i={});var c=new XMLHttpRequest,a=function(){c.addEventListener.apply(c,arguments)},f=K[n];if(f)return{then:function(n){return n(f.content,f.opt)},abort:t};for(var u in c.open("GET",n),i)o.call(i,u)&&c.setRequestHeader(u,i[u]);return c.send(),{then:function(i,o){if(void 0===o&&(o=t),e){var f=setInterval((function(n){return W({step:Math.floor(5*Math.random()+1)})}),500);a("progress",W),a("loadend",(function(n){W(n),clearInterval(f)}))}a("error",o),a("load",(function(e){var a=e.target;if(a.status>=400)o(a);else{var t=K[n]={content:a.response,opt:{updatedAt:c.getResponseHeader("last-modified")}};i(t.content,t.opt)}}))},abort:function(n){return 4!==c.readyState&&c.abort()}}}function Q(n,e){n.innerHTML=n.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,e)}var nn=s.title;function en(){var n=g("section.cover");if(n){var e=n.getBoundingClientRect().height;window.pageYOffset>=e||n.classList.contains("hidden")?x(v,"add","sticky"):x(v,"remove","sticky")}}function on(n,e,i,o){var c=[];null!=(e=g(e))&&(c=h(e,"a"));var a,t=decodeURI(n.toURL(n.getCurrentPath()));return c.sort((function(n,e){return e.href.length-n.href.length})).forEach((function(n){var e=decodeURI(n.getAttribute("href")),o=i?n.parentNode:n;n.title=n.title||n.innerText,0!==t.indexOf(e)||a?x(o,"remove","active"):(a=n,x(o,"add","active"))})),o&&(s.title=a?a.title||a.innerText+" - "+nn:nn),a}var cn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.start=e.start,this.end=e.end,this.decimal=e.decimal}return cn(n,[{key:"getIntermediateValue",value:function(n){return this.decimal?n:Math.round(n)}},{key:"getFinalValue",value:function(){return this.end}}]),n}(),tn=function(){function n(n,e){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.tweener=e.tweener||new an(e),this.start=this.tweener.start,this.end=this.tweener.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.startthis.end&&n>=this.next}[this.direction]}},{key:"_defaultEase",value:function(n,e,i,o){return(n/=o/2)<1?i/2*n*n+e:-i/2*(--n*(n-2)-1)+e}}]),n}(),un=document.currentScript;function rn(n){var i=c({auto2top:!1,autoHeader:!1,basePath:"",catchPluginErrors:!0,cornerExternalLinkTarget:"_blank",coverpage:"",el:"#app",executeScript:null,ext:".md",externalLinkRel:"noopener",externalLinkTarget:"_blank",formatUpdated:"",ga:"",homepage:"README.md",loadNavbar:null,loadSidebar:null,maxLevel:6,mergeNavbar:!1,name:"",nameLink:window.location.pathname,nativeEmoji:!1,noCompileLinks:[],noEmoji:!1,notFoundPage:!0,relativePath:!1,repo:"",routes:{},routerMode:"hash",subMaxLevel:0,themeColor:"",topMargin:0},"function"==typeof window.$docsify?window.$docsify(n):window.$docsify),t=un||[].slice.call(document.getElementsByTagName("script")).filter((function(n){return/docsify\./.test(n.src)}))[0];if(t)for(var f in i)if(o.call(i,f)){var u=t.getAttribute("data-"+e(f));a(u)&&(i[f]=""===u||u)}return!0===i.loadSidebar&&(i.loadSidebar="_sidebar"+i.ext),!0===i.loadNavbar&&(i.loadNavbar="_navbar"+i.ext),!0===i.coverpage&&(i.coverpage="_coverpage"+i.ext),!0===i.repo&&(i.repo=""),!0===i.name&&(i.name=""),window.$docsify=i,i}var dn={},pn=!1,gn=null,sn=!0,vn=0;function ln(n){if(sn){for(var e,i=g(".sidebar"),o=h(".anchor"),c=_(i,".sidebar-nav"),a=_(i,"li.active"),t=document.documentElement,f=(t&&t.scrollTop||document.body.scrollTop)-vn,u=0,r=o.length;uf){e||(e=d);break}e=d}if(e){var p=dn[_n(n,e.getAttribute("data-id"))];if(p&&p!==a&&(a&&a.classList.remove("active"),p.classList.add("active"),a=p,!pn&&v.classList.contains("sticky"))){var s=i.clientHeight,l=a.offsetTop+a.clientHeight+40,m=a.offsetTop>=c.scrollTop&&l<=c.scrollTop+s,b=l-0"']/),yn=/[&<>"']/g,xn=/[<>"']|&(?!#?\w+;)/,Sn=/[<>"']|&(?!#?\w+;)/g,An={"&":"&","<":"<",">":">",'"':""","'":"'"},zn=function(n){return An[n]},En=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function $n(n){return n.replace(En,(function(n,e){return"colon"===(e=e.toLowerCase())?":":"#"===e.charAt(0)?"x"===e.charAt(1)?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""}))}var Tn=/(^|[^\[])\^/g,On=/[^\w:]/g,Rn=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i,jn={},Ln=/^[^:]+:\/*[^/]*$/,Cn=/^([^:]+:)[\s\S]*$/,Fn=/^([^:]+:\/*[^/]*)[\s\S]*$/;function Pn(n,e,i){var o=n.length;if(0===o)return"";for(var c=0;c=0&&"\\"===i[c];)o=!o;return o?"|":" |"})).split(/ \|/),o=0;if(i.length>e)i.splice(e);else for(;i.length1?{type:"space",raw:e[0]}:{raw:"\n"}},n.prototype.code=function(n,e){var i=this.rules.block.code.exec(n);if(i){var o=e[e.length-1];if(o&&"paragraph"===o.type)return{raw:i[0],text:i[0].trimRight()};var c=i[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:i[0],codeBlockStyle:"indented",text:this.options.pedantic?c:Hn(c,"\n")}}},n.prototype.fences=function(n){var e=this.rules.block.fences.exec(n);if(e){var i=e[0],o=function(n,e){var i=n.match(/^(\s+)(?:```)/);if(null===i)return e;var o=i[1];return e.split("\n").map((function(n){var e=n.match(/^\s+/);return null===e?n:e[0].length>=o.length?n.slice(o.length):n})).join("\n")}(i,e[3]||"");return{type:"code",raw:i,lang:e[2]?e[2].trim():e[2],text:o}}},n.prototype.heading=function(n){var e=this.rules.block.heading.exec(n);if(e){var i=e[2].trim();if(/#$/.test(i)){var o=Hn(i,"#");this.options.pedantic?i=o.trim():o&&!/ $/.test(o)||(i=o.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:i}}},n.prototype.nptable=function(n){var e=this.rules.block.nptable.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(i.header.length===i.align.length){var o,c=i.align.length;for(o=0;o ?/gm,"");return{type:"blockquote",raw:e[0],text:i}}},n.prototype.list=function(n){var e=this.rules.block.list.exec(n);if(e){var i,o,c,a,t,f,u,r,d=e[0],p=e[2],g=p.length>1,s={type:"list",raw:d,ordered:g,start:g?+p.slice(0,-1):"",loose:!1,items:[]},v=e[0].match(this.rules.block.item),l=!1,_=v.length;c=this.rules.block.listItemStart.exec(v[0]);for(var h=0;h<_;h++){if(d=i=v[h],h!==_-1){if(a=this.rules.block.listItemStart.exec(v[h+1]),this.options.pedantic?a[1].length>c[1].length:a[1].length>c[0].length||a[1].length>3){v.splice(h,2,v[h]+"\n"+v[h+1]),h--,_--;continue}(!this.options.pedantic||this.options.smartLists?a[2][a[2].length-1]!==p[p.length-1]:g===(1===a[2].length))&&(t=v.slice(h+1).join("\n"),s.raw=s.raw.substring(0,s.raw.length-t.length),h=_-1),c=a}o=i.length,~(i=i.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=i.length,i=this.options.pedantic?i.replace(/^ {1,4}/gm,""):i.replace(new RegExp("^ {1,"+o+"}","gm"),"")),f=l||/\n\n(?!\s*$)/.test(i),h!==_-1&&(l="\n"===i.charAt(i.length-1),f||(f=l)),f&&(s.loose=!0),this.options.gfm&&(r=void 0,(u=/^\[[ xX]\] /.test(i))&&(r=" "!==i[1],i=i.replace(/^\[[ xX]\] +/,""))),s.items.push({type:"list_item",raw:d,task:u,checked:r,loose:f,text:i})}return s}},n.prototype.html=function(n){var e=this.rules.block.html.exec(n);if(e)return{type:this.options.sanitize?"paragraph":"html",raw:e[0],pre:!this.options.sanitizer&&("pre"===e[1]||"script"===e[1]||"style"===e[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Bn(e[0]):e[0]}},n.prototype.def=function(n){var e=this.rules.block.def.exec(n);if(e)return e[3]&&(e[3]=e[3].substring(1,e[3].length-1)),{tag:e[1].toLowerCase().replace(/\s+/g," "),raw:e[0],href:e[2],title:e[3]}},n.prototype.table=function(n){var e=this.rules.block.table.exec(n);if(e){var i={type:"table",header:Un(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[]};if(i.header.length===i.align.length){i.raw=e[0];var o,c=i.align.length;for(o=0;o/i.test(o[0])&&(e=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:o[0],inLink:e,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):Bn(o[0]):o[0]}},n.prototype.link=function(n){var e=this.rules.inline.link.exec(n);if(e){var i=e[2].trim();if(!this.options.pedantic&&/^$/.test(i))return;var o=Hn(i.slice(0,-1),"\\");if((i.length-o.length)%2==0)return}else{var c=Gn(e[2],"()");if(c>-1){var a=(0===e[0].indexOf("!")?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,a).trim(),e[3]=""}}var t=e[2],f="";if(this.options.pedantic){var u=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(t);u&&(t=u[1],f=u[3])}else f=e[3]?e[3].slice(1,-1):"";return t=t.trim(),/^$/.test(i)?t.slice(1):t.slice(1,-1)),Zn(e,{href:t?t.replace(this.rules.inline._escapes,"$1"):t,title:f?f.replace(this.rules.inline._escapes,"$1"):f},e[0])}},n.prototype.reflink=function(n,e){var i;if((i=this.rules.inline.reflink.exec(n))||(i=this.rules.inline.nolink.exec(n))){var o=(i[2]||i[1]).replace(/\s+/g," ");if(!(o=e[o.toLowerCase()])||!o.href){var c=i[0].charAt(0);return{type:"text",raw:c,text:c}}return Zn(i,o,i[0])}},n.prototype.strong=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.strong.middle.exec(e.slice(0,o.index+3)))return{type:"strong",raw:n.slice(0,c[0].length),text:n.slice(2,c[0].length-2)}}},n.prototype.em=function(n,e,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(n);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){e=e.slice(-1*n.length);var c,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(e));)if(c=this.rules.inline.em.middle.exec(e.slice(0,o.index+2)))return{type:"em",raw:n.slice(0,c[0].length),text:n.slice(1,c[0].length-1)}}},n.prototype.codespan=function(n){var e=this.rules.inline.code.exec(n);if(e){var i=e[2].replace(/\n/g," "),o=/[^ ]/.test(i),c=/^ /.test(i)&&/ $/.test(i);return o&&c&&(i=i.substring(1,i.length-1)),i=Bn(i,!0),{type:"codespan",raw:e[0],text:i}}},n.prototype.br=function(n){var e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}},n.prototype.del=function(n){var e=this.rules.inline.del.exec(n);if(e)return{type:"del",raw:e[0],text:e[2]}},n.prototype.autolink=function(n,e){var i,o,c=this.rules.inline.autolink.exec(n);if(c)return o="@"===c[2]?"mailto:"+(i=Bn(this.options.mangle?e(c[1]):c[1])):i=Bn(c[1]),{type:"link",raw:c[0],text:i,href:o,tokens:[{type:"text",raw:i,text:i}]}},n.prototype.url=function(n,e){var i;if(i=this.rules.inline.url.exec(n)){var o,c;if("@"===i[2])c="mailto:"+(o=Bn(this.options.mangle?e(i[0]):i[0]));else{var a;do{a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0]}while(a!==i[0]);o=Bn(i[0]),c="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:c,tokens:[{type:"text",raw:o,text:o}]}}},n.prototype.inlineText=function(n,e,i){var o,c=this.rules.inline.text.exec(n);if(c)return o=e?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(c[0]):Bn(c[0]):c[0]:Bn(this.options.smartypants?i(c[0]):c[0]),{type:"text",raw:c[0],text:o}},n}(),Vn={exec:function(){}},Xn=function(n,e){n=n.source||n,e=e||"";var i={replace:function(e,o){return o=(o=o.source||o).replace(Tn,"$1"),n=n.replace(e,o),i},getRegex:function(){return new RegExp(n,e)}};return i},Wn=Nn,Kn={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Vn,table:Vn,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Kn.def=Xn(Kn.def).replace("label",Kn._label).replace("title",Kn._title).getRegex(),Kn.bullet=/(?:[*+-]|\d{1,9}[.)])/,Kn.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Kn.item=Xn(Kn.item,"gm").replace(/bull/g,Kn.bullet).getRegex(),Kn.listItemStart=Xn(/^( *)(bull)/).replace("bull",Kn.bullet).getRegex(),Kn.list=Xn(Kn.list).replace(/bull/g,Kn.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Kn.def.source+")").getRegex(),Kn._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Kn._comment=/|$)/,Kn.html=Xn(Kn.html,"i").replace("comment",Kn._comment).replace("tag",Kn._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Kn.paragraph=Xn(Kn._paragraph).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.blockquote=Xn(Kn.blockquote).replace("paragraph",Kn.paragraph).getRegex(),Kn.normal=Wn({},Kn),Kn.gfm=Wn({},Kn.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Kn.gfm.nptable=Xn(Kn.gfm.nptable).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.gfm.table=Xn(Kn.gfm.table).replace("hr",Kn.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Kn._tag).getRegex(),Kn.pedantic=Wn({},Kn.normal,{html:Xn("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Kn._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Vn,paragraph:Xn(Kn.normal._paragraph).replace("hr",Kn.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Kn.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Jn={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Vn,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Vn,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};Jn.punctuation=Xn(Jn.punctuation).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Jn._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Jn._comment=Xn(Kn._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Jn.em.start=Xn(Jn.em.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.middle=Xn(Jn.em.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.em.endAst=Xn(Jn.em.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.em.endUnd=Xn(Jn.em.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.start=Xn(Jn.strong.start).replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.middle=Xn(Jn.strong.middle).replace(/punctuation/g,Jn._punctuation).replace(/overlapSkip/g,Jn._overlapSkip).getRegex(),Jn.strong.endAst=Xn(Jn.strong.endAst,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.strong.endUnd=Xn(Jn.strong.endUnd,"g").replace(/punctuation/g,Jn._punctuation).getRegex(),Jn.blockSkip=Xn(Jn._blockSkip,"g").getRegex(),Jn.overlapSkip=Xn(Jn._overlapSkip,"g").getRegex(),Jn._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Jn._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Jn._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Jn.autolink=Xn(Jn.autolink).replace("scheme",Jn._scheme).replace("email",Jn._email).getRegex(),Jn._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Jn.tag=Xn(Jn.tag).replace("comment",Jn._comment).replace("attribute",Jn._attribute).getRegex(),Jn._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Jn._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Jn._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Jn.link=Xn(Jn.link).replace("label",Jn._label).replace("href",Jn._href).replace("title",Jn._title).getRegex(),Jn.reflink=Xn(Jn.reflink).replace("label",Jn._label).getRegex(),Jn.reflinkSearch=Xn(Jn.reflinkSearch,"g").replace("reflink",Jn.reflink).replace("nolink",Jn.nolink).getRegex(),Jn.normal=Wn({},Jn),Jn.pedantic=Wn({},Jn.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Xn(/^!?\[(label)\]\((.*?)\)/).replace("label",Jn._label).getRegex(),reflink:Xn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Jn._label).getRegex()}),Jn.gfm=Wn({},Jn.normal,{escape:Xn(Jn.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\1;)1&e&&(i+=n),e>>=1,n+=n;return i+n};function ce(n){return n.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")}function ae(n){var e,i,o="",c=n.length;for(e=0;e.5&&(i="x"+i.toString(16)),o+="&#"+i+";";return o}var te=function(){function n(n){this.tokens=[],this.tokens.links=Object.create(null),this.options=n||ne,this.options.tokenizer=this.options.tokenizer||new Yn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var e={block:ee.normal,inline:ie.normal};this.options.pedantic?(e.block=ee.pedantic,e.inline=ie.pedantic):this.options.gfm&&(e.block=ee.gfm,this.options.breaks?e.inline=ie.breaks:e.inline=ie.gfm),this.tokenizer.rules=e}var e={rules:{configurable:!0}};return e.rules.get=function(){return{block:ee,inline:ie}},n.lex=function(e,i){return new n(i).lex(e)},n.lexInline=function(e,i){return new n(i).inlineTokens(e)},n.prototype.lex=function(n){return n=n.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.blockTokens(n,this.tokens,!0),this.inline(this.tokens),this.tokens},n.prototype.blockTokens=function(n,e,i){var o,c,a,t;for(void 0===e&&(e=[]),void 0===i&&(i=!0),this.options.pedantic&&(n=n.replace(/^ +$/gm,""));n;)if(o=this.tokenizer.space(n))n=n.substring(o.raw.length),o.type&&e.push(o);else if(o=this.tokenizer.code(n,e))n=n.substring(o.raw.length),o.type?e.push(o):((t=e[e.length-1]).raw+="\n"+o.raw,t.text+="\n"+o.text);else if(o=this.tokenizer.fences(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.heading(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.nptable(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.hr(n))n=n.substring(o.raw.length),e.push(o);else if(o=this.tokenizer.blockquote(n))n=n.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],i),e.push(o);else if(o=this.tokenizer.list(n)){for(n=n.substring(o.raw.length),a=o.items.length,c=0;c0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(u));)r.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(u));)u=u.slice(0,a.index)+"["+oe("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;n;)if(t||(f=""),t=!1,c=this.tokenizer.escape(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.tag(n,i,o))n=n.substring(c.raw.length),i=c.inLink,o=c.inRawBlock,e.push(c);else if(c=this.tokenizer.link(n))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.reflink(n,this.tokens.links))n=n.substring(c.raw.length),"link"===c.type&&(c.tokens=this.inlineTokens(c.text,[],!0,o)),e.push(c);else if(c=this.tokenizer.strong(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.em(n,u,f))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.codespan(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.br(n))n=n.substring(c.raw.length),e.push(c);else if(c=this.tokenizer.del(n))n=n.substring(c.raw.length),c.tokens=this.inlineTokens(c.text,[],i,o),e.push(c);else if(c=this.tokenizer.autolink(n,ae))n=n.substring(c.raw.length),e.push(c);else if(i||!(c=this.tokenizer.url(n,ae))){if(c=this.tokenizer.inlineText(n,o,ce))n=n.substring(c.raw.length),f=c.raw.slice(-1),t=!0,e.push(c);else if(n){var d="Infinite loop on byte: "+n.charCodeAt(0);if(this.options.silent){console.error(d);break}throw new Error(d)}}else n=n.substring(c.raw.length),e.push(c);return e},Object.defineProperties(n,e),n}(),fe=wn.defaults,ue=function(n,e,i){if(n){var o;try{o=decodeURIComponent($n(i)).replace(On,"").toLowerCase()}catch(n){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}e&&!Rn.test(i)&&(i=function(n,e){jn[" "+n]||(Ln.test(n)?jn[" "+n]=n+"/":jn[" "+n]=Pn(n,"/",!0));var i=-1===(n=jn[" "+n]).indexOf(":");return"//"===e.substring(0,2)?i?e:n.replace(Cn,"$1")+e:"/"===e.charAt(0)?i?e:n.replace(Fn,"$1")+e:n+e}(e,i));try{i=encodeURI(i).replace(/%25/g,"%")}catch(n){return null}return i},re=qn,de=function(){function n(n){this.options=n||fe}return n.prototype.code=function(n,e,i){var o=(e||"").match(/\S*/)[0];if(this.options.highlight){var c=this.options.highlight(n,o);null!=c&&c!==n&&(i=!0,n=c)}return n=n.replace(/\n$/,"")+"\n",o?'
    '+(i?n:re(n,!0))+"
    \n":"
    "+(i?n:re(n,!0))+"
    \n"},n.prototype.blockquote=function(n){return"
    \n"+n+"
    \n"},n.prototype.html=function(n){return n},n.prototype.heading=function(n,e,i,o){return this.options.headerIds?"'+n+"\n":""+n+"\n"},n.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},n.prototype.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+(e&&1!==i?' start="'+i+'"':"")+">\n"+n+"\n"},n.prototype.listitem=function(n){return"
  • "+n+"
  • \n"},n.prototype.checkbox=function(n){return" "},n.prototype.paragraph=function(n){return"

    "+n+"

    \n"},n.prototype.table=function(n,e){return e&&(e=""+e+""),"\n\n"+n+"\n"+e+"
    \n"},n.prototype.tablerow=function(n){return"\n"+n+"\n"},n.prototype.tablecell=function(n,e){var i=e.header?"th":"td";return(e.align?"<"+i+' align="'+e.align+'">':"<"+i+">")+n+"\n"},n.prototype.strong=function(n){return""+n+""},n.prototype.em=function(n){return""+n+""},n.prototype.codespan=function(n){return""+n+""},n.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},n.prototype.del=function(n){return""+n+""},n.prototype.link=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o='"+i+""},n.prototype.image=function(n,e,i){if(null===(n=ue(this.options.sanitize,this.options.baseUrl,n)))return i;var o=''+i+'":">")},n.prototype.text=function(n){return n},n}(),pe=function(){function n(){}return n.prototype.strong=function(n){return n},n.prototype.em=function(n){return n},n.prototype.codespan=function(n){return n},n.prototype.del=function(n){return n},n.prototype.html=function(n){return n},n.prototype.text=function(n){return n},n.prototype.link=function(n,e,i){return""+i},n.prototype.image=function(n,e,i){return""+i},n.prototype.br=function(){return""},n}(),ge=function(){function n(){this.seen={}}return n.prototype.serialize=function(n){return n.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},n.prototype.getNextSafeSlug=function(n,e){var i=n,o=0;if(this.seen.hasOwnProperty(i)){o=this.seen[n];do{i=n+"-"+ ++o}while(this.seen.hasOwnProperty(i))}return e||(this.seen[n]=o,this.seen[i]=0),i},n.prototype.slug=function(n,e){void 0===e&&(e={});var i=this.serialize(n);return this.getNextSafeSlug(i,e.dryrun)},n}(),se=wn.defaults,ve=In,le=function(){function n(n){this.options=n||se,this.options.renderer=this.options.renderer||new de,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new pe,this.slugger=new ge}return n.parse=function(e,i){return new n(i).parse(e)},n.parseInline=function(e,i){return new n(i).parseInline(e)},n.prototype.parse=function(n,e){void 0===e&&(e=!0);var i,o,c,a,t,f,u,r,d,p,g,s,v,l,_,h,m,b,w="",k=n.length;for(i=0;i0&&"text"===_.tokens[0].type?(_.tokens[0].text=b+" "+_.tokens[0].text,_.tokens[0].tokens&&_.tokens[0].tokens.length>0&&"text"===_.tokens[0].tokens[0].type&&(_.tokens[0].tokens[0].text=b+" "+_.tokens[0].tokens[0].text)):_.tokens.unshift({type:"text",text:b}):l+=b),l+=this.parse(_.tokens,v),d+=this.renderer.listitem(l,m,h);w+=this.renderer.list(d,g,s);continue;case"html":w+=this.renderer.html(p.text);continue;case"paragraph":w+=this.renderer.paragraph(this.parseInline(p.tokens));continue;case"text":for(d=p.tokens?this.parseInline(p.tokens):p.text;i+1An error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}}ye.options=ye.setOptions=function(n){return _e(ye.defaults,n),we(ye.defaults),ye},ye.getDefaults=be,ye.defaults=ke,ye.use=function(n){var e=_e({},n);if(n.renderer){var i=ye.defaults.renderer||new de,o=function(e){var o=i[e];i[e]=function(){for(var c=[],a=arguments.length;a--;)c[a]=arguments[a];var t=n.renderer[e].apply(i,c);return!1===t&&(t=o.apply(i,c)),t}};for(var c in n.renderer)o(c);e.renderer=i}if(n.tokenizer){var a=ye.defaults.tokenizer||new Yn,t=function(e){var i=a[f];a[f]=function(){for(var e=[],o=arguments.length;o--;)e[o]=arguments[o];var c=n.tokenizer[f].apply(a,e);return!1===c&&(c=i.apply(a,e)),c}};for(var f in n.tokenizer)t();e.tokenizer=a}if(n.walkTokens){var u=ye.defaults.walkTokens;e.walkTokens=function(e){n.walkTokens(e),u&&u(e)}}ye.setOptions(e)},ye.walkTokens=function(n,e){for(var i=0,o=n;iAn error occurred:

    "+me(n.message+"",!0)+"
    ";throw n}},ye.Parser=le,ye.parser=le.parse,ye.Renderer=de,ye.TextRenderer=pe,ye.Lexer=te,ye.lexer=te.lex,ye.Tokenizer=Yn,ye.Slugger=ge,ye.parse=ye;var xe=ye;function Se(n,e){if(void 0===e&&(e='
      {inner}
    '),!n||!n.length)return"";var i="";return n.forEach((function(n){var o=n.title.replace(/(<([^>]+)>)/g,"");i+='
  • '+n.title+"
  • ",n.children&&(i+=Se(n.children,e))})),e.replace("{inner}",i)}function Ae(n,e){return'

    '+e.slice(5).trim()+"

    "}function ze(n,e){var i=[],o={};return n.forEach((function(n){var c=n.level||1,a=c-1;c>e||(o[a]?o[a].children=(o[a].children||[]).concat(n):i.push(n),o[c]=n)})),i}var Ee={},$e=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;function Te(n){return n.toLowerCase()}function Oe(n){if("string"!=typeof n)return"";var e=n.trim().replace(/[A-Z]+/g,Te).replace(/<[^>]+>/g,"").replace($e,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),i=Ee[e];return i=o.call(Ee,e)?i+1:0,Ee[e]=i,i&&(e=e+"-"+i),e}Oe.clear=function(){Ee={}};var Re={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function je(n){void 0===n&&(n="");var e={};return n&&(n=n.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,(function(n,i,o){return-1===i.indexOf(":")?(e[i]=o&&o.replace(/"/g,"")||!0,""):n})).trim()),{str:n,config:e}}function Le(n){return void 0===n&&(n=""),n.replace(/(<\/?a.*?>)/gi,"")}var Ce=bn((function(n){var e=function(n){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,i=0,o={},c={manual:n.Prism&&n.Prism.manual,disableWorkerMessageHandler:n.Prism&&n.Prism.disableWorkerMessageHandler,util:{encode:function n(e){return e instanceof a?new a(e.type,n(e.content),e.alias):Array.isArray(e)?e.map(n):e.replace(/&/g,"&").replace(/=p.reach);x+=y.value.length,y=y.next){var S=y.value;if(e.length>n.length)return;if(!(S instanceof a)){var A,z=1;if(m){if(!(A=t(k,x,n,h))||A.index>=n.length)break;var E=A.index,$=A.index+A[0].length,T=x;for(T+=y.value.length;E>=T;)T+=(y=y.next).value.length;if(x=T-=y.value.length,y.value instanceof a)continue;for(var O=y;O!==e.tail&&(T<$||"string"==typeof O.value);O=O.next)z++,T+=O.value.length;z--,S=n.slice(x,T),A.index-=x}else if(!(A=t(k,0,S,h)))continue;E=A.index;var R=A[0],j=S.slice(0,E),L=S.slice(E+R.length),C=x+S.length;p&&C>p.reach&&(p.reach=C);var F=y.prev;if(j&&(F=r(e,F,j),x+=j.length),d(e,F,z),y=r(e,F,new a(g,_?c.tokenize(R,_):R,b,R)),L&&r(e,y,L),z>1){var P={cause:g+","+v,reach:C};f(n,e,i,y.prev,x,P),p&&P.reach>p.reach&&(p.reach=P.reach)}}}}}}function u(){var n={value:null,prev:null,next:null},e={value:null,prev:n,next:null};n.next=e,this.head=n,this.tail=e,this.length=0}function r(n,e,i){var o=e.next,c={value:i,prev:e,next:o};return e.next=c,o.prev=c,n.length++,c}function d(n,e,i){for(var o=e.next,c=0;c"+a.content+""},!n.document)return n.addEventListener?(c.disableWorkerMessageHandler||n.addEventListener("message",(function(e){var i=JSON.parse(e.data),o=i.language,a=i.code,t=i.immediateClose;n.postMessage(c.highlight(a,c.languages[o],o)),t&&n.close()}),!1),c):c;var p=c.util.currentScript();function g(){c.manual||c.highlightAll()}if(p&&(c.filename=p.src,p.hasAttribute("data-manual")&&(c.manual=!0)),!c.manual){var s=document.readyState;"loading"===s||"interactive"===s&&p&&p.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return c}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});n.exports&&(n.exports=e),void 0!==mn&&(mn.Prism=e),e.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},e.languages.markup.tag.inside["attr-value"].inside.entity=e.languages.markup.entity,e.languages.markup.doctype.inside["internal-subset"].inside=e.languages.markup,e.hooks.add("wrap",(function(n){"entity"===n.type&&(n.attributes.title=n.content.replace(/&/,"&"))})),Object.defineProperty(e.languages.markup.tag,"addInlined",{value:function(n,i){var o={};o["language-"+i]={pattern:/(^$)/i,lookbehind:!0,inside:e.languages[i]},o.cdata=/^$/i;var c={"included-cdata":{pattern://i,inside:o}};c["language-"+i]={pattern:/[\s\S]+/,inside:e.languages[i]};var a={};a[n]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return n})),"i"),lookbehind:!0,greedy:!0,inside:c},e.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(e.languages.markup.tag,"addAttribute",{value:function(n,i){e.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+n+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[i,"language-"+i],inside:e.languages[i]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),e.languages.html=e.languages.markup,e.languages.mathml=e.languages.markup,e.languages.svg=e.languages.markup,e.languages.xml=e.languages.extend("markup",{}),e.languages.ssml=e.languages.xml,e.languages.atom=e.languages.xml,e.languages.rss=e.languages.xml,function(n){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;n.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},n.languages.css.atrule.inside.rest=n.languages.css;var i=n.languages.markup;i&&(i.tag.addInlined("style","css"),i.tag.addAttribute("style","css"))}(e),e.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},e.languages.javascript=e.languages.extend("clike",{"class-name":[e.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),e.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,e.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:e.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:e.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:e.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:e.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:e.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),e.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:e.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),e.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),e.languages.markup&&(e.languages.markup.tag.addInlined("script","javascript"),e.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),e.languages.js=e.languages.javascript,function(){if(void 0!==e&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var n={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},i="data-src-status",o="loading",c="loaded",a="pre[data-src]:not(["+i+'="'+c+'"]):not(['+i+'="'+o+'"])';e.hooks.add("before-highlightall",(function(n){n.selector+=", "+a})),e.hooks.add("before-sanity-check",(function(t){var f=t.element;if(f.matches(a)){t.code="",f.setAttribute(i,o);var u=f.appendChild(document.createElement("CODE"));u.textContent="Loading…";var r=f.getAttribute("data-src"),d=t.language;if("none"===d){var p=(/\.(\w+)$/.exec(r)||[,"none"])[1];d=n[p]||p}e.util.setLanguage(u,d),e.util.setLanguage(f,d);var g=e.plugins.autoloader;g&&g.loadLanguages(d),function(n,o,a){var t=new XMLHttpRequest;t.open("GET",n,!0),t.onreadystatechange=function(){4==t.readyState&&(t.status<400&&t.responseText?function(n){f.setAttribute(i,c);var o=function(n){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(n||"");if(e){var i=Number(e[1]),o=e[2],c=e[3];return o?c?[i,Number(c)]:[i,void 0]:[i,i]}}(f.getAttribute("data-range"));if(o){var a=n.split(/\r\n?|\n/g),t=o[0],r=null==o[1]?a.length:o[1];t<0&&(t+=a.length),t=Math.max(0,Math.min(t-1,a.length)),r<0&&(r+=a.length),r=Math.max(0,Math.min(r,a.length)),n=a.slice(t,r).join("\n"),f.hasAttribute("data-start")||f.setAttribute("data-start",String(t+1))}u.textContent=n,e.highlightElement(u)}(t.responseText):t.status>=400?a("✖ Error "+t.status+" while fetching file: "+t.statusText):a("✖ Error: File does not exist or is empty"))},t.send(null)}(r,0,(function(n){f.setAttribute(i,"failed"),u.textContent=n}))}})),e.plugins.fileHighlight={highlight:function(n){for(var i,o=(n||document).querySelectorAll(a),c=0;i=o[c++];)e.highlightElement(i)}};var t=!1;e.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),e.plugins.fileHighlight.highlight.apply(this,arguments)}}}()}));!function(n){function e(n,e){return"___"+n.toUpperCase()+e+"___"}Object.defineProperties(n.languages["markup-templating"]={},{buildPlaceholders:{value:function(i,o,c,a){if(i.language===o){var t=i.tokenStack=[];i.code=i.code.replace(c,(function(n){if("function"==typeof a&&!a(n))return n;for(var c,f=t.length;-1!==i.code.indexOf(c=e(o,f));)++f;return t[f]=n,c})),i.grammar=n.languages.markup}}},tokenizePlaceholders:{value:function(i,o){if(i.language===o&&i.tokenStack){i.grammar=n.languages[o];var c=0,a=Object.keys(i.tokenStack);!function t(f){for(var u=0;u=a.length);u++){var r=f[u];if("string"==typeof r||r.content&&"string"==typeof r.content){var d=a[c],p=i.tokenStack[d],g="string"==typeof r?r:r.content,s=e(o,d),v=g.indexOf(s);if(v>-1){++c;var l=g.substring(0,v),_=new n.Token(o,n.tokenize(p,i.grammar),"language-"+o,p),h=g.substring(v+s.length),m=[];l&&m.push.apply(m,t([l])),m.push(_),h&&m.push.apply(m,t([h])),"string"==typeof r?f.splice.apply(f,[u,1].concat(m)):r.content=m}}else r.content&&t(r.content)}return f}(i.tokens)}}}})}(Prism);var Fe={},Pe={markdown:function(n){return{url:n}},mermaid:function(n){return{url:n}},iframe:function(n,e){return{html:'"}},video:function(n,e){return{html:'"}},audio:function(n,e){return{html:'"}},code:function(n,e){var i=n.match(/\.(\w+)$/);return"md"===(i=e||i&&i[1])&&(i="markdown"),{url:n,lang:i}}},qe=function(e,i){var o=this;this.config=e,this.router=i,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=e.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?e.externalLinkRel||"noopener":"",this.contentBase=i.getBasePath();var t,u=this._initRenderer();this.heading=u.heading;var r=e.markdown||{};f(r)?t=r(xe,u):(xe.setOptions(c(r,{renderer:c(u,r.renderer)})),t=xe),this._marked=t,this.compile=function(i){var c=!0,f=n((function(n){c=!1;var o="";return i?(o=a(i)?t(i):t.parser(i),o=e.noEmoji?o:function(n,e){return n.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,(function(n){return n.replace(/:/g,"__colon__")})).replace(//g,(function(n){return n.replace(/:/g,"__colon__")})).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,(function(n){return n.replace(/:/g,"__colon__")})).replace(/:([a-z0-9_\-+]+?):/g,(function(n,i){return function(n,e,i){var o=Re.data[e],c=n;return o&&(c=i&&/unicode/.test(o)?''+o.replace("unicode/","").replace(/\.png.*/,"").split("-").map((function(n){return"&#x"+n+";"})).join("‍").concat("︎")+"":''+e+''),c}(n,i,e)})).replace(/__colon__/g,":")}(o,e.nativeEmoji),Oe.clear(),o):i}))(i),u=o.router.parse().file;return c?o.toc=o.cacheTOC[u]:o.cacheTOC[u]=[].concat(o.toc),f}};qe.prototype.compileEmbed=function(n,e){var i,o=je(e),c=o.str,a=o.config;if(e=c,a.include){var t;if(R(n)||(n=q(this.contentBase,L(this.router.getCurrentPath()),n)),a.type&&(t=Pe[a.type]))(i=t.call(this,n,e)).type=a.type;else{var f="code";/\.(md|markdown)/.test(n)?f="markdown":/\.mmd/.test(n)?f="mermaid":/\.html?/.test(n)?f="iframe":/\.(mp4|ogg)/.test(n)?f="video":/\.mp3/.test(n)&&(f="audio"),(i=Pe[f].call(this,n,e)).type=f}return i.fragment=a.fragment,i}},qe.prototype._matchNotCompileLink=function(n){for(var e=this.config.noCompileLinks||[],i=0;i/g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore} --\x3e",""),f.title=Le(o),f.ignoreSubHeading=!0),/{docsify-ignore}/g.test(o)&&(o=o.replace("{docsify-ignore}",""),f.title=Le(o),f.ignoreSubHeading=!0),//g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),f.title=Le(o),f.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(o)&&(o=o.replace("{docsify-ignore-all}",""),f.title=Le(o),f.ignoreAllSubs=!0);var u=Oe(a.id||o),r=c.toURL(c.getCurrentPath(),{id:u});return f.slug=r,t.toc.push(f),"'+o+""},f.code=function(n){return n.renderer.code=function(n,e){void 0===e&&(e="markup");var i=Ce.languages[e]||Ce.languages.markup;return'
    '+Ce.highlight(n.replace(/@DOCSIFY_QM@/g,"`"),i,e)+"
    "}}({renderer:n}),f.link=function(n){var e=n.router,i=n.linkTarget,o=n.linkRel,c=n.compilerClass;return n.renderer.link=function(n,a,t){void 0===a&&(a="");var f=[],u=je(a),r=u.str,d=u.config;return i=d.target||i,o="_blank"===i?c.config.externalLinkRel||"noopener":"",a=r,R(n)||c._matchNotCompileLink(n)||d.ignore?(R(n)||"./"!==n.slice(0,2)||(n=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+n),f.push(0===n.indexOf("mailto:")?"":'target="'+i+'"'),f.push(0===n.indexOf("mailto:")?"":""!==o?' rel="'+o+'"':"")):(n===c.config.homepage&&(n="README"),n=e.toURL(n,null,e.getCurrentPath())),d.disabled&&(f.push("disabled"),n="javascript:void(0)"),d.class&&f.push('class="'+d.class+'"'),d.id&&f.push('id="'+d.id+'"'),a&&f.push('title="'+a+'"'),'"+t+""}}({renderer:n,router:c,linkTarget:i,linkRel:o,compilerClass:t}),f.paragraph=function(n){return n.renderer.paragraph=function(n){return/^!>/.test(n)?Ae("tip",n):/^\?>/.test(n)?Ae("warn",n):"

    "+n+"

    "}}({renderer:n}),f.image=function(n){var e=n.contentBase,i=n.router;return n.renderer.image=function(n,o,c){var a=n,t=[],f=je(o),u=f.str,r=f.config;if(o=u,r["no-zoom"]&&t.push("data-no-zoom"),o&&t.push('title="'+o+'"'),r.size){var d=r.size.split("x"),p=d[0],g=d[1];g?t.push('width="'+p+'" height="'+g+'"'):t.push('width="'+p+'"')}return r.class&&t.push('class="'+r.class+'"'),r.id&&t.push('id="'+r.id+'"'),R(n)||(a=q(e,L(i.getCurrentPath()),n)),t.length>0?''+c+'":''+c+'"}}({renderer:n,contentBase:a,router:c}),f.list=function(n){return n.renderer.list=function(n,e,i){var o=e?"ol":"ul";return"<"+o+" "+[/
  • /.test(n.split('class="task-list"')[0])?'class="task-list"':"",i&&i>1?'start="'+i+'"':""].join(" ").trim()+">"+n+""}}({renderer:n}),f.listitem=function(n){return n.renderer.listitem=function(n){return/^(]*>)/.test(n)?'
  • ":"
  • "+n+"
  • "}}({renderer:n}),n.origin=f,n},qe.prototype.sidebar=function(n,e){var i=this.toc,o=this.router.getCurrentPath(),c="";if(n)c=this.compile(n);else{for(var a=0;a{inner}"),this.cacheTree[o]=u}return c},qe.prototype.subSidebar=function(n){if(n){var e=this.router.getCurrentPath(),i=this.cacheTree,o=this.toc;o[0]&&o[0].ignoreAllSubs&&o.splice(0),o[0]&&1===o[0].level&&o.shift();for(var c=0;c *").filter((function(n){return a(n)}));tscript").filter((function(n){return!/template/.test(n.type)}))[0];if(!n)return!1;var e=n.innerText.trim();if(!e)return!1;new Function(e)()}(),"Vue"in window){var r=[],d=Object.keys(e.vueComponents||{});if(2===o&&d.length&&d.forEach((function(n){!window.Vue.options.components[n]&&window.Vue.component(n,e.vueComponents[n])})),!Ie&&e.vueGlobalOptions&&"function"==typeof e.vueGlobalOptions.data&&(Ie=e.vueGlobalOptions.data()),r.push.apply(r,Object.keys(e.vueMounts||{}).map((function(n){return[_(i,n),e.vueMounts[n]]})).filter((function(n){var e=n[0];return n[1],e}))),e.vueGlobalOptions||d.length){var p=/{{2}[^{}]*}{2}/,g=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;r.push.apply(r,h(".markdown-section > *").filter((function(n){return!r.some((function(e){var i=e[0];return e[1],i===n}))})).filter((function(n){return n.tagName.toLowerCase()in(e.vueComponents||{})||n.querySelector(d.join(",")||null)||p.test(n.outerHTML)||g.test(n.outerHTML)})).map((function(n){var i=c({},e.vueGlobalOptions||{});return Ie&&(i.data=function(){return Ie}),[n,i]})))}for(var s=0,v=r;s-1&&"_coverpage";else{var u=i[f];t=!0===u?"_coverpage":u}var r=Boolean(t)&&this.config.onlyCover;return t?(t=this.router.getFile(a+t),this.coverIsHTML=/\.html$/g.test(t),J(t+O(c,["id"]),!1,o).then((function(e){return n._renderCover(e,r)}))):this._renderCover(null,r),r}},e.prototype.$fetch=function(n,e){var i=this;void 0===n&&(n=t),void 0===e&&(e=this.$resetEvents.bind(this));var o=function(){i.callHook("doneEach"),n()};this._fetchCover()?o():this._fetch((function(){e(),o()}))},e.prototype._fetchFallbackPage=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.requestHeaders,u=a.fallbackLanguages,r=a.loadSidebar;if(!u)return!1;var d=n.split("/")[1];if(-1===u.indexOf(d))return!1;var p=this.router.getFile(n.replace(new RegExp("^/"+d),""));return i(p+e,0,f).then((function(i,a){return c._renderMain(i,a,c._loadSideAndNav(n,e,r,o))}),(function(){return c._fetch404(n,e,o)})),!0},e.prototype._fetch404=function(n,e,o){var c=this;void 0===o&&(o=t);var a=this.config,f=a.loadSidebar,u=a.requestHeaders,r=a.notFoundPage,d=this._loadSideAndNav(n,e,f,o);if(r){var p=function(n,e){var i,o,c=e.notFoundPage,a="_404"+(e.ext||".md");switch(typeof c){case"boolean":o=a;break;case"string":o=c;break;case"object":o=(i=Object.keys(c).sort((function(n,e){return e.length-n.length})).filter((function(e){return n.match(new RegExp("^"+e))}))[0])&&c[i]||a}return o}(n,this.config);return i(this.router.getFile(p),0,u).then((function(n,e){return c._renderMain(n,e,d)}),(function(){return c._renderMain(null,{},d)})),!0}return this._renderMain(null,{},d),!1},e.prototype.initFetch=function(){var n=this,e=this.config.loadSidebar;if(this.rendered){var i=on(this.router,".sidebar-nav",!0,!0);e&&i&&(i.parentNode.innerHTML+=window.__SUB_SIDEBAR__),this._bindEventOnRendered(i),this.$resetEvents(),this.callHook("doneEach"),this.callHook("ready")}else this.$fetch((function(e){return n.callHook("ready")}))},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.$resetEvents=function(n){var e,i=this,o=this.config.auto2top;"history"!==n&&(i.route.query.id&&function(n,e){if(e){var i,o,c=rn().topMargin,a=_("#"+e);a&&(i=a,void 0===(o=c)&&(o=0),gn&&gn.stop(),sn=!1,gn=new fn({start:window.pageYOffset,end:Math.round(i.getBoundingClientRect().top)+window.pageYOffset-o,duration:500}).on("tick",(function(n){return window.scrollTo(0,n)})).on("done",(function(){sn=!0,gn=null})).begin());var t=dn[_n(n,e)],f=_(g(".sidebar"),"li.active");f&&f.classList.remove("active"),t&&t.classList.add("active")}}(i.route.path,i.route.query.id),"navigate"===n&&o&&(void 0===(e=o)&&(e=0),hn.scrollTop=!0===e?0:Number(e))),this.config.loadNavbar&&on(this.router,"nav")},e.prototype.initEvent=function(){var n,e;n="button.sidebar-toggle",this.router,e=function(n){return v.classList.toggle("close")},null!=(n=g(n))&&(k(n,"click",(function(n){n.stopPropagation(),e()})),r&&k(v,"click",(function(n){return v.classList.contains("close")&&e()}))),function(n){null!=(n=g(n))&&k(n,"click",(function(n){var e=n.target;"A"===e.nodeName&&e.nextSibling&&e.nextSibling.classList&&e.nextSibling.classList.contains("app-sub-sidebar")&&x(e.parentNode,"collapse")}))}(".sidebar",this.router),this.config.coverpage?!r&&k("scroll",en):v.classList.add("sticky")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype._renderTo=function(n,e,i){var o=g(n);o&&(o[i?"outerHTML":"innerHTML"]=e)},e.prototype._renderSidebar=function(n){var e=this.config,i=e.maxLevel,o=e.subMaxLevel,c=e.loadSidebar;if(e.hideSidebar)return[document.querySelector("aside.sidebar"),document.querySelector("button.sidebar-toggle")].filter((function(n){return!!n})).forEach((function(n){return n.parentNode.removeChild(n)})),document.querySelector("section.content").style.right="unset",document.querySelector("section.content").style.left="unset",document.querySelector("section.content").style.position="relative",document.querySelector("section.content").style.width="100%",null;this._renderTo(".sidebar-nav",this.compiler.sidebar(n,i));var a=on(this.router,".sidebar-nav",!0,!0);c&&a?a.parentNode.innerHTML+=this.compiler.subSidebar(o)||"":this.compiler.subSidebar(),this._bindEventOnRendered(a)},e.prototype._bindEventOnRendered=function(n){var e=this.config.autoHeader;if(function(n){var e=_(".cover.show");vn=e?e.offsetHeight:0;var i=g(".sidebar"),o=[];null!=i&&(o=h(i,"li"));for(var c=0,a=o.length;c\n'+i+"\n"}]).links={}:(o=[{type:"html",text:i}]).links={};e({token:n,embedToken:o}),++t>=a&&e({})}}(i);i.embed.url?J(i.embed.url).then(f):f(i.embed.html)}}({compile:u,embedTokens:d,fetch:a},(function(n){var i=n.embedToken,a=n.token;if(a){var t=a.index;s.forEach((function(n){t>n.start&&(t+=n.length)})),c(g,i.links),r=r.slice(0,t).concat(i,r.slice(t+1)),s.push({start:t,length:i.length-1})}else De[o]=r.concat(),r.links=De[o].links=g,e(r)}))}({compiler:o.compiler,raw:a},(function(n){t=o.compiler.compile(n),f()}))}))},e.prototype._renderCover=function(n,e){var i=g(".cover");if(x(g("main"),e?"add":"remove","hidden"),n){x(i,"add","show");var o=this.coverIsHTML?n:this.compiler.cover(n),c=o.trim().match('

    ([^<]*?)

    $');if(c){if("color"===c[2])i.style.background=c[1]+(c[3]||"");else{var a=c[1];x(i,"add","has-mask"),R(c[1])||(a=q(this.router.getBasePath(),c[1])),i.style.backgroundImage="url("+a+")",i.style.backgroundSize="cover",i.style.backgroundPosition="center center"}o=o.replace(c[0],"")}this._renderTo(".cover-main",o),en()}else x(i,"remove","show")},e.prototype._updateRender=function(){!function(n){var e=g(".app-name-link"),i=n.config.nameLink,o=n.route.path;if(e)if(a(n.config.nameLink))e.setAttribute("href",i);else if("object"==typeof i){var c=Object.keys(i).filter((function(n){return o.indexOf(n)>-1}))[0];e.setAttribute("href",i[c])}}(this)},e.prototype.initRender=function(){var n=this.config;this.compiler=new qe(n,this.router),window.__current_docsify_compiler__=this.compiler;var e,i,o,c,a=n.el||"#app",t=_("nav")||m("nav"),f=_(a),u="",d=v;if(f){if(n.repo&&(u+=(i=n.repo,o=n.cornerExternalLinkTarget,i?(/\/\//.test(i)||(i="https://github.com/"+i),''):"")),n.coverpage&&(u+=(e=", 100%, 85%",'
    \x3c!--cover--\x3e
    ')),n.logo){var p=/^data:image/.test(n.logo),g=/(?:http[s]?:)?\/\//.test(n.logo),b=/^\./.test(n.logo);p||g||b||(n.logo=q(this.router.getBasePath(),n.logo))}u+=function(n){var e=n.name?n.name:"";return'
    '}(n),this._renderTo(f,u,!0)}else this.rendered=!0;n.mergeNavbar&&r?d=_(".sidebar"):(t.classList.add("app-nav"),n.repo||t.classList.add("no-badge")),n.loadNavbar&&w(d,t),n.themeColor&&(s.head.appendChild(m("div",(c=n.themeColor,"")).firstElementChild),function(n){if(!(window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)"))){var e=h("style:not(.inserted),link");[].forEach.call(e,(function(e){if("STYLE"===e.nodeName)Q(e,n);else if("LINK"===e.nodeName){var i=e.getAttribute("href");if(!/\.css$/.test(i))return;J(i).then((function(e){var i=m("style",e);l.appendChild(i),Q(i,n)}))}}))}}(n.themeColor)),this._updateRender(),x(v,"ready")},e}(n)}(function(n){return function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.routes=function(){return this.config.routes||{}},e.prototype.matchVirtualRoute=function(n){var e=this.routes(),i=Object.keys(e),o=function(){return null};function c(){var a=i.shift();if(!a)return o(null);var t=function(n){var e=("^",0===n.indexOf("^")?n:"^"+n);return z(e,"$")?e:e+"$"}(a),f=n.match(t);if(!f)return c();var u,r=e[a];if("string"==typeof r)return o(r);if("function"==typeof r){var d=r,p=(u=function(){return null},[function(n){u(n)},function(n){u=n}]),g=p[0];return(0,p[1])((function(n){return"string"==typeof n?o(n):!1===n?o(null):c()})),d.length<=2?g(d(n,f)):d(n,f,g)}return c()}return{then:function(n){o=n,c()}}},e}(n)}((Ue=function(n){function e(){n.apply(this,arguments)}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.initLifecycle=function(){var n=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach((function(e){var i=n._hooks[e]=[];n._lifecycle[e]=function(n){return i.push(n)}}))},e.prototype.callHook=function(n,e,i){void 0===i&&(i=t);var o=this._hooks[n],c=this.config.catchPluginErrors,a=function(n){var t=o[n];if(n>=o.length)i(e);else if("function"==typeof t){var f="Docsify plugin error";if(2===t.length)try{t(e,(function(i){e=i,a(n+1)}))}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}else try{var u=t(e);e=void 0===u?e:u,a(n+1)}catch(e){if(!c)throw e;console.error(f,e),a(n+1)}}else a(n+1)};a(0)},e}(Object),function(n){function e(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];n.apply(this,e),this.route={}}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),v.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var n,e=this,i=this.config;n="history"===(i.routerMode||"hash")&&d?new Z(i):new G(i),this.router=n,this.updateRender(),Y=this.route,n.onchange((function(n){e.updateRender(),e._updateRender(),Y.path!==e.route.path?(e.$fetch(t,e.$resetEvents.bind(e,n.source)),Y=e.route):e.$resetEvents(n.source)}))},e}(Ue)))))));window.Docsify={util:Be,dom:A,get:J,slugify:Oe,version:"4.13.1"},window.DocsifyCompiler=qe,window.marked=xe,window.Prism=Ce,S((function(n){return new Ge}))}()},895:()=>{var n;n={100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"},window&&window.console&&console.info("Docsify emoji plugin has been deprecated as of v4.13"),window.emojify=function(e,i){return!1===Object.prototype.hasOwnProperty.call(n,i)?e:''+i+''}},460:()=>{!function(){function n(n){return n.replace(//,"").replace(/{docsify-ignore}/,"").replace(//,"").replace(/{docsify-ignore-all}/,"").trim()}var e={},i="docsify.search.expires",o="docsify.search.index";function c(n){var e={"&":"&","<":"<",">":">",'"':""","'":"'"};return String(n).replace(/[&<>"']/g,(function(n){return e[n]}))}function a(n){return n.text||"table"!==n.type||(n.cells.unshift(n.header),n.text=n.cells.map((function(n){return n.join(" | ")})).join(" |\n ")),n.text}function t(n){return n.text||"list"!==n.type||(n.text=n.raw),n.text}function f(n){return n&&n.normalize?n.normalize("NFD").replace(/[\u0300-\u036f]/g,""):n}function u(f,u){var r="auto"===f.paths,d=r?function(n){var e=[];return Docsify.dom.findAll(".sidebar-nav a:not(.section-link):not([data-nosearch])").forEach((function(i){var o=i.href,c=i.getAttribute("href"),a=n.parse(o).path;a&&-1===e.indexOf(a)&&!Docsify.util.isAbsolutePath(c)&&e.push(a)})),e}(u.router):f.paths,p="";if(d.length&&r&&f.pathNamespaces){var g=d[0];if(Array.isArray(f.pathNamespaces))p=f.pathNamespaces.filter((function(n){return g.slice(0,n.length)===n}))[0]||p;else if(f.pathNamespaces instanceof RegExp){var s=g.match(f.pathNamespaces);s&&(p=s[0])}var v=-1===d.indexOf(p+"/"),l=-1===d.indexOf(p+"/README");v&&l&&d.unshift(p+"/")}else-1===d.indexOf("/")&&-1===d.indexOf("/README")&&d.unshift("/");var _,h=((_=f.namespace)?i+"/"+_:i)+p,m=function(n){return n?o+"/"+n:o}(f.namespace)+p,b=localStorage.getItem(h)=0||o>=0){t+=e>=0?3:o>=0?2:0,o<0&&(o=0);var a,s=0;s=0==(a=o<11?0:o-10)?70:o+n.length+60,g&&s>g.length&&(s=g.length);var v=d&&"..."+d.substring(a,s).replace(i,(function(n){return''+n+""}))+"...";u+=v}})),t>0)){var v={title:r,content:g?u:"",url:s,score:t};i.push(v)}},u=0;u\n

    '+n.title+"

    \n

    "+n.content+"

    \n
    \n"})),o.classList.add("show"),a.classList.add("show"),o.innerHTML=g||'

    '+d+"

    ",r.hideOtherSidebarContent&&(t&&t.classList.add("hide"),u&&u.classList.add("hide"))}function g(n){r=n}var s={placeholder:"Type to search",noData:"No Results!",paths:"auto",depth:2,maxAge:864e5,hideOtherSidebarContent:!1,namespace:void 0,pathNamespaces:void 0};$docsify.plugins=[].concat((function(n,e){var i=Docsify.util,o=e.config.search||s;Array.isArray(o)?s.paths=o:"object"==typeof o&&(s.paths=Array.isArray(o.paths)?o.paths:"auto",s.maxAge=i.isPrimitive(o.maxAge)?o.maxAge:s.maxAge,s.placeholder=o.placeholder||s.placeholder,s.noData=o.noData||s.noData,s.depth=o.depth||s.depth,s.hideOtherSidebarContent=o.hideOtherSidebarContent||s.hideOtherSidebarContent,s.namespace=o.namespace||s.namespace,s.pathNamespaces=o.pathNamespaces||s.pathNamespaces);var c="auto"===s.paths;n.mounted((function(n){(function(n,e){var i,o,c,a,t=e.router.parse().query.s;g(n),Docsify.dom.style("\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}"),function(n){void 0===n&&(n="");var e='
    \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n ',i=Docsify.dom.create("div",e),o=Docsify.dom.find("aside");Docsify.dom.toggleClass(i,"search"),Docsify.dom.before(o,i)}(t),o=Docsify.dom.find("div.search"),c=Docsify.dom.find(o,"input"),a=Docsify.dom.find(o,".input-wrap"),Docsify.dom.on(o,"click",(function(n){return-1===["A","H2","P","EM"].indexOf(n.target.tagName)&&n.stopPropagation()})),Docsify.dom.on(c,"input",(function(n){clearTimeout(i),i=setTimeout((function(e){return p(n.target.value.trim())}),100)})),Docsify.dom.on(a,"click",(function(n){"INPUT"!==n.target.tagName&&(c.value="",p())})),t&&setTimeout((function(n){return p(t)}),500)})(s,e),!c&&u(s,e)})),n.doneEach((function(n){(function(n,e){g(n),function(n,e){var i=Docsify.dom.getNode('.search input[type="search"]');if(i)if("string"==typeof n)i.placeholder=n;else{var o=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];i.placeholder=n[o]}}(n.placeholder,e.route.path),function(n,e){if("string"==typeof n)d=n;else{var i=Object.keys(n).filter((function(n){return e.indexOf(n)>-1}))[0];d=n[i]}}(n.noData,e.route.path)})(s,e),c&&u(s,e)}))}),$docsify.plugins)}()},874:()=>{!function(n){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",i={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},o={bash:i,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};n.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:o},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:i}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:o},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:o.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:o.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},i.inside=n.languages.bash;for(var c=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=o.variable[1].inside,t=0;t{Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]},277:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},345:()=>{!function(n){var e=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;n.languages.protobuf=n.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),n.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:e}},builtin:e,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)}},e={};function i(o){var c=e[o];if(void 0!==c)return c.exports;var a=e[o]={exports:{}};return n[o](a,a.exports,i),a.exports}i.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return i.d(e,{a:e}),e},i.d=(n,e)=>{for(var o in e)i.o(e,o)&&!i.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:e[o]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),i.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),(()=>{"use strict";i(807),i(895),i(460),i(46),i(277),i(874),i(345)})()})(); \ No newline at end of file From 336d1146790b46acd974d3ee292c0089a62e34d3 Mon Sep 17 00:00:00 2001 From: Maxim Babichev Date: Sun, 3 Sep 2023 00:42:06 +0300 Subject: [PATCH 52/74] fix title --- docs/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index b4d13e93..dd8199f4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ - Gripmock + GripMock @@ -14,7 +14,7 @@