From 8599b21d90cbebe5db3d68e4187238748c53afeb Mon Sep 17 00:00:00 2001 From: edoriggio Date: Tue, 5 Mar 2024 19:55:23 +0100 Subject: [PATCH 01/60] created driver for mongo --- .github/workflows/deploy-backend.yml | 2 +- app/internal/elastic/elastic.go | 26 +++++++------- app/internal/embedding/embedding.go | 3 +- app/internal/embedding/pipeline.go | 1 - app/internal/embedding/preprocessing.go | 3 +- app/internal/helpers/certificate.go | 12 +++++++ app/internal/helpers/config.go | 1 - app/internal/mongo/pipeline.go | 3 -- app/internal/mongodb/mongo.go | 26 ++++++++++++++ app/internal/routes/retrieve.go | 1 - app/internal/routes/routes.go | 1 - app/internal/structs/config.go | 33 ++++++++++++------ app/internal/structs/embedding-request.go | 3 +- app/internal/structs/embeddings.go | 1 - config/template.config.yml | 13 +++++-- go.mod | 12 +++++++ go.sum | 42 +++++++++++++++++++++++ 17 files changed, 143 insertions(+), 40 deletions(-) create mode 100644 app/internal/helpers/certificate.go delete mode 100644 app/internal/mongo/pipeline.go create mode 100644 app/internal/mongodb/mongo.go diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index d181f699..8fd79e7b 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -1,4 +1,4 @@ -name: Deploy Backend +name: Test and Deploy Backend on: [ push, pull_request ] diff --git a/app/internal/elastic/elastic.go b/app/internal/elastic/elastic.go index 0a1006e5..b5ad5853 100644 --- a/app/internal/elastic/elastic.go +++ b/app/internal/elastic/elastic.go @@ -2,28 +2,28 @@ package elastic import ( "fmt" - "os" + + "backend/app/internal/helpers" + "backend/app/internal/structs" "github.com/elastic/go-elasticsearch/v8" ) - -func Connect(host string, port int, user string, password string) (*elasticsearch.Client, error) { +func Connect(config structs.Elastic) *elasticsearch.Client { esConfig := elasticsearch.Config{ Addresses: []string{ - fmt.Sprintf("https://%s:%d", host, port), + fmt.Sprintf("%s://%s:%d", config.Protocol, config.Host, config.Port), }, - Username: user, - Password: password, - CACert: GetCertificate(), + Username: config.User, + Password: config.Password, + CACert: helpers.GetCertificate(), } - return elasticsearch.NewClient(esConfig) -} + client, err := elasticsearch.NewClient(esConfig) -func GetCertificate() []byte { - pwd, _ := os.Getwd() - cert, _ := os.ReadFile(pwd + "/ca.crt") + if err != nil { + panic(err) + } - return cert + return client } diff --git a/app/internal/embedding/embedding.go b/app/internal/embedding/embedding.go index f76da130..4d45a8d4 100644 --- a/app/internal/embedding/embedding.go +++ b/app/internal/embedding/embedding.go @@ -9,7 +9,6 @@ import ( "os" ) - type Embeddings = structs.Embeddings func Embed(fragments []string) *Embeddings { @@ -20,7 +19,7 @@ func Embed(fragments []string) *Embeddings { // Call embedding model reqBody := bytes.NewBuffer(body) res, err := http.Post( - "http://" + os.Getenv("MODELS_HOST") + ":8501/v1/models/universal-encoder:predict", + "http://"+os.Getenv("MODELS_HOST")+":8501/v1/models/universal-encoder:predict", "application/json", reqBody, ) diff --git a/app/internal/embedding/pipeline.go b/app/internal/embedding/pipeline.go index 31329889..824744f7 100644 --- a/app/internal/embedding/pipeline.go +++ b/app/internal/embedding/pipeline.go @@ -1,6 +1,5 @@ package embedding - func PerformPipeline(fragments []string, isQuery bool) *Embeddings { preprocessed := PreprocessFragment(fragments, isQuery) embeddings := Embed(preprocessed) diff --git a/app/internal/embedding/preprocessing.go b/app/internal/embedding/preprocessing.go index 5fef0fb0..6ed16bda 100644 --- a/app/internal/embedding/preprocessing.go +++ b/app/internal/embedding/preprocessing.go @@ -10,7 +10,6 @@ import ( stripmd "github.com/writeas/go-strip-markdown" ) - func PreprocessFragment(fragments []string, isQuery bool) []string { cleanFragment := fragments @@ -61,7 +60,7 @@ func StopWordRemoval(fragments []string) []string { func Stemming(fragments []string) []string { var stemmed []string - f := func (r rune) bool { return unicode.IsSpace(r) } + f := func(r rune) bool { return unicode.IsSpace(r) } for _, fragment := range fragments { var stemmedWords []string diff --git a/app/internal/helpers/certificate.go b/app/internal/helpers/certificate.go new file mode 100644 index 00000000..09143f2c --- /dev/null +++ b/app/internal/helpers/certificate.go @@ -0,0 +1,12 @@ +package helpers + +import ( + "os" +) + +func GetCertificate() []byte { + pwd, _ := os.Getwd() + cert, _ := os.ReadFile(pwd + "/ca.crt") + + return cert +} diff --git a/app/internal/helpers/config.go b/app/internal/helpers/config.go index 58af9123..ac064190 100644 --- a/app/internal/helpers/config.go +++ b/app/internal/helpers/config.go @@ -10,7 +10,6 @@ import ( "gopkg.in/yaml.v2" ) - type Config = structs.Config func LoadConfigs() Config { diff --git a/app/internal/mongo/pipeline.go b/app/internal/mongo/pipeline.go deleted file mode 100644 index 509499c1..00000000 --- a/app/internal/mongo/pipeline.go +++ /dev/null @@ -1,3 +0,0 @@ -package mongo - - diff --git a/app/internal/mongodb/mongo.go b/app/internal/mongodb/mongo.go new file mode 100644 index 00000000..1c04b74b --- /dev/null +++ b/app/internal/mongodb/mongo.go @@ -0,0 +1,26 @@ +package mongodb + +import ( + "context" + "fmt" + + "backend/app/internal/structs" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func Connect(config structs.Mongo) *mongo.Client { + ctx := context.TODO() + uri := fmt.Sprintf("%s://%s:%s@%s:%d", config.Protocol, config.User, config.Password, config.Host, config.Port) + opts := options.Client().ApplyURI(uri) + + // Create a new client and connect to the server + client, err := mongo.Connect(ctx, opts) + + if err != nil { + panic(err) + } + + return client +} diff --git a/app/internal/routes/retrieve.go b/app/internal/routes/retrieve.go index 485569a2..eb776dba 100644 --- a/app/internal/routes/retrieve.go +++ b/app/internal/routes/retrieve.go @@ -10,7 +10,6 @@ import ( "github.com/gin-gonic/gin" ) - type EmbeddingRequest = structs.EmbeddingRequest func InitRetrieverRoutes(router *gin.Engine) { diff --git a/app/internal/routes/routes.go b/app/internal/routes/routes.go index 6597ccd2..55e6d447 100644 --- a/app/internal/routes/routes.go +++ b/app/internal/routes/routes.go @@ -4,7 +4,6 @@ import ( "github.com/gin-gonic/gin" ) - func InitRoutes(router *gin.Engine) { InitRetrieverRoutes(router) } diff --git a/app/internal/structs/config.go b/app/internal/structs/config.go index 3a705361..32c11ecd 100644 --- a/app/internal/structs/config.go +++ b/app/internal/structs/config.go @@ -1,14 +1,27 @@ package structs - type Config struct { - Backend struct { - Port int `yaml:"port"` - }`yaml:"backend"` - Elastic struct { - Host string `yaml:"host"` - Port int `yaml:"port"` - User string `yaml:"user"` - Password string `yaml:"password"` - }`yaml:"elastic"` + Backend Backend `yaml:"backend"` + Mongo Mongo `yaml:"mongodb"` + Elastic Elastic `yaml:"elastic"` +} + +type Backend struct { + Port int `yaml:"port"` +} + +type Mongo struct { + Protocol string `yaml:"protocol"` + Host string `yaml:"host"` + Port int `yaml:"port"` + User string `yaml:"user"` + Password string `yaml:"password"` +} + +type Elastic struct { + Protocol string `yaml:"protocol"` + Host string `yaml:"host"` + Port int `yaml:"port"` + User string `yaml:"user"` + Password string `yaml:"password"` } diff --git a/app/internal/structs/embedding-request.go b/app/internal/structs/embedding-request.go index 62436ea8..fa0e1e80 100644 --- a/app/internal/structs/embedding-request.go +++ b/app/internal/structs/embedding-request.go @@ -1,6 +1,5 @@ package structs - type EmbeddingRequest struct { - Fragment string`json:"fragment"` + Fragment string `json:"fragment"` } diff --git a/app/internal/structs/embeddings.go b/app/internal/structs/embeddings.go index bcb319c9..11c483a4 100644 --- a/app/internal/structs/embeddings.go +++ b/app/internal/structs/embeddings.go @@ -1,6 +1,5 @@ package structs - type Embeddings struct { Predictions [][]float32 } diff --git a/config/template.config.yml b/config/template.config.yml index 3bb2e814..5615299d 100644 --- a/config/template.config.yml +++ b/config/template.config.yml @@ -1,9 +1,18 @@ -# Server Configurations backend: port: 8080 + +# Mongo Configurations +mongodb: + protocol: "" + host: "" + port: 27017 + user: "" + password: "" + # ElasticSearch Credentials elastic: + protocol: "" host: "" port: 9200 user: "" - password: "" + password: "" \ No newline at end of file diff --git a/go.mod b/go.mod index 3894b0f0..8fed6ba0 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,11 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/writeas/go-strip-markdown v2.0.1+incompatible + go.mongodb.org/mongo-driver v1.14.0 gopkg.in/yaml.v2 v2.4.0 +) + +require ( github.com/bytedance/sonic v1.11.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect @@ -22,21 +26,29 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang/snappy v0.0.1 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.13.6 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/crypto v0.20.0 // indirect golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.32.0 // indirect diff --git a/go.sum b/go.sum index afdbdbba..bab364dd 100644 --- a/go.sum +++ b/go.sum @@ -38,11 +38,15 @@ github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -56,6 +60,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -74,6 +80,17 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw= github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9pXdk8V6MVnZmTzRG0alMNLMwa0J01fE= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= @@ -83,16 +100,41 @@ go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +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.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +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-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= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c7122304ee7ba764a94768afb2700b9f9a1eabdb Mon Sep 17 00:00:00 2001 From: edoriggio Date: Tue, 5 Mar 2024 19:59:45 +0100 Subject: [PATCH 02/60] updated workflow --- .github/workflows/deploy-backend.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 8fd79e7b..97ae2cf4 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -1,6 +1,6 @@ name: Test and Deploy Backend -on: [ push, pull_request ] +on: [ push ] jobs: test: From d9cf31bf598b79d30646675d8d445dc602cc3ba6 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Thu, 7 Mar 2024 18:04:50 +0100 Subject: [PATCH 03/60] new mongodb documents will now be automatically embedded and saved in elastic --- .github/workflows/deploy-backend.yml | 2 +- app/cmd/main/main.go | 7 +++ app/internal/elastic/elastic.go | 2 + app/internal/elastic/operations.go | 62 +++++++++++++++++++ app/internal/elastic/parser.go | 22 +++++++ app/internal/mongodb/mongo.go | 7 ++- app/internal/mongodb/sync.go | 89 ++++++++++++++++++++++++++++ app/internal/routes/retrieve.go | 2 +- app/internal/structs/document.go | 21 +++++++ 9 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 app/internal/elastic/operations.go create mode 100644 app/internal/elastic/parser.go create mode 100644 app/internal/mongodb/sync.go create mode 100644 app/internal/structs/document.go diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 97ae2cf4..0cc1f992 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -31,4 +31,4 @@ jobs: name: tests-result path: tests-result.txt # deploy: - # if: github.event_name == 'pull_request' && github.ref == 'refs/heads/main' + # if: github.ref == 'refs/heads/main' diff --git a/app/cmd/main/main.go b/app/cmd/main/main.go index 48a3e0bf..7a188da5 100644 --- a/app/cmd/main/main.go +++ b/app/cmd/main/main.go @@ -1,6 +1,8 @@ package main import ( + "backend/app/internal/elastic" + "backend/app/internal/mongodb" "fmt" "log" @@ -14,6 +16,11 @@ import ( func main() { cfg := helpers.LoadConfigs() + mongoClient := mongodb.Connect(cfg.Mongo) + elasticClient := elastic.Connect(cfg.Elastic) + // Run the sync pipeline on a different goroutine + go mongodb.WatchDatabase(mongoClient, elasticClient, "insert") + router := gin.Default() routes.InitRoutes(router) err := router.Run(fmt.Sprintf(":%d", cfg.Backend.Port)) diff --git a/app/internal/elastic/elastic.go b/app/internal/elastic/elastic.go index b5ad5853..bfae4bfc 100644 --- a/app/internal/elastic/elastic.go +++ b/app/internal/elastic/elastic.go @@ -2,6 +2,7 @@ package elastic import ( "fmt" + "log" "backend/app/internal/helpers" "backend/app/internal/structs" @@ -24,6 +25,7 @@ func Connect(config structs.Elastic) *elasticsearch.Client { if err != nil { panic(err) } + log.Print("Connected to ElasticSearch") return client } diff --git a/app/internal/elastic/operations.go b/app/internal/elastic/operations.go new file mode 100644 index 00000000..1daaa973 --- /dev/null +++ b/app/internal/elastic/operations.go @@ -0,0 +1,62 @@ +package elastic + +import ( + "bytes" + "context" + "log" + "os" + "strings" + + "backend/app/internal/structs" + + "github.com/elastic/go-elasticsearch/v8" + "github.com/elastic/go-elasticsearch/v8/esapi" + "github.com/goccy/go-json" +) + +func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, index string) { + jsonDocument, err := json.Marshal(document) + + if err != nil { + panic(err) + } + + response, err := client.Index(index, bytes.NewReader(jsonDocument)) + + if err != nil { + return + } + + if os.Getenv("GIN_MODE") == "debug" { + log.Printf("[ELASTIC-debug] %s", response.String()) + } +} + +func SearchDocument(client *elasticsearch.Client, query string, index string) { + request := esapi.SearchRequest{ + Index: []string{index}, + Body: strings.NewReader(query), + } + + response, err := request.Do(context.TODO(), client) + + if err != nil { + return + } + + if os.Getenv("GIN_MODE") == "debug" { + log.Printf("[ELASTIC-debug] %s", response.String()) + } +} + +func DeleteDocument(client *elasticsearch.Client, id string, index string) { + response, err := client.Delete(index, id) + + if err != nil { + return + } + + if os.Getenv("GIN_MODE") == "debug" { + log.Printf("[ELASTIC-debug] %s", response.String()) + } +} diff --git a/app/internal/elastic/parser.go b/app/internal/elastic/parser.go new file mode 100644 index 00000000..22557396 --- /dev/null +++ b/app/internal/elastic/parser.go @@ -0,0 +1,22 @@ +package elastic + +import ( + "backend/app/internal/structs" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.Embeddings) *structs.EsDocument { + var err error + var esDocument structs.EsDocument + + esDocument.MongoId, err = primitive.ObjectIDFromHex(document.Id) + + if err != nil { + panic(err) + } + + esDocument.Collection = document.Collection + esDocument.Embedding = embeddings.Predictions[0] + + return &esDocument +} diff --git a/app/internal/mongodb/mongo.go b/app/internal/mongodb/mongo.go index 1c04b74b..60703a5a 100644 --- a/app/internal/mongodb/mongo.go +++ b/app/internal/mongodb/mongo.go @@ -3,6 +3,7 @@ package mongodb import ( "context" "fmt" + "log" "backend/app/internal/structs" @@ -12,7 +13,10 @@ import ( func Connect(config structs.Mongo) *mongo.Client { ctx := context.TODO() - uri := fmt.Sprintf("%s://%s:%s@%s:%d", config.Protocol, config.User, config.Password, config.Host, config.Port) + uri := fmt.Sprintf( + "%s://%s:%s@%s:%d/?directConnection=true&authSource=apis", + config.Protocol, config.User, config.Password, config.Host, config.Port, + ) opts := options.Client().ApplyURI(uri) // Create a new client and connect to the server @@ -21,6 +25,7 @@ func Connect(config structs.Mongo) *mongo.Client { if err != nil { panic(err) } + log.Print("Connected to MongoDB") return client } diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go new file mode 100644 index 00000000..10fe62b7 --- /dev/null +++ b/app/internal/mongodb/sync.go @@ -0,0 +1,89 @@ +package mongodb + +import ( + "context" + "fmt" + "github.com/elastic/go-elasticsearch/v8" + "log" + "time" + + "backend/app/internal/elastic" + "backend/app/internal/embedding" + "backend/app/internal/structs" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string) { + db := client.Database("apis") + match := bson.D{{"$match", bson.D{{"operationType", operation}}}} + opts := options.ChangeStream().SetMaxAwaitTime(5 * time.Second) + + stream, err := db.Watch(context.TODO(), mongo.Pipeline{match}, opts) + + if err != nil { + log.Fatal(err) + } + + switch operation { + case "insert": + InsertDocuments(esClient, stream, db) + case "delete": + DeleteDocuments(esClient, stream, db) + } +} + +func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { + for stream.Next(context.TODO()) { + document := RetrieveDocument(stream, database) + embeddings := embedding.PerformPipeline([]string{document.Api}, false) + esDocument := elastic.ParseEmbedding(document, embeddings) + // TODO: Change index name + elastic.SendDocument(esClient, esDocument, "test") + } +} + +func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { + for stream.Next(context.TODO()) { + document := RetrieveDocument(stream, database) + query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, document.Id) + + // TODO: Change index name + elastic.SearchDocument(esClient, query, "test") + } +} + +func RetrieveDocument(stream *mongo.ChangeStream, db *mongo.Database) *structs.SyncDocument { + var specification structs.SyncDocument + err := stream.Current.Lookup("documentKey").Unmarshal(&specification) + + if err != nil { + panic(err) + } + + err = stream.Current.Lookup("ns").Unmarshal(&specification) + + if err != nil { + panic(err) + } + + id, err := primitive.ObjectIDFromHex(specification.Id) + + if err != nil { + panic(err) + } + + coll := db.Collection(specification.Collection) + res, err := coll.FindOne(context.Background(), bson.M{"_id": id}).Raw() + + if err != nil { + panic(err) + } + + specification.Api = fmt.Sprint(res) + + return &specification +} diff --git a/app/internal/routes/retrieve.go b/app/internal/routes/retrieve.go index eb776dba..765c6224 100644 --- a/app/internal/routes/retrieve.go +++ b/app/internal/routes/retrieve.go @@ -25,5 +25,5 @@ func Search(c *gin.Context) { } embeddings := embedding.PerformPipeline([]string{body.Fragment}, true) - log.Print(embeddings) + log.Print(len(embeddings.Predictions[0])) } diff --git a/app/internal/structs/document.go b/app/internal/structs/document.go new file mode 100644 index 00000000..87a1418a --- /dev/null +++ b/app/internal/structs/document.go @@ -0,0 +1,21 @@ +package structs + +import ( + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type Document struct {} + +type SyncDocument struct { + Document + Id string `bson:"_id"` + Collection string `bson:"coll"` + Api string +} + +type EsDocument struct { + Document + MongoId primitive.ObjectID `json:"mongo_id"` + Collection string `json:"mongo_collection"` + Embedding []float32 `json:"embedding"` +} From 954b4fe975499632ab2c5c0bb47047bbb1896742 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 00:48:23 +0100 Subject: [PATCH 04/60] started working on sync for deleted documents + added documentation with html --- .pre-commit-config.yaml | 14 + README.md | 40 +- app/cmd/main/main.go | 2 +- app/internal/doc2go.rc | 3 + app/internal/elastic/elastic.go | 4 +- app/internal/elastic/operations.go | 26 +- app/internal/elastic/parser.go | 5 +- app/internal/embedding/embedding.go | 7 +- app/internal/embedding/pipeline.go | 2 + app/internal/embedding/preprocessing.go | 9 + app/internal/helpers/certificate.go | 1 + app/internal/helpers/config.go | 1 + app/internal/mongodb/mongo.go | 4 +- app/internal/mongodb/operations.go | 21 + app/internal/mongodb/sync.go | 78 +- app/internal/structs/config.go | 16 +- app/internal/structs/document.go | 16 +- app/internal/structs/embedding-request.go | 5 - app/internal/structs/embeddings.go | 8 +- app/tests/embedding/extracting_test.go | 3 +- app/tests/embedding/preprocesing_test.go | 5 +- app/tests/embedding/stemming_test.go | 4 +- app/tests/embedding/stopwords_test.go | 3 +- environment.yml => config/environment.yml | 0 docs/go/_/css/main.css | 161 +++ docs/go/_/icons/apple-touch-icon.png | Bin 0 -> 20698 bytes docs/go/_/icons/favicon-16x16.png | Bin 0 -> 1302 bytes docs/go/_/icons/favicon-32x32.png | Bin 0 -> 2441 bytes docs/go/_/icons/favicon.ico | Bin 0 -> 15086 bytes docs/go/_/js/permalink.js | 44 + .../pagefind/filter/unknown_9115dcc.pf_filter | Bin 0 -> 65 bytes .../fragment/unknown_1363832.pf_fragment | Bin 0 -> 388 bytes .../fragment/unknown_95c2f17.pf_fragment | Bin 0 -> 351 bytes .../fragment/unknown_96ce833.pf_fragment | Bin 0 -> 815 bytes .../fragment/unknown_aab62d4.pf_fragment | Bin 0 -> 1021 bytes .../fragment/unknown_c53c497.pf_fragment | Bin 0 -> 735 bytes .../fragment/unknown_d9365e2.pf_fragment | Bin 0 -> 686 bytes .../_/pagefind/index/unknown_1446bce.pf_index | Bin 0 -> 3986 bytes docs/go/_/pagefind/pagefind-entry.json | 1 + docs/go/_/pagefind/pagefind-highlight.js | 1069 +++++++++++++++++ docs/go/_/pagefind/pagefind-modular-ui.css | 214 ++++ docs/go/_/pagefind/pagefind-modular-ui.js | 8 + docs/go/_/pagefind/pagefind-ui.css | 1 + docs/go/_/pagefind/pagefind-ui.js | 2 + docs/go/_/pagefind/pagefind.js | 9 + .../pagefind.unknown_4bda9216e98df89.pf_meta | Bin 0 -> 154 bytes docs/go/_/pagefind/wasm.unknown.pagefind | Bin 0 -> 55176 bytes docs/go/elastic/index.html | 72 ++ docs/go/embedding/index.html | 85 ++ docs/go/helpers/index.html | 62 + docs/go/index.html | 69 ++ docs/go/mongodb/index.html | 71 ++ docs/go/routes/index.html | 61 + docs/go/structs/index.html | 124 ++ go.mod | 20 +- go.sum | 26 + scripts/hooks/generate-go-docs.sh | 4 + 57 files changed, 2286 insertions(+), 94 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 app/internal/doc2go.rc create mode 100644 app/internal/mongodb/operations.go delete mode 100644 app/internal/structs/embedding-request.go rename environment.yml => config/environment.yml (100%) create mode 100644 docs/go/_/css/main.css create mode 100644 docs/go/_/icons/apple-touch-icon.png create mode 100644 docs/go/_/icons/favicon-16x16.png create mode 100644 docs/go/_/icons/favicon-32x32.png create mode 100644 docs/go/_/icons/favicon.ico create mode 100644 docs/go/_/js/permalink.js create mode 100644 docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter create mode 100644 docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment create mode 100644 docs/go/_/pagefind/fragment/unknown_95c2f17.pf_fragment create mode 100644 docs/go/_/pagefind/fragment/unknown_96ce833.pf_fragment create mode 100644 docs/go/_/pagefind/fragment/unknown_aab62d4.pf_fragment create mode 100644 docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment create mode 100644 docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment create mode 100644 docs/go/_/pagefind/index/unknown_1446bce.pf_index create mode 100644 docs/go/_/pagefind/pagefind-entry.json create mode 100644 docs/go/_/pagefind/pagefind-highlight.js create mode 100644 docs/go/_/pagefind/pagefind-modular-ui.css create mode 100644 docs/go/_/pagefind/pagefind-modular-ui.js create mode 100644 docs/go/_/pagefind/pagefind-ui.css create mode 100644 docs/go/_/pagefind/pagefind-ui.js create mode 100644 docs/go/_/pagefind/pagefind.js create mode 100644 docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta create mode 100644 docs/go/_/pagefind/wasm.unknown.pagefind create mode 100644 docs/go/elastic/index.html create mode 100644 docs/go/embedding/index.html create mode 100644 docs/go/helpers/index.html create mode 100644 docs/go/index.html create mode 100644 docs/go/mongodb/index.html create mode 100644 docs/go/routes/index.html create mode 100644 docs/go/structs/index.html create mode 100755 scripts/hooks/generate-go-docs.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..324419ff --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,14 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - repo: local + hooks: + - id: generate-go-docs + name: generate-go-docs + entry: ./scripts/hooks/generate-go-docs.sh + language: system diff --git a/README.md b/README.md index a88c7a4e..2d5a3374 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# API Scout - Backend +# API Scout - BackendConfig -## Set ENV Variables +## Configure + +### Set ENV Variables The following are the variables that need to be set: - `GIN_MODE`: In which mode Gin should be running (can be `release` or `debug`) - `MODELS_HOST`: The hostname of the DL models container (use `models` if in release mode, `127.0.0.1` if in debug mode) -## Downloading USE Model +### Downloading USE Model To download the Universal Sentence Encoder (USE) model, run the python script in `scripts/download-use.py` by running the following commands (you should run these commands while in the `backend` directory): @@ -18,7 +20,7 @@ conda run -n api-scout python ./scripts/download-use.py You will now have a new directory in `models` called `universal-encoder`. This model will be used by the `docker-compose.yml` file to serve the model in a container. -## Spinning up the Containers +### Spinning up the Containers For replication purposes, in this repo you will find both a `Dockerfile` and a `docker-compose.yml` file. The `Dockerfile` will create a Docker image with a build of the Golang backend in it. To create the image, simply run: @@ -34,6 +36,34 @@ docker-compose up -d This will create a Docker container for the Golang backend and for the USE model. The backend will now be able to make HTTP calls to the USE model to embed queries and documents. N.B.: The USE container will not expose any ports, it will be called locally by the backend by means of the `be-network` shared network. -## Dependencies +### Dependencies For the backend to work, both an ElasticSearch instance and a MongoDB instance should be up and running. + +## Documentation + +To generate and consult the documentation, you can use the following commands. + +### Generate Documentation + +To generate the documentation, first you need to make sure that you have all the necessary dependencies installed. Run the following commands: + +```shell +go install go.abhg.dev/doc2go@latest +npm install -g pagefind@latest +``` + +Once all dependencies have been installed, run: + +```shell +cd app/internal +doc2go -config ./doc2go.rc ./... +``` + +### Consult Documentation + +To consult the documentation of the `app/internal` API, run the following command: + +```shell +cd docs/go && python -m http.server 8000 +``` diff --git a/app/cmd/main/main.go b/app/cmd/main/main.go index 7a188da5..ea107544 100644 --- a/app/cmd/main/main.go +++ b/app/cmd/main/main.go @@ -12,7 +12,6 @@ import ( "github.com/gin-gonic/gin" ) - func main() { cfg := helpers.LoadConfigs() @@ -20,6 +19,7 @@ func main() { elasticClient := elastic.Connect(cfg.Elastic) // Run the sync pipeline on a different goroutine go mongodb.WatchDatabase(mongoClient, elasticClient, "insert") + go mongodb.WatchDatabase(mongoClient, elasticClient, "delete") router := gin.Default() routes.InitRoutes(router) diff --git a/app/internal/doc2go.rc b/app/internal/doc2go.rc new file mode 100644 index 00000000..e4e7c38d --- /dev/null +++ b/app/internal/doc2go.rc @@ -0,0 +1,3 @@ +pagefind +out ../../docs/go +home backend/app/internal/ diff --git a/app/internal/elastic/elastic.go b/app/internal/elastic/elastic.go index bfae4bfc..f3616abd 100644 --- a/app/internal/elastic/elastic.go +++ b/app/internal/elastic/elastic.go @@ -10,7 +10,9 @@ import ( "github.com/elastic/go-elasticsearch/v8" ) -func Connect(config structs.Elastic) *elasticsearch.Client { +// Connect - used to connect to the elasticsearch database. It will return an elasticsearch client that can be used to +// perform queries on the database. +func Connect(config structs.ElasticConfig) *elasticsearch.Client { esConfig := elasticsearch.Config{ Addresses: []string{ fmt.Sprintf("%s://%s:%d", config.Protocol, config.Host, config.Port), diff --git a/app/internal/elastic/operations.go b/app/internal/elastic/operations.go index 1daaa973..91eb5e69 100644 --- a/app/internal/elastic/operations.go +++ b/app/internal/elastic/operations.go @@ -14,6 +14,8 @@ import ( "github.com/goccy/go-json" ) +// SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need +// to be passed to the function. func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, index string) { jsonDocument, err := json.Marshal(document) @@ -32,23 +34,37 @@ func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, in } } -func SearchDocument(client *elasticsearch.Client, query string, index string) { +// SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need +// to be passed to the function. +func SearchDocument(client *elasticsearch.Client, query string, index string) *structs.EsDocument { + var response structs.EsDocument request := esapi.SearchRequest{ Index: []string{index}, - Body: strings.NewReader(query), + Body: strings.NewReader(query), } - response, err := request.Do(context.TODO(), client) + res, err := request.Do(context.TODO(), client) if err != nil { - return + panic(err) } if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] %s", response.String()) + log.Printf("[ELASTIC-debug] %s", res.Status()) } + + //bson.NewDecoder(res) + log.Print(response) + + if err != nil { + panic(err) + } + + return &response } +// DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to +// be passed to the function. func DeleteDocument(client *elasticsearch.Client, id string, index string) { response, err := client.Delete(index, id) diff --git a/app/internal/elastic/parser.go b/app/internal/elastic/parser.go index 22557396..f51e28fe 100644 --- a/app/internal/elastic/parser.go +++ b/app/internal/elastic/parser.go @@ -5,7 +5,10 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.Embeddings) *structs.EsDocument { +// ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the +// Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the +// function. +func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.EmbeddingResponse) *structs.EsDocument { var err error var esDocument structs.EsDocument diff --git a/app/internal/embedding/embedding.go b/app/internal/embedding/embedding.go index 4d45a8d4..95558031 100644 --- a/app/internal/embedding/embedding.go +++ b/app/internal/embedding/embedding.go @@ -1,16 +1,19 @@ package embedding import ( - "backend/app/internal/structs" "bytes" "encoding/json" "log" "net/http" "os" + + "backend/app/internal/structs" ) -type Embeddings = structs.Embeddings +type Embeddings = structs.EmbeddingResponse +// Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of +// embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. func Embed(fragments []string) *Embeddings { body, _ := json.Marshal(map[string][]string{ "instances": fragments, diff --git a/app/internal/embedding/pipeline.go b/app/internal/embedding/pipeline.go index 824744f7..48fb17d8 100644 --- a/app/internal/embedding/pipeline.go +++ b/app/internal/embedding/pipeline.go @@ -1,5 +1,7 @@ package embedding +// PerformPipeline - fragments are preprocessed and embeddings are generated and returned. An array of fragments +// (string) and a boolean indicating if the fragments are queries or not need to be passed to the function. func PerformPipeline(fragments []string, isQuery bool) *Embeddings { preprocessed := PreprocessFragment(fragments, isQuery) embeddings := Embed(preprocessed) diff --git a/app/internal/embedding/preprocessing.go b/app/internal/embedding/preprocessing.go index 6ed16bda..7aa8d5cf 100644 --- a/app/internal/embedding/preprocessing.go +++ b/app/internal/embedding/preprocessing.go @@ -10,6 +10,9 @@ import ( stripmd "github.com/writeas/go-strip-markdown" ) +// PreprocessFragment - fragments are preprocessed by running a standard NLP pipeline, composed of string cleaning, +// stop-word removal, and stemming. An array of fragments (string), and a boolean indicating is the fragments are +// queries or not need to be passed to the function. func PreprocessFragment(fragments []string, isQuery bool) []string { cleanFragment := fragments @@ -20,6 +23,8 @@ func PreprocessFragment(fragments []string, isQuery bool) []string { return Stemming(StopWordRemoval(cleanFragment)) } +// ExtractTags - extract the NL tags from a fragment (JSON document documenting a REST API), and return an array of +// strings, one for each fragment. An array of fragments needs to be passed to the function. func ExtractTags(fragments []string) []string { var nlFragments []string nlTagsRegex := regexp.MustCompile(`['"](?:description|name|title|summary)['"]:\s"([^"]+)"|'([^']+)'`) @@ -45,6 +50,8 @@ func ExtractTags(fragments []string) []string { return nlFragments } +// StopWordRemoval - remove all stopwords from the given strings. An array of strings needs to be passed to the +// function. func StopWordRemoval(fragments []string) []string { var newFragments []string @@ -58,6 +65,8 @@ func StopWordRemoval(fragments []string) []string { return newFragments } +// Stemming - stem all the words contained in the given strings. An array of strings needs to be passed to the +// function. func Stemming(fragments []string) []string { var stemmed []string f := func(r rune) bool { return unicode.IsSpace(r) } diff --git a/app/internal/helpers/certificate.go b/app/internal/helpers/certificate.go index 09143f2c..9fb209d1 100644 --- a/app/internal/helpers/certificate.go +++ b/app/internal/helpers/certificate.go @@ -4,6 +4,7 @@ import ( "os" ) +// GetCertificate - retrieve the elasticsearch cluster certificate. func GetCertificate() []byte { pwd, _ := os.Getwd() cert, _ := os.ReadFile(pwd + "/ca.crt") diff --git a/app/internal/helpers/config.go b/app/internal/helpers/config.go index ac064190..534c9339 100644 --- a/app/internal/helpers/config.go +++ b/app/internal/helpers/config.go @@ -12,6 +12,7 @@ import ( type Config = structs.Config +// LoadConfigs - parse and store in a struct all the config values needed by the backend. func LoadConfigs() Config { var cfg Config diff --git a/app/internal/mongodb/mongo.go b/app/internal/mongodb/mongo.go index 60703a5a..5b953d90 100644 --- a/app/internal/mongodb/mongo.go +++ b/app/internal/mongodb/mongo.go @@ -11,7 +11,9 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" ) -func Connect(config structs.Mongo) *mongo.Client { +// Connect - used to connect to the mongodb database. It will return a mongodb client that can be used to perform +// queries on the database. +func Connect(config structs.MongoConfig) *mongo.Client { ctx := context.TODO() uri := fmt.Sprintf( "%s://%s:%s@%s:%d/?directConnection=true&authSource=apis", diff --git a/app/internal/mongodb/operations.go b/app/internal/mongodb/operations.go new file mode 100644 index 00000000..85a90569 --- /dev/null +++ b/app/internal/mongodb/operations.go @@ -0,0 +1,21 @@ +package mongodb + +import ( + "context" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +// SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection +// need to be passed to the function. +func SearchDocument(database *mongo.Database, query bson.M, collection string) string { + coll := database.Collection(collection) + res, err := coll.FindOne(context.Background(), query).Raw() + + if err != nil { + panic(err) + } + + return string(res) +} diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go index 10fe62b7..d546bdaf 100644 --- a/app/internal/mongodb/sync.go +++ b/app/internal/mongodb/sync.go @@ -3,7 +3,6 @@ package mongodb import ( "context" "fmt" - "github.com/elastic/go-elasticsearch/v8" "log" "time" @@ -11,12 +10,15 @@ import ( "backend/app/internal/embedding" "backend/app/internal/structs" + "github.com/elastic/go-elasticsearch/v8" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) +// WatchDatabase - watch for a certain type of events in the mongodb `apis` database. The supported events are +// document insertion and document deletion. func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string) { db := client.Database("apis") match := bson.D{{"$match", bson.D{{"operationType", operation}}}} @@ -36,54 +38,56 @@ func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operati } } +// InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and +// saved in the respective elasticsearch index. func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { for stream.Next(context.TODO()) { - document := RetrieveDocument(stream, database) + var document structs.SyncDocument + // Retrieve the mongo document id + err := stream.Current.Lookup("documentKey").Unmarshal(&document) + + if err != nil { + panic(err) + } + + // Retrieve the mongo document collection + err = stream.Current.Lookup("ns").Unmarshal(&document) + + if err != nil { + panic(err) + } + + // Create ObjectId for mongodb query + docId, err := primitive.ObjectIDFromHex(document.Id) + + if err != nil { + panic(err) + } + + query := bson.M{"_id": docId} + document.Api = SearchDocument(database, query, document.Collection) + embeddings := embedding.PerformPipeline([]string{document.Api}, false) - esDocument := elastic.ParseEmbedding(document, embeddings) + esDocument := elastic.ParseEmbedding(&document, embeddings) // TODO: Change index name elastic.SendDocument(esClient, esDocument, "test") } } +// DeleteDocuments - every time a documents is deleted from the database, it will be searched in the elasticsearch +// index (based on the mongodb ObjectId) and deleted from the elasticsearch database. func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { for stream.Next(context.TODO()) { - document := RetrieveDocument(stream, database) - query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, document.Id) + var specification structs.SyncDocument + err := stream.Current.Lookup("documentKey").Unmarshal(&specification) + + if err != nil { + panic(err) + } + query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, specification.Id) // TODO: Change index name elastic.SearchDocument(esClient, query, "test") + //elastic.DeleteDocument(esClient, esDocument.) } } - -func RetrieveDocument(stream *mongo.ChangeStream, db *mongo.Database) *structs.SyncDocument { - var specification structs.SyncDocument - err := stream.Current.Lookup("documentKey").Unmarshal(&specification) - - if err != nil { - panic(err) - } - - err = stream.Current.Lookup("ns").Unmarshal(&specification) - - if err != nil { - panic(err) - } - - id, err := primitive.ObjectIDFromHex(specification.Id) - - if err != nil { - panic(err) - } - - coll := db.Collection(specification.Collection) - res, err := coll.FindOne(context.Background(), bson.M{"_id": id}).Raw() - - if err != nil { - panic(err) - } - - specification.Api = fmt.Sprint(res) - - return &specification -} diff --git a/app/internal/structs/config.go b/app/internal/structs/config.go index 32c11ecd..8ddf4264 100644 --- a/app/internal/structs/config.go +++ b/app/internal/structs/config.go @@ -1,16 +1,19 @@ package structs +// Config - used to store all configurations needed by the backend. type Config struct { - Backend Backend `yaml:"backend"` - Mongo Mongo `yaml:"mongodb"` - Elastic Elastic `yaml:"elastic"` + Backend BackendConfig `yaml:"backend"` + Mongo MongoConfig `yaml:"mongodb"` + Elastic ElasticConfig `yaml:"elastic"` } -type Backend struct { +// BackendConfig - all backend-related configurations. +type BackendConfig struct { Port int `yaml:"port"` } -type Mongo struct { +// MongoConfig - all mongodb-related configurations. +type MongoConfig struct { Protocol string `yaml:"protocol"` Host string `yaml:"host"` Port int `yaml:"port"` @@ -18,7 +21,8 @@ type Mongo struct { Password string `yaml:"password"` } -type Elastic struct { +// ElasticConfig - all elasticsearch-related configurations. +type ElasticConfig struct { Protocol string `yaml:"protocol"` Host string `yaml:"host"` Port int `yaml:"port"` diff --git a/app/internal/structs/document.go b/app/internal/structs/document.go index 87a1418a..b52e60fc 100644 --- a/app/internal/structs/document.go +++ b/app/internal/structs/document.go @@ -4,18 +4,16 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -type Document struct {} - +// SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. type SyncDocument struct { - Document - Id string `bson:"_id"` + Id string `bson:"_id"` Collection string `bson:"coll"` - Api string + Api string } +// EsDocument - structure of an elasticsearch document returned by the elasticsearch client. type EsDocument struct { - Document - MongoId primitive.ObjectID `json:"mongo_id"` - Collection string `json:"mongo_collection"` - Embedding []float32 `json:"embedding"` + MongoId primitive.ObjectID `json:"mongo_id"` + Collection string `json:"mongo_collection"` + Embedding []float32 `json:"embedding"` } diff --git a/app/internal/structs/embedding-request.go b/app/internal/structs/embedding-request.go deleted file mode 100644 index fa0e1e80..00000000 --- a/app/internal/structs/embedding-request.go +++ /dev/null @@ -1,5 +0,0 @@ -package structs - -type EmbeddingRequest struct { - Fragment string `json:"fragment"` -} diff --git a/app/internal/structs/embeddings.go b/app/internal/structs/embeddings.go index 11c483a4..3e696872 100644 --- a/app/internal/structs/embeddings.go +++ b/app/internal/structs/embeddings.go @@ -1,5 +1,11 @@ package structs -type Embeddings struct { +// EmbeddingRequest - structure of the request to be sent to the embedding server. +type EmbeddingRequest struct { + Fragment string `json:"fragment"` +} + +// EmbeddingResponse - structure of the response sent back by the embedding server. +type EmbeddingResponse struct { Predictions [][]float32 } diff --git a/app/tests/embedding/extracting_test.go b/app/tests/embedding/extracting_test.go index 5d6307d3..d6e87a08 100644 --- a/app/tests/embedding/extracting_test.go +++ b/app/tests/embedding/extracting_test.go @@ -7,7 +7,6 @@ import ( "backend/app/internal/embedding" ) - func TestExtractEmptyString(t *testing.T) { fragments := []string{""} res := embedding.ExtractTags(fragments) @@ -17,7 +16,7 @@ func TestExtractEmptyString(t *testing.T) { } } -func TestExtractEmptyArray(t *testing.T) { +func TestExtractEmptyArray(t *testing.T) { var fragments []string res := embedding.ExtractTags(fragments) diff --git a/app/tests/embedding/preprocesing_test.go b/app/tests/embedding/preprocesing_test.go index 2543d342..e703b1bf 100644 --- a/app/tests/embedding/preprocesing_test.go +++ b/app/tests/embedding/preprocesing_test.go @@ -7,7 +7,6 @@ import ( "backend/app/internal/embedding" ) - func TestPreprocessEmptyString(t *testing.T) { fragments := []string{""} res := embedding.PreprocessFragment(fragments, true) @@ -17,7 +16,7 @@ func TestPreprocessEmptyString(t *testing.T) { } } -func TestPreprocessEmptyArray(t *testing.T) { +func TestPreprocessEmptyArray(t *testing.T) { var fragments []string res := embedding.PreprocessFragment(fragments, true) @@ -66,4 +65,4 @@ func TestPreprocessDocuments(t *testing.T) { t.Fatal(res) } -} \ No newline at end of file +} diff --git a/app/tests/embedding/stemming_test.go b/app/tests/embedding/stemming_test.go index d75ac580..5533a285 100644 --- a/app/tests/embedding/stemming_test.go +++ b/app/tests/embedding/stemming_test.go @@ -7,7 +7,6 @@ import ( "backend/app/internal/embedding" ) - func TestStemmingEmptyString(t *testing.T) { fragments := []string{""} res := embedding.Stemming(fragments) @@ -17,7 +16,7 @@ func TestStemmingEmptyString(t *testing.T) { } } -func TestStemmingEmptyArray(t *testing.T) { +func TestStemmingEmptyArray(t *testing.T) { var fragments []string res := embedding.Stemming(fragments) @@ -55,4 +54,3 @@ func TestStemmingIncorrectlyFormattedQueries(t *testing.T) { t.Fatal(res) } } - diff --git a/app/tests/embedding/stopwords_test.go b/app/tests/embedding/stopwords_test.go index 6d880d70..00d70b6e 100644 --- a/app/tests/embedding/stopwords_test.go +++ b/app/tests/embedding/stopwords_test.go @@ -7,7 +7,6 @@ import ( "backend/app/internal/embedding" ) - func TestStopwordsEmptyString(t *testing.T) { fragments := []string{""} res := embedding.StopWordRemoval(fragments) @@ -17,7 +16,7 @@ func TestStopwordsEmptyString(t *testing.T) { } } -func TestStopwordsEmptyArray(t *testing.T) { +func TestStopwordsEmptyArray(t *testing.T) { var fragments []string res := embedding.StopWordRemoval(fragments) diff --git a/environment.yml b/config/environment.yml similarity index 100% rename from environment.yml rename to config/environment.yml diff --git a/docs/go/_/css/main.css b/docs/go/_/css/main.css new file mode 100644 index 00000000..aad59947 --- /dev/null +++ b/docs/go/_/css/main.css @@ -0,0 +1,161 @@ +body { + margin: 1em 2em; + font-family: Helvetica, sans-serif; + background-color: #f8f8f8; + font-size: 1em; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0.3em; + margin-bottom: 0.3em; +} +h1, h2, h3, h4 { font-weight: 500; } +h2 { font-size: 1.75em } +h3 { font-size: 1.5em } +h4 { font-size: 1.33em } +h5 { font-size: 1em } + +a { + text-decoration: none; + color: #0366a5; +} +a:hover { + text-decoration: underline; +} + +a.permalink { display: none; } +a.permalink:hover { + text-decoration: none; +} +*:hover > a.permalink { display: inline; } + +nav { + padding: 1em; + background-color: #eee; + border-radius: 0.5em; + display: flex; + flex-wrap: wrap; +} + +nav .navbar-right { + margin-left: auto; +} + +/* Remove first level of nesting for a package's index section. */ +#pkg-index + ul, #pkg-examples + ul { + list-style-type: none; + padding: 0; +} + +code, kbd, pre { + font-family: Consolas, monospace; +} + +pre { + color: #222; + overflow-x: auto; + border: 1px solid #ccc; + border-radius: 0.5em; + background-color: #eee; + padding: 0.75em; + font-size: 0.9em; +} + +details.example > summary { + color: #0366a5; + cursor: pointer; +} + +details.deprecated > summary { + list-style: none; +} + +span.deprecated-tag { + color: #eee; + background-color: #999; + padding: 0.125rem 0.3rem; + border-radius: 0.3rem; + font-size: 0.7rem; + vertical-align: middle; + cursor: pointer; +} + +#search { margin: 0.3em 0; } + +#generated-by-footer { font-size: x-small; } + +/* Background */ .bg { background-color: #ffffff; } +/* PreWrapper */ .chroma { background-color: #ffffff; } +/* Error */ .chroma .err { color: #a61717; background-color: #e3d2d2 } +/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #e5e5e5 } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #000000; font-weight: bold } +/* KeywordConstant */ .chroma .kc { color: #000000; font-weight: bold } +/* KeywordDeclaration */ .chroma .kd { color: #000000; font-weight: bold } +/* KeywordNamespace */ .chroma .kn { color: #000000; font-weight: bold } +/* KeywordPseudo */ .chroma .kp { color: #000000; font-weight: bold } +/* KeywordReserved */ .chroma .kr { color: #000000; font-weight: bold } +/* KeywordType */ .chroma .kt { color: #445588; font-weight: bold } +/* NameAttribute */ .chroma .na { color: #008080 } +/* NameBuiltin */ .chroma .nb { color: #0086b3 } +/* NameBuiltinPseudo */ .chroma .bp { color: #999999 } +/* NameClass */ .chroma .nc { color: #445588; font-weight: bold } +/* NameConstant */ .chroma .no { color: #008080 } +/* NameDecorator */ .chroma .nd { color: #3c5d5d; font-weight: bold } +/* NameEntity */ .chroma .ni { color: #800080 } +/* NameException */ .chroma .ne { color: #990000; font-weight: bold } +/* NameFunction */ .chroma .nf { color: #990000; font-weight: bold } +/* NameLabel */ .chroma .nl { color: #990000; font-weight: bold } +/* NameNamespace */ .chroma .nn { color: #555555 } +/* NameTag */ .chroma .nt { color: #000080 } +/* NameVariable */ .chroma .nv { color: #008080 } +/* NameVariableClass */ .chroma .vc { color: #008080 } +/* NameVariableGlobal */ .chroma .vg { color: #008080 } +/* NameVariableInstance */ .chroma .vi { color: #008080 } +/* LiteralString */ .chroma .s { color: #dd1144 } +/* LiteralStringAffix */ .chroma .sa { color: #dd1144 } +/* LiteralStringBacktick */ .chroma .sb { color: #dd1144 } +/* LiteralStringChar */ .chroma .sc { color: #dd1144 } +/* LiteralStringDelimiter */ .chroma .dl { color: #dd1144 } +/* LiteralStringDoc */ .chroma .sd { color: #dd1144 } +/* LiteralStringDouble */ .chroma .s2 { color: #dd1144 } +/* LiteralStringEscape */ .chroma .se { color: #dd1144 } +/* LiteralStringHeredoc */ .chroma .sh { color: #dd1144 } +/* LiteralStringInterpol */ .chroma .si { color: #dd1144 } +/* LiteralStringOther */ .chroma .sx { color: #dd1144 } +/* LiteralStringRegex */ .chroma .sr { color: #009926 } +/* LiteralStringSingle */ .chroma .s1 { color: #dd1144 } +/* LiteralStringSymbol */ .chroma .ss { color: #990073 } +/* LiteralNumber */ .chroma .m { color: #009999 } +/* LiteralNumberBin */ .chroma .mb { color: #009999 } +/* LiteralNumberFloat */ .chroma .mf { color: #009999 } +/* LiteralNumberHex */ .chroma .mh { color: #009999 } +/* LiteralNumberInteger */ .chroma .mi { color: #009999 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #009999 } +/* LiteralNumberOct */ .chroma .mo { color: #009999 } +/* Operator */ .chroma .o { color: #000000; font-weight: bold } +/* OperatorWord */ .chroma .ow { color: #000000; font-weight: bold } +/* Comment */ .chroma .c { color: #999988; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #999988; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #999988; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #999988; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #999999; font-weight: bold; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #999999; font-weight: bold; font-style: italic } +/* CommentPreprocFile */ .chroma .cpf { color: #999999; font-weight: bold; font-style: italic } +/* GenericDeleted */ .chroma .gd { color: #000000; background-color: #ffdddd } +/* GenericEmph */ .chroma .ge { color: #000000; font-style: italic } +/* GenericError */ .chroma .gr { color: #aa0000 } +/* GenericHeading */ .chroma .gh { color: #999999 } +/* GenericInserted */ .chroma .gi { color: #000000; background-color: #ddffdd } +/* GenericOutput */ .chroma .go { color: #888888 } +/* GenericPrompt */ .chroma .gp { color: #555555 } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #aaaaaa } +/* GenericTraceback */ .chroma .gt { color: #aa0000 } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { color: #bbbbbb } diff --git a/docs/go/_/icons/apple-touch-icon.png b/docs/go/_/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8b84711223432bf683e20daff7014583594786e2 GIT binary patch literal 20698 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 YtO;;q_YmsY;1&?$Yv%ej2Ph=~T6sckb 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 literal 0 HcmV?d00001 diff --git a/docs/go/_/js/permalink.js b/docs/go/_/js/permalink.js new file mode 100644 index 00000000..062ccf3f --- /dev/null +++ b/docs/go/_/js/permalink.js @@ -0,0 +1,44 @@ +// If the page was opened with an anchor (e.g. #foo), +// and the destination is a
element, open it. +function openDetailsAnchor() { + let hash = window.location.hash + if (!hash) { + return + } + let el = document.getElementById(hash.slice(1)) // remove leading '#' + if (!el) { + return + } + + let details = el.closest("details") + while (details) { + details.open = true + details = details.parentElement.closest("details") + } + + // New elements may have appeared. + // Set hash again to scroll to the right place. + window.location.hash = hash; + return false; +} + +window.addEventListener('hashchange', openDetailsAnchor) + +window.addEventListener('load', () => { + document.querySelectorAll("h2, h3, h4, h5, h6").forEach((el) => { + if (!el.id) { + return + } + el.innerHTML += ' ' + }) + + document.querySelectorAll("details.example > summary").forEach((el) => { + let id = el.parentElement.id; + if (!id) { + return + } + el.innerHTML += ' ' + }) + + openDetailsAnchor() +}) diff --git a/docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter b/docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter new file mode 100644 index 0000000000000000000000000000000000000000..4282e114ecd74b621b1c727b541b5dadc009df93 GIT binary patch literal 65 zcmb2|=3oE;rvHpu3|IdbB&MgPW#*;CrzEE|WrbxHXC`IlWR_GmHf4C`m82HsCFZm- RFfuW-upW8X&ZPy^2mrxc6)XS% literal 0 HcmV?d00001 diff --git a/docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment b/docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..24e34e487817d2a8189b475aeabe639b47a08419 GIT binary patch literal 388 zcmV-~0ek)*iwFP!00002|9z4{PXaLzh5yQ=CrxlsBpygSc`zoPy&y5AonpiJe}d zkQhGITq@}8P{%kVu_v$Hk@2aZti6F({8839WgM^$2*9cr8 zpwpSjWYo!2U|gN0C75$MZzIA>@FgvJ2Y80esWzO8PB_f*9<*)Gx%j2XSe^Gwl$oMV z89{q1$dC}ogYM{{ojZ(b+KX%LYRupfEn1jw54CPc57Y`-HhXx`2YZ5D`3*hb_%C1^#|d&Vce?4RTK85x?u+|^_ZfECa&`5@D9L0r1P|rljP&$NYDw(~ x?8@~F{d^PMNxTM)xEI-5`WPBuhaNhh!_Z|-w;kG|P-Hq0 zDodUuw+o8=_ffXvS02lu7el6~Py9ZLWXk3k3l%*@JbDWkwT8Gj~ssI~_nl2jW955bJ~P(?$Qrb9sojAF9Jc?clR6o;$7&M@xo*xU{_EWOyU zc|uoNxPP?H(7B^()pUeDVDSfTfpGH;oVUhCC%|Bh0==)(?>7)>p5?#mg$HABdo{g- z%gOao2uwv_&}Bx^5|}Y;2|9-2UK@f|2(dPRj4vwm0bDkG>&O*iWWi~eA*9S&jQo!e z)6;cAtCIM{U}`i+Yrj;GJ2tim6N0cmGBit=X)PNvZJs8z>hsJ{Sd|L}H(P?qlqy8A zjT*jRpRK{Dhsa6)tmf+2U#(FEy4-LqC2^j(SSbi#EVk}XfqHkTCu2)<~ zXdt1l%wsl8St{y+`kwbm$tCw@U%>j_-r4b}9|<~Pi95tnGj}qoJ&s65kixpoxxyDavBK^kE<|9&@u0FU5v7nxdqL-{qu}&bHYg^ z$J$0%O!0;GH{QPmC^0GK=3+$tBJvaTdETcIG%o^QJqC@jZF7~jr1tV?6^uWw!WP)c z8muu9Ypm{2Z9$#xg4&!K9mK5;4dC-#$m<^3!E2anl#4wmtzNbP*4?c!k4HO6*ELb& tb(&Qh>a3fJ(-u@W38k$GaJ~zmQ5ri zfVWbtW&Ljww6(T;X@lMrL>o?<|C2ygTkCY%Ja!s{8wrx6VpUdg7DzCbL&$QE%!V~7 zyL6(3PT7L3RnkZ*3v1!Rt16w{%KBewllnJcv%b#Ke9}y%A3;*8`iN-#Q>y%EQD?9B zB34|N)@_z%MA6Op0>9ZVS)K#_1N*UK+H{!xR{W>PdJCQ1s`{p-097kzcdF9wuN`3r zb&{*98p^q#eoHtWmI;4a4{N>#t9oYYSd=ay1=eK`3&(O!>t1+xdU#qDl9N7&VL6?QT}*;tQ{8{7M!D zt8z&9ypE!+zdA;(FrRG`-->oc^4gNziHLg$yeBBHon&)=XeqUcp$m5x_ zpO(OWotVGiC?u`wh3B`2s|Yn}P|-;9tmE+;;l?pemqeTd4s6eQs{7?RS*Na(f=(#O z?z^Qp4Nj3~d4uN+Cl@)@A@P*vXTZ3-$Z$iz$`;-Y86Q7@Puf1VfFLgcg;vfa_(jtNX5u(RI5b0FEg*b~6U zXHIhXKI(bHWRt8P@4^L>O~yTST^Ll8SwGH&>m{4s_SDnwcFCrrt|EqSrKF09E5Oap r-0ab7FFXNh^Uv;jLjI)v@3Njycrbce{UgMT4^M~Rx6W@P)DQpwY`X-! literal 0 HcmV?d00001 diff --git a/docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment b/docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..3342564fc74424aefdb58f85a0dd66db576c37b3 GIT binary patch literal 735 zcmV<50wDb#iwFP!00002|Fu=YQrj>P{goY^0%H;=Fm!V3z$FK!2RiKm7?7<^qGC&~ zBqwB;{CiijoJ3C2o;W4mUA^6X+PA9t45w0w7g2~0)|irw*{ITLrbRwt87s7Ms2o{q zUc6B-MCTA>RcqtmiRI)$B}TliN0P#g;$?^N#9-Q}0&cZZSh!*GH6Zkttb(n_?b2 z%6!+zt4*JCu4ecUY}qDZ=e>*HC;co$2rkg9z{v`!N3n583nIh{m>OLrePkdbIn;Yw z7KO>S*`!)B3VerwKP5UkIwHU4zv%`h;sm%7``J>U9)}ZU(YQW`J?kfN*voQ^Lr)nUpQSp_t&C8bxo&;LGOKrqUp&P$_FK%u! zHkBnUSIfp9?5DIcm!)(oHhyH2xOCa`I%5?&?n5T+dak*f)As(?j;35rx)Ld@vk(qf z#a#Prj~|Sxs@hjz{)M8Y@bAIf>`aqv77~{p0pAb2667d#5%^}~^L3U$U3O4$xo=T+ zABhCw>KH_CE%u=Hy<5o3>tmR`HPOS|_iiz7j@Fq9t_Qj2+#+6_e?117%x@2|@7n>q Rx?Vr8{{p-KO)>um006)0TP6Si literal 0 HcmV?d00001 diff --git a/docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment b/docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..8c3beaf521bcbc8fb117b91d6292b5a0e6e345ce GIT binary patch literal 686 zcmV;f0#W@RiwFP!00002|D9D$PvbBU{VOA%0EKqDfLQgm0uJ0(i*_%7kZVs{i^R^_ z4y8ikPMq)F2jajBa5cr)*LJkI$7=Ss^LDdYz$Y|5r=j45|si7`uD8oWCS#5Jc&gHsU@If&_d}2 z{nZlRZ)T{c50smDR%Nz>g~eZ~)KEovSKU>)h&h$j0ty4+}or&~VPXwa=hlF%5u zp(Vnh*X=U##EHmkT{<(P7p9fK!3t?Ec$K-;Qa|sHR#d_96do{K3xRN_g^_3pl1?O? z8fisJwtbTJv0kG^RJ$qkX~iGPv+E65*LY;W!T_)L%-E2~U2qaPj?b~V<5i_YgBN@G z(&&-=az}>NbVP*Rp==rVMcIZe>FesYIQ}+p`?^$1qyrLk2I8{<&`w?%D_?{u!djmE zxK7wyrL=V&n|`pr%Bh)3m0z>zBfF2=m_2V2mZ9e%xY&%)$+=xNMW^w zaJUvr6RJIakQuY;d02j@XeGl#@wzxSbWh$Ct^xwS4?G{_NR8lu5}SV8Bps-W8Y=Gk z7G?YO=s;ZVgXnI~9@37p1-!W0huB>_J;WVni+DZRhuFPkJ;WVni#VBF?}u#Xb_cNI U+Jd{f+&pjo13>mdViE`d0Al4*VE_OC literal 0 HcmV?d00001 diff --git a/docs/go/_/pagefind/index/unknown_1446bce.pf_index b/docs/go/_/pagefind/index/unknown_1446bce.pf_index new file mode 100644 index 0000000000000000000000000000000000000000..f2caa334e26f5ea3cc8a279239fb66e0357f6180 GIT binary patch literal 3986 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 literal 0 HcmV?d00001 diff --git a/docs/go/_/pagefind/pagefind-entry.json b/docs/go/_/pagefind/pagefind-entry.json new file mode 100644 index 00000000..3aa81cdd --- /dev/null +++ b/docs/go/_/pagefind/pagefind-entry.json @@ -0,0 +1 @@ +{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_4bda9216e98df89","wasm":null,"page_count":6}}} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind-highlight.js b/docs/go/_/pagefind/pagefind-highlight.js new file mode 100644 index 00000000..c823fbfe --- /dev/null +++ b/docs/go/_/pagefind/pagefind-highlight.js @@ -0,0 +1,1069 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/mark.js/dist/mark.js +var require_mark = __commonJS({ + "node_modules/mark.js/dist/mark.js"(exports, module) { + (function(global, factory) { + typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.Mark = factory(); + })(exports, function() { + "use strict"; + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + var classCallCheck = function(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + var createClass = function() { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function(Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + var _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + var DOMIterator = function() { + function DOMIterator2(ctx) { + var iframes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; + var exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; + var iframesTimeout = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 5e3; + classCallCheck(this, DOMIterator2); + this.ctx = ctx; + this.iframes = iframes; + this.exclude = exclude; + this.iframesTimeout = iframesTimeout; + } + createClass(DOMIterator2, [{ + key: "getContexts", + value: function getContexts() { + var ctx = void 0, filteredCtx = []; + if (typeof this.ctx === "undefined" || !this.ctx) { + ctx = []; + } else if (NodeList.prototype.isPrototypeOf(this.ctx)) { + ctx = Array.prototype.slice.call(this.ctx); + } else if (Array.isArray(this.ctx)) { + ctx = this.ctx; + } else if (typeof this.ctx === "string") { + ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx)); + } else { + ctx = [this.ctx]; + } + ctx.forEach(function(ctx2) { + var isDescendant = filteredCtx.filter(function(contexts) { + return contexts.contains(ctx2); + }).length > 0; + if (filteredCtx.indexOf(ctx2) === -1 && !isDescendant) { + filteredCtx.push(ctx2); + } + }); + return filteredCtx; + } + }, { + key: "getIframeContents", + value: function getIframeContents(ifr, successFn) { + var errorFn = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() { + }; + var doc = void 0; + try { + var ifrWin = ifr.contentWindow; + doc = ifrWin.document; + if (!ifrWin || !doc) { + throw new Error("iframe inaccessible"); + } + } catch (e) { + errorFn(); + } + if (doc) { + successFn(doc); + } + } + }, { + key: "isIframeBlank", + value: function isIframeBlank(ifr) { + var bl = "about:blank", src = ifr.getAttribute("src").trim(), href = ifr.contentWindow.location.href; + return href === bl && src !== bl && src; + } + }, { + key: "observeIframeLoad", + value: function observeIframeLoad(ifr, successFn, errorFn) { + var _this = this; + var called = false, tout = null; + var listener = function listener2() { + if (called) { + return; + } + called = true; + clearTimeout(tout); + try { + if (!_this.isIframeBlank(ifr)) { + ifr.removeEventListener("load", listener2); + _this.getIframeContents(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + }; + ifr.addEventListener("load", listener); + tout = setTimeout(listener, this.iframesTimeout); + } + }, { + key: "onIframeReady", + value: function onIframeReady(ifr, successFn, errorFn) { + try { + if (ifr.contentWindow.document.readyState === "complete") { + if (this.isIframeBlank(ifr)) { + this.observeIframeLoad(ifr, successFn, errorFn); + } else { + this.getIframeContents(ifr, successFn, errorFn); + } + } else { + this.observeIframeLoad(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + } + }, { + key: "waitForIframes", + value: function waitForIframes(ctx, done) { + var _this2 = this; + var eachCalled = 0; + this.forEachIframe(ctx, function() { + return true; + }, function(ifr) { + eachCalled++; + _this2.waitForIframes(ifr.querySelector("html"), function() { + if (!--eachCalled) { + done(); + } + }); + }, function(handled) { + if (!handled) { + done(); + } + }); + } + }, { + key: "forEachIframe", + value: function forEachIframe(ctx, filter, each) { + var _this3 = this; + var end = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var ifr = ctx.querySelectorAll("iframe"), open = ifr.length, handled = 0; + ifr = Array.prototype.slice.call(ifr); + var checkEnd = function checkEnd2() { + if (--open <= 0) { + end(handled); + } + }; + if (!open) { + checkEnd(); + } + ifr.forEach(function(ifr2) { + if (DOMIterator2.matches(ifr2, _this3.exclude)) { + checkEnd(); + } else { + _this3.onIframeReady(ifr2, function(con) { + if (filter(ifr2)) { + handled++; + each(con); + } + checkEnd(); + }, checkEnd); + } + }); + } + }, { + key: "createIterator", + value: function createIterator(ctx, whatToShow, filter) { + return document.createNodeIterator(ctx, whatToShow, filter, false); + } + }, { + key: "createInstanceOnIframe", + value: function createInstanceOnIframe(contents) { + return new DOMIterator2(contents.querySelector("html"), this.iframes); + } + }, { + key: "compareNodeIframe", + value: function compareNodeIframe(node, prevNode, ifr) { + var compCurr = node.compareDocumentPosition(ifr), prev = Node.DOCUMENT_POSITION_PRECEDING; + if (compCurr & prev) { + if (prevNode !== null) { + var compPrev = prevNode.compareDocumentPosition(ifr), after = Node.DOCUMENT_POSITION_FOLLOWING; + if (compPrev & after) { + return true; + } + } else { + return true; + } + } + return false; + } + }, { + key: "getIteratorNode", + value: function getIteratorNode(itr) { + var prevNode = itr.previousNode(); + var node = void 0; + if (prevNode === null) { + node = itr.nextNode(); + } else { + node = itr.nextNode() && itr.nextNode(); + } + return { + prevNode, + node + }; + } + }, { + key: "checkIframeFilter", + value: function checkIframeFilter(node, prevNode, currIfr, ifr) { + var key = false, handled = false; + ifr.forEach(function(ifrDict, i) { + if (ifrDict.val === currIfr) { + key = i; + handled = ifrDict.handled; + } + }); + if (this.compareNodeIframe(node, prevNode, currIfr)) { + if (key === false && !handled) { + ifr.push({ + val: currIfr, + handled: true + }); + } else if (key !== false && !handled) { + ifr[key].handled = true; + } + return true; + } + if (key === false) { + ifr.push({ + val: currIfr, + handled: false + }); + } + return false; + } + }, { + key: "handleOpenIframes", + value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) { + var _this4 = this; + ifr.forEach(function(ifrDict) { + if (!ifrDict.handled) { + _this4.getIframeContents(ifrDict.val, function(con) { + _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb); + }); + } + }); + } + }, { + key: "iterateThroughNodes", + value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) { + var _this5 = this; + var itr = this.createIterator(ctx, whatToShow, filterCb); + var ifr = [], elements = [], node = void 0, prevNode = void 0, retrieveNodes = function retrieveNodes2() { + var _getIteratorNode = _this5.getIteratorNode(itr); + prevNode = _getIteratorNode.prevNode; + node = _getIteratorNode.node; + return node; + }; + while (retrieveNodes()) { + if (this.iframes) { + this.forEachIframe(ctx, function(currIfr) { + return _this5.checkIframeFilter(node, prevNode, currIfr, ifr); + }, function(con) { + _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function(ifrNode) { + return elements.push(ifrNode); + }, filterCb); + }); + } + elements.push(node); + } + elements.forEach(function(node2) { + eachCb(node2); + }); + if (this.iframes) { + this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb); + } + doneCb(); + } + }, { + key: "forEachNode", + value: function forEachNode(whatToShow, each, filter) { + var _this6 = this; + var done = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var contexts = this.getContexts(); + var open = contexts.length; + if (!open) { + done(); + } + contexts.forEach(function(ctx) { + var ready = function ready2() { + _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function() { + if (--open <= 0) { + done(); + } + }); + }; + if (_this6.iframes) { + _this6.waitForIframes(ctx, ready); + } else { + ready(); + } + }); + } + }], [{ + key: "matches", + value: function matches(element, selector) { + var selectors = typeof selector === "string" ? [selector] : selector, fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector; + if (fn) { + var match = false; + selectors.every(function(sel) { + if (fn.call(element, sel)) { + match = true; + return false; + } + return true; + }); + return match; + } else { + return false; + } + } + }]); + return DOMIterator2; + }(); + var Mark$1 = function() { + function Mark3(ctx) { + classCallCheck(this, Mark3); + this.ctx = ctx; + this.ie = false; + var ua = window.navigator.userAgent; + if (ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1) { + this.ie = true; + } + } + createClass(Mark3, [{ + key: "log", + value: function log(msg) { + var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "debug"; + var log2 = this.opt.log; + if (!this.opt.debug) { + return; + } + if ((typeof log2 === "undefined" ? "undefined" : _typeof(log2)) === "object" && typeof log2[level] === "function") { + log2[level]("mark.js: " + msg); + } + } + }, { + key: "escapeStr", + value: function escapeStr(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + }, { + key: "createRegExp", + value: function createRegExp(str) { + if (this.opt.wildcards !== "disabled") { + str = this.setupWildcardsRegExp(str); + } + str = this.escapeStr(str); + if (Object.keys(this.opt.synonyms).length) { + str = this.createSynonymsRegExp(str); + } + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + if (this.opt.diacritics) { + str = this.createDiacriticsRegExp(str); + } + str = this.createMergedBlanksRegExp(str); + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.createJoinersRegExp(str); + } + if (this.opt.wildcards !== "disabled") { + str = this.createWildcardsRegExp(str); + } + str = this.createAccuracyRegExp(str); + return str; + } + }, { + key: "createSynonymsRegExp", + value: function createSynonymsRegExp(str) { + var syn = this.opt.synonyms, sens = this.opt.caseSensitive ? "" : "i", joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : ""; + for (var index in syn) { + if (syn.hasOwnProperty(index)) { + var value = syn[index], k1 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(index) : this.escapeStr(index), k2 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(value) : this.escapeStr(value); + if (k1 !== "" && k2 !== "") { + str = str.replace(new RegExp("(" + this.escapeStr(k1) + "|" + this.escapeStr(k2) + ")", "gm" + sens), joinerPlaceholder + ("(" + this.processSynomyms(k1) + "|") + (this.processSynomyms(k2) + ")") + joinerPlaceholder); + } + } + } + return str; + } + }, { + key: "processSynomyms", + value: function processSynomyms(str) { + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + return str; + } + }, { + key: "setupWildcardsRegExp", + value: function setupWildcardsRegExp(str) { + str = str.replace(/(?:\\)*\?/g, function(val) { + return val.charAt(0) === "\\" ? "?" : ""; + }); + return str.replace(/(?:\\)*\*/g, function(val) { + return val.charAt(0) === "\\" ? "*" : ""; + }); + } + }, { + key: "createWildcardsRegExp", + value: function createWildcardsRegExp(str) { + var spaces = this.opt.wildcards === "withSpaces"; + return str.replace(/\u0001/g, spaces ? "[\\S\\s]?" : "\\S?").replace(/\u0002/g, spaces ? "[\\S\\s]*?" : "\\S*"); + } + }, { + key: "setupIgnoreJoinersRegExp", + value: function setupIgnoreJoinersRegExp(str) { + return str.replace(/[^(|)\\]/g, function(val, indx, original) { + var nextChar = original.charAt(indx + 1); + if (/[(|)\\]/.test(nextChar) || nextChar === "") { + return val; + } else { + return val + "\0"; + } + }); + } + }, { + key: "createJoinersRegExp", + value: function createJoinersRegExp(str) { + var joiner = []; + var ignorePunctuation = this.opt.ignorePunctuation; + if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) { + joiner.push(this.escapeStr(ignorePunctuation.join(""))); + } + if (this.opt.ignoreJoiners) { + joiner.push("\\u00ad\\u200b\\u200c\\u200d"); + } + return joiner.length ? str.split(/\u0000+/).join("[" + joiner.join("") + "]*") : str; + } + }, { + key: "createDiacriticsRegExp", + value: function createDiacriticsRegExp(str) { + var sens = this.opt.caseSensitive ? "" : "i", dct = this.opt.caseSensitive ? ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105", "A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010D", "C\xC7\u0106\u010C", "d\u0111\u010F", "D\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119", "E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B", "I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142", "L\u0141", "n\xF1\u0148\u0144", "N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D", "O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159", "R\u0158", "s\u0161\u015B\u0219\u015F", "S\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163", "T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B", "U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF", "Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017A", "Z\u017D\u017B\u0179"] : ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010DC\xC7\u0106\u010C", "d\u0111\u010FD\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142L\u0141", "n\xF1\u0148\u0144N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159R\u0158", "s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017AZ\u017D\u017B\u0179"]; + var handled = []; + str.split("").forEach(function(ch) { + dct.every(function(dct2) { + if (dct2.indexOf(ch) !== -1) { + if (handled.indexOf(dct2) > -1) { + return false; + } + str = str.replace(new RegExp("[" + dct2 + "]", "gm" + sens), "[" + dct2 + "]"); + handled.push(dct2); + } + return true; + }); + }); + return str; + } + }, { + key: "createMergedBlanksRegExp", + value: function createMergedBlanksRegExp(str) { + return str.replace(/[\s]+/gmi, "[\\s]+"); + } + }, { + key: "createAccuracyRegExp", + value: function createAccuracyRegExp(str) { + var _this = this; + var chars = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF"; + var acc = this.opt.accuracy, val = typeof acc === "string" ? acc : acc.value, ls = typeof acc === "string" ? [] : acc.limiters, lsJoin = ""; + ls.forEach(function(limiter) { + lsJoin += "|" + _this.escapeStr(limiter); + }); + switch (val) { + case "partially": + default: + return "()(" + str + ")"; + case "complementary": + lsJoin = "\\s" + (lsJoin ? lsJoin : this.escapeStr(chars)); + return "()([^" + lsJoin + "]*" + str + "[^" + lsJoin + "]*)"; + case "exactly": + return "(^|\\s" + lsJoin + ")(" + str + ")(?=$|\\s" + lsJoin + ")"; + } + } + }, { + key: "getSeparatedKeywords", + value: function getSeparatedKeywords(sv) { + var _this2 = this; + var stack = []; + sv.forEach(function(kw) { + if (!_this2.opt.separateWordSearch) { + if (kw.trim() && stack.indexOf(kw) === -1) { + stack.push(kw); + } + } else { + kw.split(" ").forEach(function(kwSplitted) { + if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) { + stack.push(kwSplitted); + } + }); + } + }); + return { + "keywords": stack.sort(function(a, b) { + return b.length - a.length; + }), + "length": stack.length + }; + } + }, { + key: "isNumeric", + value: function isNumeric(value) { + return Number(parseFloat(value)) == value; + } + }, { + key: "checkRanges", + value: function checkRanges(array) { + var _this3 = this; + if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== "[object Object]") { + this.log("markRanges() will only accept an array of objects"); + this.opt.noMatch(array); + return []; + } + var stack = []; + var last = 0; + array.sort(function(a, b) { + return a.start - b.start; + }).forEach(function(item) { + var _callNoMatchOnInvalid = _this3.callNoMatchOnInvalidRanges(item, last), start = _callNoMatchOnInvalid.start, end = _callNoMatchOnInvalid.end, valid = _callNoMatchOnInvalid.valid; + if (valid) { + item.start = start; + item.length = end - start; + stack.push(item); + last = end; + } + }); + return stack; + } + }, { + key: "callNoMatchOnInvalidRanges", + value: function callNoMatchOnInvalidRanges(range, last) { + var start = void 0, end = void 0, valid = false; + if (range && typeof range.start !== "undefined") { + start = parseInt(range.start, 10); + end = start + parseInt(range.length, 10); + if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) { + valid = true; + } else { + this.log("Ignoring invalid or overlapping range: " + ("" + JSON.stringify(range))); + this.opt.noMatch(range); + } + } else { + this.log("Ignoring invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "checkWhitespaceRanges", + value: function checkWhitespaceRanges(range, originalLength, string) { + var end = void 0, valid = true, max = string.length, offset = originalLength - max, start = parseInt(range.start, 10) - offset; + start = start > max ? max : start; + end = start + parseInt(range.length, 10); + if (end > max) { + end = max; + this.log("End range automatically set to the max value of " + max); + } + if (start < 0 || end - start < 0 || start > max || end > max) { + valid = false; + this.log("Invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } else if (string.substring(start, end).replace(/\s+/g, "") === "") { + valid = false; + this.log("Skipping whitespace only range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "getTextNodes", + value: function getTextNodes(cb) { + var _this4 = this; + var val = "", nodes = []; + this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function(node) { + nodes.push({ + start: val.length, + end: (val += node.textContent).length, + node + }); + }, function(node) { + if (_this4.matchesExclude(node.parentNode)) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, function() { + cb({ + value: val, + nodes + }); + }); + } + }, { + key: "matchesExclude", + value: function matchesExclude(el) { + return DOMIterator.matches(el, this.opt.exclude.concat(["script", "style", "title", "head", "html"])); + } + }, { + key: "wrapRangeInTextNode", + value: function wrapRangeInTextNode(node, start, end) { + var hEl = !this.opt.element ? "mark" : this.opt.element, startNode = node.splitText(start), ret = startNode.splitText(end - start); + var repl = document.createElement(hEl); + repl.setAttribute("data-markjs", "true"); + if (this.opt.className) { + repl.setAttribute("class", this.opt.className); + } + repl.textContent = startNode.textContent; + startNode.parentNode.replaceChild(repl, startNode); + return ret; + } + }, { + key: "wrapRangeInMappedTextNode", + value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { + var _this5 = this; + dict.nodes.every(function(n, i) { + var sibl = dict.nodes[i + 1]; + if (typeof sibl === "undefined" || sibl.start > start) { + if (!filterCb(n.node)) { + return false; + } + var s = start - n.start, e = (end > n.end ? n.end : end) - n.start, startStr = dict.value.substr(0, n.start), endStr = dict.value.substr(e + n.start); + n.node = _this5.wrapRangeInTextNode(n.node, s, e); + dict.value = startStr + endStr; + dict.nodes.forEach(function(k, j) { + if (j >= i) { + if (dict.nodes[j].start > 0 && j !== i) { + dict.nodes[j].start -= e; + } + dict.nodes[j].end -= e; + } + }); + end -= e; + eachCb(n.node.previousSibling, n.start); + if (end > n.end) { + start = n.end; + } else { + return false; + } + } + return true; + }); + } + }, { + key: "wrapMatches", + value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this6 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + dict.nodes.forEach(function(node) { + node = node.node; + var match = void 0; + while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== "") { + if (!filterCb(match[matchIdx], node)) { + continue; + } + var pos = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + pos += match[i].length; + } + } + node = _this6.wrapRangeInTextNode(node, pos, pos + match[matchIdx].length); + eachCb(node.previousSibling); + regex.lastIndex = 0; + } + }); + endCb(); + }); + } + }, { + key: "wrapMatchesAcrossElements", + value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this7 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + var match = void 0; + while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== "") { + var start = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + start += match[i].length; + } + } + var end = start + match[matchIdx].length; + _this7.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(match[matchIdx], node); + }, function(node, lastIndex) { + regex.lastIndex = lastIndex; + eachCb(node); + }); + } + endCb(); + }); + } + }, { + key: "wrapRangeFromIndex", + value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) { + var _this8 = this; + this.getTextNodes(function(dict) { + var originalLength = dict.value.length; + ranges.forEach(function(range, counter) { + var _checkWhitespaceRange = _this8.checkWhitespaceRanges(range, originalLength, dict.value), start = _checkWhitespaceRange.start, end = _checkWhitespaceRange.end, valid = _checkWhitespaceRange.valid; + if (valid) { + _this8.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(node, range, dict.value.substring(start, end), counter); + }, function(node) { + eachCb(node, range); + }); + } + }); + endCb(); + }); + } + }, { + key: "unwrapMatches", + value: function unwrapMatches(node) { + var parent = node.parentNode; + var docFrag = document.createDocumentFragment(); + while (node.firstChild) { + docFrag.appendChild(node.removeChild(node.firstChild)); + } + parent.replaceChild(docFrag, node); + if (!this.ie) { + parent.normalize(); + } else { + this.normalizeTextNode(parent); + } + } + }, { + key: "normalizeTextNode", + value: function normalizeTextNode(node) { + if (!node) { + return; + } + if (node.nodeType === 3) { + while (node.nextSibling && node.nextSibling.nodeType === 3) { + node.nodeValue += node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } else { + this.normalizeTextNode(node.firstChild); + } + this.normalizeTextNode(node.nextSibling); + } + }, { + key: "markRegExp", + value: function markRegExp(regexp, opt) { + var _this9 = this; + this.opt = opt; + this.log('Searching with expression "' + regexp + '"'); + var totalMatches = 0, fn = "wrapMatches"; + var eachCb = function eachCb2(element) { + totalMatches++; + _this9.opt.each(element); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + this[fn](regexp, this.opt.ignoreGroups, function(match, node) { + return _this9.opt.filter(node, match, totalMatches); + }, eachCb, function() { + if (totalMatches === 0) { + _this9.opt.noMatch(regexp); + } + _this9.opt.done(totalMatches); + }); + } + }, { + key: "mark", + value: function mark(sv, opt) { + var _this10 = this; + this.opt = opt; + var totalMatches = 0, fn = "wrapMatches"; + var _getSeparatedKeywords = this.getSeparatedKeywords(typeof sv === "string" ? [sv] : sv), kwArr = _getSeparatedKeywords.keywords, kwArrLen = _getSeparatedKeywords.length, sens = this.opt.caseSensitive ? "" : "i", handler = function handler2(kw) { + var regex = new RegExp(_this10.createRegExp(kw), "gm" + sens), matches = 0; + _this10.log('Searching with expression "' + regex + '"'); + _this10[fn](regex, 1, function(term, node) { + return _this10.opt.filter(node, kw, totalMatches, matches); + }, function(element) { + matches++; + totalMatches++; + _this10.opt.each(element); + }, function() { + if (matches === 0) { + _this10.opt.noMatch(kw); + } + if (kwArr[kwArrLen - 1] === kw) { + _this10.opt.done(totalMatches); + } else { + handler2(kwArr[kwArr.indexOf(kw) + 1]); + } + }); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + if (kwArrLen === 0) { + this.opt.done(totalMatches); + } else { + handler(kwArr[0]); + } + } + }, { + key: "markRanges", + value: function markRanges(rawRanges, opt) { + var _this11 = this; + this.opt = opt; + var totalMatches = 0, ranges = this.checkRanges(rawRanges); + if (ranges && ranges.length) { + this.log("Starting to mark with the following ranges: " + JSON.stringify(ranges)); + this.wrapRangeFromIndex(ranges, function(node, range, match, counter) { + return _this11.opt.filter(node, range, match, counter); + }, function(element, range) { + totalMatches++; + _this11.opt.each(element, range); + }, function() { + _this11.opt.done(totalMatches); + }); + } else { + this.opt.done(totalMatches); + } + } + }, { + key: "unmark", + value: function unmark(opt) { + var _this12 = this; + this.opt = opt; + var sel = this.opt.element ? this.opt.element : "*"; + sel += "[data-markjs]"; + if (this.opt.className) { + sel += "." + this.opt.className; + } + this.log('Removal selector "' + sel + '"'); + this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function(node) { + _this12.unwrapMatches(node); + }, function(node) { + var matchesSel = DOMIterator.matches(node, sel), matchesExclude = _this12.matchesExclude(node); + if (!matchesSel || matchesExclude) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, this.opt.done); + } + }, { + key: "opt", + set: function set$$1(val) { + this._opt = _extends({}, { + "element": "", + "className": "", + "exclude": [], + "iframes": false, + "iframesTimeout": 5e3, + "separateWordSearch": true, + "diacritics": true, + "synonyms": {}, + "accuracy": "partially", + "acrossElements": false, + "caseSensitive": false, + "ignoreJoiners": false, + "ignoreGroups": 0, + "ignorePunctuation": [], + "wildcards": "disabled", + "each": function each() { + }, + "noMatch": function noMatch() { + }, + "filter": function filter() { + return true; + }, + "done": function done() { + }, + "debug": false, + "log": window.console + }, val); + }, + get: function get$$1() { + return this._opt; + } + }, { + key: "iterator", + get: function get$$1() { + return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout); + } + }]); + return Mark3; + }(); + function Mark2(ctx) { + var _this = this; + var instance = new Mark$1(ctx); + this.mark = function(sv, opt) { + instance.mark(sv, opt); + return _this; + }; + this.markRegExp = function(sv, opt) { + instance.markRegExp(sv, opt); + return _this; + }; + this.markRanges = function(sv, opt) { + instance.markRanges(sv, opt); + return _this; + }; + this.unmark = function(opt) { + instance.unmark(opt); + return _this; + }; + return this; + } + return Mark2; + }); + } +}); + +// lib/highlight.ts +var import_mark = __toESM(require_mark(), 1); +var PagefindHighlight = class { + constructor(options = { + markContext: null, + highlightParam: "pagefind-highlight", + markOptions: { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }, + addStyles: true + }) { + var _a, _b; + const { highlightParam, markContext, markOptions, addStyles } = options; + this.highlightParam = highlightParam ?? "pagefind-highlight"; + this.addStyles = addStyles ?? true; + this.markContext = markContext !== void 0 ? markContext : null; + this.markOptions = markOptions !== void 0 ? markOptions : { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }; + (_a = this.markOptions).className ?? (_a.className = "pagefind__highlight"); + (_b = this.markOptions).exclude ?? (_b.exclude = [ + "[data-pagefind-ignore]", + "[data-pagefind-ignore] *" + ]); + this.markOptions.separateWordSearch = false; + this.highlight(); + } + getHighlightParams(paramName) { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.getAll(paramName); + } + // Inline styles might be too hard to override + addHighlightStyles(className) { + if (!className) + return; + const styleElement = document.createElement("style"); + styleElement.innerText = `:where(.${className}) { background-color: yellow; color: black; }`; + document.head.appendChild(styleElement); + } + createMarkInstance() { + if (this.markContext) { + return new import_mark.default(this.markContext); + } + const pagefindBody = document.querySelectorAll("[data-pagefind-body]"); + if (pagefindBody.length !== 0) { + return new import_mark.default(pagefindBody); + } else { + return new import_mark.default(document.body); + } + } + markText(instance, text) { + instance.mark(text, this.markOptions); + } + highlight() { + const params = this.getHighlightParams(this.highlightParam); + if (!params || params.length === 0) + return; + this.addStyles && this.addHighlightStyles(this.markOptions.className); + const markInstance = this.createMarkInstance(); + this.markText(markInstance, params); + } +}; +window.PagefindHighlight = PagefindHighlight; +export { + PagefindHighlight as default +}; +/*! Bundled license information: + +mark.js/dist/mark.js: + (*!*************************************************** + * mark.js v8.11.1 + * https://markjs.io/ + * Copyright (c) 2014–2018, Julian Kühnel + * Released under the MIT license https://git.io/vwTVl + *****************************************************) +*/ diff --git a/docs/go/_/pagefind/pagefind-modular-ui.css b/docs/go/_/pagefind/pagefind-modular-ui.css new file mode 100644 index 00000000..9c6793ed --- /dev/null +++ b/docs/go/_/pagefind/pagefind-modular-ui.css @@ -0,0 +1,214 @@ +:root { + --pagefind-ui-scale: 0.8; + --pagefind-ui-primary: #034AD8; + --pagefind-ui-fade: #707070; + --pagefind-ui-text: #393939; + --pagefind-ui-background: #ffffff; + --pagefind-ui-border: #eeeeee; + --pagefind-ui-tag: #eeeeee; + --pagefind-ui-border-width: 2px; + --pagefind-ui-border-radius: 8px; + --pagefind-ui-image-border-radius: 8px; + --pagefind-ui-image-box-ratio: 3 / 2; + --pagefind-ui-font: system, -apple-system, ".SFNSText-Regular", + "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", + "Lucida Grande", sans-serif; +} + +[data-pfmod-hidden] { + display: none !important; +} + +[data-pfmod-suppressed] { + opacity: 0 !important; + pointer-events: none !important; +} + +[data-pfmod-sr-hidden] { + -webkit-clip: rect(0 0 0 0) !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(100%) !important; + clip-path: inset(100%) !important; + height: 1px !important; + overflow: hidden !important; + overflow: clip !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +[data-pfmod-loading] { + color: var(--pagefind-ui-text); + background-color: var(--pagefind-ui-text); + border-radius: var(--pagefind-ui-border-radius); + opacity: 0.1; + pointer-events: none; +} + +/* Input */ + +.pagefind-modular-input-wrapper { + position: relative; +} + +.pagefind-modular-input-wrapper::before { + background-color: var(--pagefind-ui-text); + width: calc(18px * var(--pagefind-ui-scale)); + height: calc(18px * var(--pagefind-ui-scale)); + top: calc(23px * var(--pagefind-ui-scale)); + left: calc(20px * var(--pagefind-ui-scale)); + content: ""; + position: absolute; + display: block; + opacity: 0.7; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + -webkit-mask-size: 100%; + mask-size: 100%; + z-index: 9; + pointer-events: none; +} + +.pagefind-modular-input { + height: calc(64px * var(--pagefind-ui-scale)); + padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: var(--pagefind-ui-border-radius); + font-size: calc(21px * var(--pagefind-ui-scale)); + position: relative; + appearance: none; + -webkit-appearance: none; + display: flex; + width: 100%; + box-sizing: border-box; + font-weight: 700; +} + +.pagefind-modular-input::placeholder { + opacity: 0.2; +} + +.pagefind-modular-input-clear { + position: absolute; + top: calc(2px * var(--pagefind-ui-scale)); + right: calc(2px * var(--pagefind-ui-scale)); + height: calc(60px * var(--pagefind-ui-scale)); + border-radius: var(--pagefind-ui-border-radius); + padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale)); + color: var(--pagefind-ui-text); + font-size: calc(14px * var(--pagefind-ui-scale)); + cursor: pointer; + background-color: var(--pagefind-ui-background); + border: none; + appearance: none; +} + +/* ResultList */ + +.pagefind-modular-list-result { + list-style-type: none; + display: flex; + align-items: flex-start; + gap: min(calc(40px * var(--pagefind-ui-scale)), 3%); + padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale)); + border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-result:last-of-type { + border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-thumb { + width: min(30%, + calc((30% - (100px * var(--pagefind-ui-scale))) * 100000)); + max-width: calc(120px * var(--pagefind-ui-scale)); + margin-top: calc(10px * var(--pagefind-ui-scale)); + aspect-ratio: var(--pagefind-ui-image-box-ratio); + position: relative; +} + +.pagefind-modular-list-image { + display: block; + position: absolute; + left: 50%; + transform: translateX(-50%); + font-size: 0; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + border-radius: var(--pagefind-ui-image-border-radius); +} + +.pagefind-modular-list-inner { + flex: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: calc(10px * var(--pagefind-ui-scale)); +} + +.pagefind-modular-list-title { + display: inline-block; + font-weight: 700; + font-size: calc(21px * var(--pagefind-ui-scale)); + margin-top: 0; + margin-bottom: 0; +} + +.pagefind-modular-list-link { + color: var(--pagefind-ui-text); + text-decoration: none; +} + +.pagefind-modular-list-link:hover { + text-decoration: underline; +} + +.pagefind-modular-list-excerpt { + display: inline-block; + font-weight: 400; + font-size: calc(16px * var(--pagefind-ui-scale)); + margin-top: calc(4px * var(--pagefind-ui-scale)); + margin-bottom: 0; + min-width: calc(250px * var(--pagefind-ui-scale)); +} + +/* FilterPills */ + +.pagefind-modular-filter-pills-wrapper { + overflow-x: scroll; + padding: 15px 0; +} + +.pagefind-modular-filter-pills { + display: flex; + gap: 6px; +} + +.pagefind-modular-filter-pill { + display: flex; + justify-content: center; + align-items: center; + border: none; + appearance: none; + padding: 0 calc(24px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + color: var(--pagefind-ui-fade); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: calc(25px * var(--pagefind-ui-scale)); + font-size: calc(18px * var(--pagefind-ui-scale)); + height: calc(50px * var(--pagefind-ui-scale)); + cursor: pointer; + white-space: nowrap; +} + +.pagefind-modular-filter-pill:hover { + border-color: var(--pagefind-ui-primary); +} + +.pagefind-modular-filter-pill[aria-pressed="true"] { + border-color: var(--pagefind-ui-primary); + color: var(--pagefind-ui-primary); +} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind-modular-ui.js b/docs/go/_/pagefind/pagefind-modular-ui.js new file mode 100644 index 00000000..93019091 --- /dev/null +++ b/docs/go/_/pagefind/pagefind-modular-ui.js @@ -0,0 +1,8 @@ +(()=>{var b=Object.defineProperty;var w=(i,e)=>{for(var t in e)b(i,t,{get:e[t],enumerable:!0})};var f={};w(f,{FilterPills:()=>h,Input:()=>l,Instance:()=>p,ResultList:()=>a,Summary:()=>o});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),l=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`
  • +
    +
    +

    ${i(30)}

    +

    ${i(40)}

    +
    +
  • `},y=i=>{let e=new r("li").class("pagefind-modular-list-result"),t=new r("div").class("pagefind-modular-list-thumb").addTo(e);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(t);let s=new r("div").class("pagefind-modular-list-inner").addTo(e),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),e.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},a=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var o=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var h=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`${e} (${t})`:`${e}`}renderNew(){this.available.forEach(([e,t])=>{new r("button").class("pagefind-modular-filter-pill").html(this.pillInner(e,t)).attrs({"aria-pressed":this.selected.includes(e),type:"button"}).handle("click",()=>{e==="All"?this.selected=["All"]:this.selected.includes(e)?this.selected=this.selected.filter(s=>s!==e):this.selectMultiple?this.selected.push(e):this.selected=[e],this.selected?.length?this.selected?.length>1&&(this.selected=this.selected.filter(s=>s!=="All")):this.selected=["All"],this.update(),this.pushFilters()}).addTo(this.pillContainer)})}updateExisting(){let e=[...this.pillContainer.childNodes];this.available.forEach(([t,s],n)=>{e[n].innerHTML=this.pillInner(t,s),e[n].setAttribute("aria-pressed",this.selected.includes(t))})}register(e){this.instance=e,this.instance.on("filters",t=>{if(!this.pillContainer)return;this.selectMultiple?t=t.available:t=t.total;let s=t[this.filter];if(!s){console.warn(`[Pagefind FilterPills component]: No possible values found for the ${this.filter} filter`);return}this.available=Object.entries(s),Array.isArray(this.ordering)?this.available.sort((n,c)=>{let m=this.ordering.indexOf(n[0]),_=this.ordering.indexOf(c[0]);return(m===-1?1/0:m)-(_===-1?1/0:_)}):this.available.sort((n,c)=>n[0].localeCompare(c[0])),this.available.unshift(["All",this.total]),this.update()}),e.on("results",t=>{this.pillContainer&&(this.total=t?.unfilteredResultCount||0,this.available?.[0]?.[0]==="All"&&(this.available[0][1]=this.total),this.total||this.alwaysShow?this.wrapper.removeAttribute("data-pfmod-hidden"):this.wrapper.setAttribute("data-pfmod-hidden","true"),this.update())})}};var F=async(i=50)=>await new Promise(e=>setTimeout(e,i)),u;try{u=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?modular-ui.js.*$/)[1]}catch{u="/pagefind/"}var p=class{constructor(e={}){this.__pagefind__=null,this.__initializing__=null,this.__searchID__=0,this.__hooks__={search:[],filters:[],loading:[],results:[]},this.components=[],this.searchTerm="",this.searchFilters={},this.searchResult={},this.availableFilters=null,this.totalFilters=null,this.options={bundlePath:e.bundlePath??u,mergeIndex:e.mergeIndex??[]},delete e.bundlePath,delete e.resetStyles,delete e.processResult,delete e.processTerm,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,this.pagefindOptions=e}add(e){e?.register?.(this),this.components.push(e)}on(e,t){if(!this.__hooks__[e]){let s=Object.keys(this.__hooks__).join(", ");console.error(`[Pagefind Composable]: Unknown event type ${e}. Supported events: [${s}]`);return}if(typeof t!="function"){console.error(`[Pagefind Composable]: Expected callback to be a function, received ${typeof t}`);return}this.__hooks__[e].push(t)}triggerLoad(){this.__load__()}triggerSearch(e){this.searchTerm=e,this.__dispatch__("search",e,this.searchFilters),this.__search__(e,this.searchFilters)}triggerSearchWithFilters(e,t){this.searchTerm=e,this.searchFilters=t,this.__dispatch__("search",e,t),this.__search__(e,t)}triggerFilters(e){this.searchFilters=e,this.__dispatch__("search",this.searchTerm,e),this.__search__(this.searchTerm,e)}triggerFilter(e,t){this.searchFilters=this.searchFilters||{},this.searchFilters[e]=t,this.__dispatch__("search",this.searchTerm,this.searchFilters),this.__search__(this.searchTerm,this.searchFilters)}__dispatch__(e,...t){this.__hooks__[e]?.forEach(s=>s?.(...t))}async __clear__(){this.__dispatch__("results",{results:[],unfilteredTotalCount:0}),this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}async __search__(e,t){this.__dispatch__("loading"),await this.__load__();let s=++this.__searchID__;if(!e||!e.length)return this.__clear__();let n=await this.__pagefind__.search(e,{filters:t});n&&this.__searchID__===s&&(n.filters&&Object.keys(n.filters)?.length&&(this.availableFilters=n.filters,this.totalFilters=n.totalFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})),this.searchResult=n,this.__dispatch__("results",this.searchResult))}async __load__(){if(this.__initializing__){for(;!this.__pagefind__;)await F(50);return}if(this.__initializing__=!0,!this.__pagefind__){let e;try{e=await import(`${this.options.bundlePath}pagefind.js`)}catch(t){console.error(t),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindComposable Instance",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` +`))}await e.options(this.pagefindOptions||{});for(let t of this.options.mergeIndex){if(!t.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let s=t.bundlePath;delete t.bundlePath,await e.mergeIndex(s,t)}this.__pagefind__=e}this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}};window.PagefindModularUI=f;})(); diff --git a/docs/go/_/pagefind/pagefind-ui.css b/docs/go/_/pagefind/pagefind-ui.css new file mode 100644 index 00000000..d7984a98 --- /dev/null +++ b/docs/go/_/pagefind/pagefind-ui.css @@ -0,0 +1 @@ +.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"\2937 ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;appearance:revert}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable="true"]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)} diff --git a/docs/go/_/pagefind/pagefind-ui.js b/docs/go/_/pagefind/pagefind-ui.js new file mode 100644 index 00000000..e964ecaf --- /dev/null +++ b/docs/go/_/pagefind/pagefind-ui.js @@ -0,0 +1,2 @@ +(()=>{var is=Object.defineProperty;var v=(n,e)=>{for(var t in e)is(n,t,{get:e[t],enumerable:!0})};function j(){}function lt(n){return n()}function Qt(){return Object.create(null)}function V(n){n.forEach(lt)}function Ye(n){return typeof n=="function"}function G(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var Ke;function le(n,e){return Ke||(Ke=document.createElement("a")),Ke.href=e,n===Ke.href}function xt(n){return Object.keys(n).length===0}var $t=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,fe=class{constructor(e){this.options=e,this._listeners="WeakMap"in $t?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var s;for(let r of t)fe.entries.set(r.target,r),(s=this._listeners.get(r.target))===null||s===void 0||s(r)})}};fe.entries="WeakMap"in $t?new WeakMap:void 0;var en=!1;function as(){en=!0}function os(){en=!1}function b(n,e){n.appendChild(e)}function y(n,e,t){n.insertBefore(e,t||null)}function C(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;tn.removeEventListener(e,t,s)}function p(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function cs(n){return Array.from(n.childNodes)}function N(n,e){e=""+e,n.data!==e&&(n.data=e)}function it(n,e){n.value=e??""}function W(n,e,t){n.classList[t?"add":"remove"](e)}var Xe=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,s=null){this.e||(this.is_svg?this.e=us(t.nodeName):this.e=k(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(s)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;tn.indexOf(s)===-1?e.push(s):t.push(s)),t.forEach(s=>s()),se=e}var Je=new Set,ee;function ie(){ee={r:0,c:[],p:ee}}function ae(){ee.r||V(ee.c),ee=ee.p}function z(n,e){n&&n.i&&(Je.delete(n),n.i(e))}function I(n,e,t,s){if(n&&n.o){if(Je.has(n))return;Je.add(n),ee.c.push(()=>{Je.delete(n),s&&(t&&n.d(1),s())}),n.o(e)}else s&&s()}function rn(n,e){I(n,1,1,()=>{e.delete(n.key)})}function ln(n,e,t,s,r,l,i,a,o,h,_,f){let c=n.length,E=l.length,u=c,m={};for(;u--;)m[n[u].key]=u;let d=[],R=new Map,T=new Map,S=[];for(u=E;u--;){let F=f(r,l,u),U=t(F),P=i.get(U);P?s&&S.push(()=>P.p(F,e)):(P=h(U,F),P.c()),R.set(U,d[u]=P),U in m&&T.set(U,Math.abs(u-m[U]))}let w=new Set,B=new Set;function X(F){z(F,1),F.m(a,_),i.set(F.key,F),_=F.first,E--}for(;c&&E;){let F=d[E-1],U=n[c-1],P=F.key,Z=U.key;F===U?(_=F.first,c--,E--):R.has(Z)?!i.has(P)||w.has(P)?X(F):B.has(Z)?c--:T.get(P)>T.get(Z)?(B.add(P),X(F)):(w.add(Z),c--):(o(U,i),c--)}for(;c--;){let F=n[c];R.has(F.key)||o(F,i)}for(;E;)X(d[E-1]);return V(S),d}var ms=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Fi=new Set([...ms]);function an(n,e,t){let s=n.$$.props[e];s!==void 0&&(n.$$.bound[s]=t,t(n.$$.ctx[s]))}function Ze(n){n&&n.c()}function he(n,e,t,s){let{fragment:r,after_update:l}=n.$$;r&&r.m(e,t),s||rt(()=>{let i=n.$$.on_mount.map(lt).filter(Ye);n.$$.on_destroy?n.$$.on_destroy.push(...i):V(i),n.$$.on_mount=[]}),l.forEach(rt)}function oe(n,e){let t=n.$$;t.fragment!==null&&(hs(t.after_update),V(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function ps(n,e){n.$$.dirty[0]===-1&&(ne.push(n),fs(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{let u=E.length?E[0]:c;return h.ctx&&r(h.ctx[f],h.ctx[f]=u)&&(!h.skip_bound&&h.bound[f]&&h.bound[f](u),_&&ps(n,f)),c}):[],h.update(),_=!0,V(h.before_update),h.fragment=s?s(h.ctx):!1,e.target){if(e.hydrate){as();let f=cs(e.target);h.fragment&&h.fragment.l(f),f.forEach(C)}else h.fragment&&h.fragment.c();e.intro&&z(n.$$.fragment),he(n,e.target,e.anchor,e.customElement),os(),sn()}_e(o)}var gs;typeof HTMLElement=="function"&&(gs=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:n}=this.$$;this.$$.on_disconnect=n.map(lt).filter(Ye);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(n,e,t){this[n]=t}disconnectedCallback(){V(this.$$.on_disconnect)}$destroy(){oe(this,1),this.$destroy=j}$on(n,e){if(!Ye(e))return j;let t=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return t.push(e),()=>{let s=t.indexOf(e);s!==-1&&t.splice(s,1)}}$set(n){this.$$set&&!xt(n)&&(this.$$.skip_bound=!0,this.$$set(n),this.$$.skip_bound=!1)}});var q=class{$destroy(){oe(this,1),this.$destroy=j}$on(e,t){if(!Ye(t))return j;let s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(t),()=>{let r=s.indexOf(t);r!==-1&&s.splice(r,1)}}$set(e){this.$$set&&!xt(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function D(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=97&&e<=122||e>=65&&e<=90}function $(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=48&&e<=57}function Y(n){return D(n)||$(n)}var on=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"];var ut={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"};var Es={}.hasOwnProperty;function Qe(n,e={}){let t=un(),s=String(n),r=s.toLowerCase(),l=0;if(n==null)throw new Error("Expected string, got `"+n+"`");if(Es.call(ut,r)){let a=ut[r];return(e.normalize===void 0||e.normalize===null||e.normalize)&&typeof a=="string"?Qe(a):(t[on.includes(r)?"regular":"irregular"]=s,t)}for(;D(r.charCodeAt(l))&&l<9;)l++;if(l>1&&l<9){if(t.language=s.slice(0,l),l<4){let a=0;for(;r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&!D(r.charCodeAt(l+4));){if(a>2)return i(l,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(s.slice(l+1,l+4)),l+=4,a++}}for(r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&D(r.charCodeAt(l+4))&&!D(r.charCodeAt(l+5))&&(t.script=s.slice(l+1,l+5),l+=5),r.charCodeAt(l)===45&&(D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&!D(r.charCodeAt(l+3))?(t.region=s.slice(l+1,l+3),l+=3):$(r.charCodeAt(l+1))&&$(r.charCodeAt(l+2))&&$(r.charCodeAt(l+3))&&!$(r.charCodeAt(l+4))&&(t.region=s.slice(l+1,l+4),l+=4));r.charCodeAt(l)===45;){let a=l+1,o=a;for(;Y(r.charCodeAt(o));){if(o-a>7)return i(o,1,"Too long variant, expected at most 8 characters");o++}if(o-a>4||o-a>3&&$(r.charCodeAt(a)))t.variants.push(s.slice(a,o)),l=o;else break}for(;r.charCodeAt(l)===45&&!(r.charCodeAt(l+1)===120||!Y(r.charCodeAt(l+1))||r.charCodeAt(l+2)!==45||!Y(r.charCodeAt(l+3)));){let a=l+2,o=0;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1))&&Y(r.charCodeAt(a+2));){let h=a+1;for(a=h+2,o++;Y(r.charCodeAt(a));){if(a-h>7)return i(a,2,"Too long extension, expected at most 8 characters");a++}}if(!o)return i(a,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:s.charAt(l+1),extensions:s.slice(l+3,a).split("-")}),l=a}}else l=0;if(l===0&&r.charCodeAt(l)===120||r.charCodeAt(l)===45&&r.charCodeAt(l+1)===120){l=l?l+2:1;let a=l;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1));){let o=l+1;for(a=o;Y(r.charCodeAt(a));){if(a-o>7)return i(a,5,"Too long private-use area, expected at most 8 characters");a++}t.privateuse.push(s.slice(l+1,a)),l=a}}if(l!==s.length)return i(l,6,"Found superfluous content after tag");return t;function i(a,o,h){return e.warning&&e.warning(h,o,a),e.forgiving?t:un()}}function un(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function cn(n,e,t){let s=n.slice();return s[8]=e[t][0],s[9]=e[t][1],s}function bs(n){let e,t,s,r,l,i=n[0]&&_n(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[3](30)}`,r=M(),l=k("p"),l.textContent=`${n[3](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=_n(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function Rs(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_=n[1].excerpt+"",f,c=n[0]&&fn(n),E=n[2].length&&hn(n);return{c(){c&&c.c(),e=M(),t=k("div"),s=k("p"),r=k("a"),i=A(l),o=M(),h=k("p"),f=M(),E&&E.c(),p(r,"class","pagefind-ui__result-link svelte-j9e30"),p(r,"href",a=n[1].meta?.url||n[1].url),p(s,"class","pagefind-ui__result-title svelte-j9e30"),p(h,"class","pagefind-ui__result-excerpt svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(u,m){c&&c.m(u,m),y(u,e,m),y(u,t,m),b(t,s),b(s,r),b(r,i),b(t,o),b(t,h),h.innerHTML=_,b(t,f),E&&E.m(t,null)},p(u,m){u[0]?c?c.p(u,m):(c=fn(u),c.c(),c.m(e.parentNode,e)):c&&(c.d(1),c=null),m&2&&l!==(l=u[1].meta?.title+"")&&N(i,l),m&2&&a!==(a=u[1].meta?.url||u[1].url)&&p(r,"href",a),m&2&&_!==(_=u[1].excerpt+"")&&(h.innerHTML=_),u[2].length?E?E.p(u,m):(E=hn(u),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(u){c&&c.d(u),u&&C(e),u&&C(t),E&&E.d()}}}function _n(n){let e;return{c(){e=k("div"),p(e,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,s){y(t,e,s)},d(t){t&&C(e)}}}function fn(n){let e,t=n[1].meta.image&&dn(n);return{c(){e=k("div"),t&&t.c(),p(e,"class","pagefind-ui__result-thumb svelte-j9e30")},m(s,r){y(s,e,r),t&&t.m(e,null)},p(s,r){s[1].meta.image?t?t.p(s,r):(t=dn(s),t.c(),t.m(e,null)):t&&(t.d(1),t=null)},d(s){s&&C(e),t&&t.d()}}}function dn(n){let e,t,s;return{c(){e=k("img"),p(e,"class","pagefind-ui__result-image svelte-j9e30"),le(e.src,t=n[1].meta?.image)||p(e,"src",t),p(e,"alt",s=n[1].meta?.image_alt||n[1].meta?.title)},m(r,l){y(r,e,l)},p(r,l){l&2&&!le(e.src,t=r[1].meta?.image)&&p(e,"src",t),l&2&&s!==(s=r[1].meta?.image_alt||r[1].meta?.title)&&p(e,"alt",s)},d(r){r&&C(e)}}}function hn(n){let e,t=n[2],s=[];for(let r=0;rn.toLocaleUpperCase();function ks(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=async f=>{t(1,a=await f.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([c])=>!i.includes(c)))},_=(f=30)=>". ".repeat(Math.floor(10+Math.random()*f));return n.$$set=f=>{"show_images"in f&&t(0,s=f.show_images),"process_result"in f&&t(4,r=f.process_result),"result"in f&&t(5,l=f.result)},n.$$.update=()=>{if(n.$$.dirty&32)e:h(l)},[s,a,o,_,r,l]}var ct=class extends q{constructor(e){super(),J(this,e,ks,Ts,G,{show_images:0,process_result:4,result:5})}},gn=ct;function En(n,e,t){let s=n.slice();return s[11]=e[t][0],s[12]=e[t][1],s}function bn(n,e,t){let s=n.slice();return s[15]=e[t],s}function Cs(n){let e,t,s,r,l,i=n[0]&&Rn(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[5](30)}`,r=M(),l=k("p"),l.textContent=`${n[5](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),p(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=Rn(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function ys(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_,f=n[0]&&Tn(n),c=n[4]&&Cn(n),E=n[3],u=[];for(let d=0;dn.toLocaleUpperCase();function vs(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=[],_=!1,f=(u,m)=>{if(u.length<=m)return u;let d=[...u].sort((R,T)=>T.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return u.filter(R=>d.includes(R.url))},c=async u=>{t(1,a=await u.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([m])=>!i.includes(m))),Array.isArray(a.sub_results)&&(t(4,_=a.sub_results?.[0]?.url===(a.meta?.url||a.url)),_?t(3,h=f(a.sub_results.slice(1),3)):t(3,h=f([...a.sub_results],3)))},E=(u=30)=>". ".repeat(Math.floor(10+Math.random()*u));return n.$$set=u=>{"show_images"in u&&t(0,s=u.show_images),"process_result"in u&&t(6,r=u.process_result),"result"in u&&t(7,l=u.result)},n.$$.update=()=>{if(n.$$.dirty&128)e:c(l)},[s,a,o,h,_,E,r,l]}var _t=class extends q{constructor(e){super(),J(this,e,vs,Ss,G,{show_images:0,process_result:6,result:7})}},An=_t;function wn(n,e,t){let s=n.slice();return s[9]=e[t][0],s[10]=e[t][1],s[11]=e,s[12]=t,s}function Fn(n,e,t){let s=n.slice();return s[13]=e[t][0],s[14]=e[t][1],s[15]=e,s[16]=t,s}function Hn(n){let e,t,s=n[3]("filters_label",n[4],n[5])+"",r,l,i=Object.entries(n[1]),a=[];for(let o=0;on.toLocaleUpperCase();function As(n,e,t){let{available_filters:s=null}=e,{show_empty_filters:r=!0}=e,{translate:l=()=>""}=e,{automatic_translations:i={}}=e,{translations:a={}}=e,o={},h=!1,_=!1;function f(c,E){o[`${c}:${E}`]=this.checked,t(0,o)}return n.$$set=c=>{"available_filters"in c&&t(1,s=c.available_filters),"show_empty_filters"in c&&t(2,r=c.show_empty_filters),"translate"in c&&t(3,l=c.translate),"automatic_translations"in c&&t(4,i=c.automatic_translations),"translations"in c&&t(5,a=c.translations)},n.$$.update=()=>{if(n.$$.dirty&130){e:if(s&&!h){t(7,h=!0);let c=Object.entries(s||{});c.length===1&&Object.entries(c[0][1])?.length<=6&&t(6,_=!0)}}},[o,s,r,l,i,a,_,h,f]}var ft=class extends q{constructor(e){super(),J(this,e,As,Ms,G,{available_filters:1,show_empty_filters:2,translate:3,automatic_translations:4,translations:5,selected_filters:0})}get selected_filters(){return this.$$.ctx[0]}},Dn=ft;var dt={};v(dt,{comments:()=>Fs,default:()=>Os,direction:()=>Hs,strings:()=>Ns,thanks_to:()=>ws});var ws="Jan Claasen ",Fs="",Hs="ltr",Ns={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},Os={thanks_to:ws,comments:Fs,direction:Hs,strings:Ns};var ht={};v(ht,{comments:()=>zs,default:()=>Is,direction:()=>Ds,strings:()=>Us,thanks_to:()=>js});var js="Maruf Alom ",zs="",Ds="ltr",Us={placeholder:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",clear_search:"\u09AE\u09C1\u099B\u09C7 \u09AB\u09C7\u09B2\u09C1\u09A8",load_more:"\u0986\u09B0\u09CB \u09AB\u09B2\u09BE\u09AB\u09B2 \u09A6\u09C7\u0996\u09C1\u09A8",search_label:"\u098F\u0987 \u0993\u09DF\u09C7\u09AC\u09B8\u09BE\u0987\u099F\u09C7 \u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",filters_label:"\u09AB\u09BF\u09B2\u09CD\u099F\u09BE\u09B0",zero_results:"[SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF",many_results:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",one_result:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",alt_search:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF. \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09C7 [DIFFERENT_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u09A6\u09C7\u0996\u09BE\u09A8\u09CB \u09B9\u099A\u09CD\u099B\u09C7",search_suggestion:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u09AC\u09BF\u09B7\u09DF\u09C7. \u09A8\u09BF\u09A8\u09CD\u09AE\u09C7\u09B0 \u09AC\u09BF\u09B7\u09DF\u09AC\u09B8\u09CD\u09A4\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09A6\u09C7\u0996\u09C1\u09A8:",searching:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u099A\u09B2\u099B\u09C7 [SEARCH_TERM]..."},Is={thanks_to:js,comments:zs,direction:Ds,strings:Us};var mt={};v(mt,{comments:()=>Ls,default:()=>Ws,direction:()=>qs,strings:()=>Bs,thanks_to:()=>Ps});var Ps="Pablo Villaverde ",Ls="",qs="ltr",Bs={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure m\xE9es resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques seg\xFCents:",searching:"Cercant [SEARCH_TERM]..."},Ws={thanks_to:Ps,comments:Ls,direction:qs,strings:Bs};var pt={};v(pt,{comments:()=>Gs,default:()=>Ys,direction:()=>Ks,strings:()=>Js,thanks_to:()=>Vs});var Vs="Jonas Smedegaard ",Gs="",Ks="ltr",Js={placeholder:"S\xF8g",clear_search:"Nulstil",load_more:"Indl\xE6s flere resultater",search_label:"S\xF8g p\xE5 dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v et af disse s\xF8geord i stedet:",searching:"S\xF8ger efter [SEARCH_TERM]..."},Ys={thanks_to:Vs,comments:Gs,direction:Ks,strings:Js};var gt={};v(gt,{comments:()=>Zs,default:()=>$s,direction:()=>Qs,strings:()=>xs,thanks_to:()=>Xs});var Xs="Jan Claasen ",Zs="",Qs="ltr",xs={placeholder:"Suche",clear_search:"L\xF6schen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse f\xFCr [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse f\xFCr [SEARCH_TERM]",one_result:"[COUNT] Ergebnis f\xFCr [SEARCH_TERM]",alt_search:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Stattdessen werden Ergebnisse f\xFCr [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche f\xFCr [SEARCH_TERM]"},$s={thanks_to:Xs,comments:Zs,direction:Qs,strings:xs};var Et={};v(Et,{comments:()=>tr,default:()=>rr,direction:()=>nr,strings:()=>sr,thanks_to:()=>er});var er="Liam Bigelow ",tr="",nr="ltr",sr={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},rr={thanks_to:er,comments:tr,direction:nr,strings:sr};var bt={};v(bt,{comments:()=>ir,default:()=>ur,direction:()=>ar,strings:()=>or,thanks_to:()=>lr});var lr="Pablo Villaverde ",ir="",ar="ltr",or={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver m\xE1s resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes b\xFAsquedas:",searching:"Buscando [SEARCH_TERM]..."},ur={thanks_to:lr,comments:ir,direction:ar,strings:or};var Rt={};v(Rt,{comments:()=>_r,default:()=>hr,direction:()=>fr,strings:()=>dr,thanks_to:()=>cr});var cr="Valtteri Laitinen ",_r="",fr="ltr",dr={placeholder:"Haku",clear_search:"Tyhjenn\xE4",load_more:"Lataa lis\xE4\xE4 tuloksia",search_label:"Hae t\xE4lt\xE4 sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. N\xE4ytet\xE4\xE4n tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},hr={thanks_to:cr,comments:_r,direction:fr,strings:dr};var Tt={};v(Tt,{comments:()=>pr,default:()=>br,direction:()=>gr,strings:()=>Er,thanks_to:()=>mr});var mr="Nicolas Friedli ",pr="",gr="ltr",Er={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de r\xE9sultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de r\xE9sultat pour [SEARCH_TERM]",many_results:"[COUNT] r\xE9sultats pour [SEARCH_TERM]",one_result:"[COUNT] r\xE9sultat pour [SEARCH_TERM]",alt_search:"Pas de r\xE9sultat pour [SEARCH_TERM]. Montre les r\xE9sultats pour [DIFFERENT_TERM] \xE0 la place",search_suggestion:"Pas de r\xE9sultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},br={thanks_to:mr,comments:pr,direction:gr,strings:Er};var kt={};v(kt,{comments:()=>Tr,default:()=>yr,direction:()=>kr,strings:()=>Cr,thanks_to:()=>Rr});var Rr="Pablo Villaverde ",Tr="",kr="ltr",Cr={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver m\xE1is resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},yr={thanks_to:Rr,comments:Tr,direction:kr,strings:Cr};var Ct={};v(Ct,{comments:()=>vr,default:()=>wr,direction:()=>Mr,strings:()=>Ar,thanks_to:()=>Sr});var Sr="Amit Yadav ",vr="",Mr="ltr",Ar={placeholder:"\u0916\u094B\u091C\u0947\u0902",clear_search:"\u0938\u093E\u092B \u0915\u0930\u0947\u0902",load_more:"\u0914\u0930 \u0905\u0927\u093F\u0915 \u092A\u0930\u093F\u0923\u093E\u092E \u0932\u094B\u0921 \u0915\u0930\u0947\u0902",search_label:"\u0907\u0938 \u0938\u093E\u0907\u091F \u092E\u0947\u0902 \u0916\u094B\u091C\u0947\u0902",filters_label:"\u092B\u093C\u093F\u0932\u094D\u091F\u0930",zero_results:"\u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",many_results:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u0947",one_result:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u093E",alt_search:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0907\u0938\u0915\u0947 \u092C\u091C\u093E\u092F [DIFFERENT_TERM] \u0915\u0947 \u0932\u093F\u090F \u092A\u0930\u093F\u0923\u093E\u092E \u0926\u093F\u0916\u093E \u0930\u0939\u093E \u0939\u0948",search_suggestion:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0928\u093F\u092E\u094D\u0928\u0932\u093F\u0916\u093F\u0924 \u0916\u094B\u091C\u094B\u0902 \u092E\u0947\u0902 \u0938\u0947 \u0915\u094B\u0908 \u090F\u0915 \u0906\u091C\u093C\u092E\u093E\u090F\u0902:",searching:"[SEARCH_TERM] \u0915\u0940 \u0916\u094B\u091C \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948..."},wr={thanks_to:Sr,comments:vr,direction:Mr,strings:Ar};var yt={};v(yt,{comments:()=>Hr,default:()=>jr,direction:()=>Nr,strings:()=>Or,thanks_to:()=>Fr});var Fr="Diomed ",Hr="",Nr="ltr",Or={placeholder:"Tra\u017Ei",clear_search:"O\u010Disti",load_more:"U\u010Ditaj vi\u0161e rezultata",search_label:"Pretra\u017Ei ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Poku\u0161aj s jednom od ovih pretraga:",searching:"Pretra\u017Eujem [SEARCH_TERM]..."},jr={thanks_to:Fr,comments:Hr,direction:Nr,strings:Or};var St={};v(St,{comments:()=>Dr,default:()=>Pr,direction:()=>Ur,strings:()=>Ir,thanks_to:()=>zr});var zr="Adam Laki ",Dr="",Ur="ltr",Ir={placeholder:"Keres\xE9s",clear_search:"T\xF6rl\xE9s",load_more:"Tov\xE1bbi tal\xE1latok bet\xF6lt\xE9se",search_label:"Keres\xE9s az oldalon",filters_label:"Sz\u0171r\xE9s",zero_results:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",many_results:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",one_result:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",alt_search:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Tal\xE1latok mutat\xE1sa ink\xE1bb a(z) [DIFFERENT_TERM] kifejez\xE9sre",search_suggestion:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Pr\xF3b\xE1ld meg a k\xF6vetkez\u0151 keres\xE9sek egyik\xE9t:",searching:"Keres\xE9s a(z) [SEARCH_TERM] kifejez\xE9sre..."},Pr={thanks_to:zr,comments:Dr,direction:Ur,strings:Ir};var vt={};v(vt,{comments:()=>qr,default:()=>Vr,direction:()=>Br,strings:()=>Wr,thanks_to:()=>Lr});var Lr="Nixentric",qr="",Br="ltr",Wr={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},Vr={thanks_to:Lr,comments:qr,direction:Br,strings:Wr};var Mt={};v(Mt,{comments:()=>Kr,default:()=>Xr,direction:()=>Jr,strings:()=>Yr,thanks_to:()=>Gr});var Gr="Cosette Bruhns Alonso, Andrew Janco ",Kr="",Jr="ltr",Yr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra pi\xF9 risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},Xr={thanks_to:Gr,comments:Kr,direction:Jr,strings:Yr};var At={};v(At,{comments:()=>Qr,default:()=>el,direction:()=>xr,strings:()=>$r,thanks_to:()=>Zr});var Zr="Tate",Qr="",xr="ltr",$r={placeholder:"\u691C\u7D22",clear_search:"\u6D88\u3059",load_more:"\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080",search_label:"\u3053\u306E\u30B5\u30A4\u30C8\u3092\u691C\u7D22",filters_label:"\u30D5\u30A3\u30EB\u30BF",zero_results:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F",many_results:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",one_result:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",alt_search:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002[DIFFERENT_TERM]\u306E\u691C\u7D22\u7D50\u679C\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059",search_suggestion:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u691C\u7D22\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044",searching:"[SEARCH_TERM]\u3092\u691C\u7D22\u3057\u3066\u3044\u307E\u3059"},el={thanks_to:Zr,comments:Qr,direction:xr,strings:$r};var wt={};v(wt,{comments:()=>nl,default:()=>ll,direction:()=>sl,strings:()=>rl,thanks_to:()=>tl});var tl="",nl="",sl="ltr",rl={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta \u0113tahi otinga k\u0113",search_label:"Rapu",filters_label:"T\u0101tari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga k\u0113 ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakam\u0101tau ki ng\u0101 mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},ll={thanks_to:tl,comments:nl,direction:sl,strings:rl};var Ft={};v(Ft,{comments:()=>al,default:()=>cl,direction:()=>ol,strings:()=>ul,thanks_to:()=>il});var il="Paul van Brouwershaven",al="",ol="ltr",ul={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},cl={thanks_to:il,comments:al,direction:ol,strings:ul};var Ht={};v(Ht,{comments:()=>fl,default:()=>ml,direction:()=>dl,strings:()=>hl,thanks_to:()=>_l});var _l="Christopher Wingate",fl="",dl="ltr",hl={placeholder:"S\xF8k",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"S\xF8k p\xE5 denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v en av disse s\xF8keordene i stedet:",searching:"S\xF8ker etter [SEARCH_TERM]"},ml={thanks_to:_l,comments:fl,direction:dl,strings:hl};var Nt={};v(Nt,{comments:()=>gl,default:()=>Rl,direction:()=>El,strings:()=>bl,thanks_to:()=>pl});var pl="",gl="",El="ltr",bl={placeholder:"Szukaj",clear_search:"Wyczy\u015B\u0107",load_more:"Za\u0142aduj wi\u0119cej",search_label:"Przeszukaj t\u0119 stron\u0119",filters_label:"Filtry",zero_results:"Brak wynik\xF3w dla [SEARCH_TERM]",many_results:"[COUNT] wynik\xF3w dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wynik\xF3w dla [SEARCH_TERM]. Wy\u015Bwietlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wynik\xF3w dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Rl={thanks_to:pl,comments:gl,direction:El,strings:bl};var Ot={};v(Ot,{comments:()=>kl,default:()=>Sl,direction:()=>Cl,strings:()=>yl,thanks_to:()=>Tl});var Tl="Jonatah",kl="",Cl="ltr",yl={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},Sl={thanks_to:Tl,comments:kl,direction:Cl,strings:yl};var jt={};v(jt,{comments:()=>Ml,default:()=>Fl,direction:()=>Al,strings:()=>wl,thanks_to:()=>vl});var vl="Aleksandr Gordeev",Ml="",Al="ltr",wl={placeholder:"\u041F\u043E\u0438\u0441\u043A",clear_search:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u043B\u0435",load_more:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0435\u0449\u0435",search_label:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0441\u0430\u0439\u0442\u0443",filters_label:"\u0424\u0438\u043B\u044C\u0442\u0440\u044B",zero_results:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",alt_search:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u044B \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [DIFFERENT_TERM]",search_suggestion:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0438\u0437 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",searching:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]"},Fl={thanks_to:vl,comments:Ml,direction:Al,strings:wl};var zt={};v(zt,{comments:()=>Nl,default:()=>zl,direction:()=>Ol,strings:()=>jl,thanks_to:()=>Hl});var Hl="Andrija Sagicc",Nl="",Ol="ltr",jl={placeholder:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430",clear_search:"\u0411\u0440\u0438\u0441\u0430\u045A\u0435",load_more:"\u041F\u0440\u0438\u043A\u0430\u0437 \u0432\u0438\u0448\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430",search_label:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0430\u0458\u0442\u0430",filters_label:"\u0424\u0438\u043B\u0442\u0435\u0440\u0438",zero_results:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",alt_search:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u0440\u0438\u043A\u0430\u0437 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043A \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [DIFFERENT_TERM]",search_suggestion:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0441\u0430 \u043D\u0435\u043A\u043E\u043C \u043E\u0434 \u0441\u043B\u0435\u0434\u0435\u045B\u0438\u0445 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430:",searching:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0442\u0435\u0440\u043C\u0438\u043D\u0430 [SEARCH_TERM]..."},zl={thanks_to:Hl,comments:Nl,direction:Ol,strings:jl};var Dt={};v(Dt,{comments:()=>Ul,default:()=>Ll,direction:()=>Il,strings:()=>Pl,thanks_to:()=>Dl});var Dl="Montazar Al-Jaber ",Ul="",Il="ltr",Pl={placeholder:"S\xF6k",clear_search:"Rensa",load_more:"Visa fler tr\xE4ffar",search_label:"S\xF6k p\xE5 denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga tr\xE4ffar",many_results:"[SEARCH_TERM] gav [COUNT] tr\xE4ffar",one_result:"[SEARCH_TERM] gav [COUNT] tr\xE4ff",alt_search:"[SEARCH_TERM] gav inga tr\xE4ffar. Visar resultat f\xF6r [DIFFERENT_TERM] ist\xE4llet",search_suggestion:"[SEARCH_TERM] gav inga tr\xE4ffar. F\xF6rs\xF6k igen med en av f\xF6ljande s\xF6kord:",searching:"S\xF6ker efter [SEARCH_TERM]..."},Ll={thanks_to:Dl,comments:Ul,direction:Il,strings:Pl};var Ut={};v(Ut,{comments:()=>Bl,default:()=>Gl,direction:()=>Wl,strings:()=>Vl,thanks_to:()=>ql});var ql="",Bl="",Wl="ltr",Vl={placeholder:"\u0BA4\u0BC7\u0B9F\u0BC1\u0B95",clear_search:"\u0B85\u0BB4\u0BBF\u0B95\u0BCD\u0B95\u0BC1\u0B95",load_more:"\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95",search_label:"\u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BB3\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B95",filters_label:"\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",zero_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8",many_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 [COUNT] \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD",one_result:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1",alt_search:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD\u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8, \u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B92\u0BA4\u0BCD\u0BA4 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8.\u0B87\u0BA4\u0BB1\u0BCD\u0B95\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC0\u0B9F\u0BBE\u0BA9 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC8 \u0BA4\u0BC7\u0B9F\u0BC1\u0B95:",searching:"[SEARCH_TERM] \u0BA4\u0BC7\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1"},Gl={thanks_to:ql,comments:Bl,direction:Wl,strings:Vl};var It={};v(It,{comments:()=>Jl,default:()=>Zl,direction:()=>Yl,strings:()=>Xl,thanks_to:()=>Kl});var Kl="Taylan \xD6zg\xFCr Bildik",Jl="",Yl="ltr",Xl={placeholder:"Ara\u015Ft\u0131r",clear_search:"Temizle",load_more:"Daha fazla sonu\xE7",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] i\xE7in sonu\xE7 yok",many_results:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",one_result:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",alt_search:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Bunun yerine [DIFFERENT_TERM] i\xE7in sonu\xE7lar g\xF6steriliyor",search_suggestion:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Alternatif olarak a\u015Fa\u011F\u0131daki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] ara\u015Ft\u0131r\u0131l\u0131yor..."},Zl={thanks_to:Kl,comments:Jl,direction:Yl,strings:Xl};var Pt={};v(Pt,{comments:()=>xl,default:()=>ti,direction:()=>$l,strings:()=>ei,thanks_to:()=>Ql});var Ql="Long Nhat Nguyen",xl="",$l="ltr",ei={placeholder:"T\xECm ki\u1EBFm",clear_search:"X\xF3a",load_more:"Nhi\u1EC1u k\u1EBFt qu\u1EA3 h\u01A1n",search_label:"T\xECm ki\u1EBFm trong trang n\xE0y",filters_label:"B\u1ED9 l\u1ECDc",zero_results:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",many_results:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",one_result:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",alt_search:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Ki\u1EC3m th\u1ECB k\u1EBFt qu\u1EA3 thay th\u1EBF v\u1EDBi [DIFFERENT_TERM]",search_suggestion:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Th\u1EED m\u1ED9t trong c\xE1c t\xECm ki\u1EBFm:",searching:"\u0110ang t\xECm ki\u1EBFm cho [SEARCH_TERM]..."},ti={thanks_to:Ql,comments:xl,direction:$l,strings:ei};var Lt={};v(Lt,{comments:()=>si,default:()=>ii,direction:()=>ri,strings:()=>li,thanks_to:()=>ni});var ni="Amber Song",si="",ri="ltr",li={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},ii={thanks_to:ni,comments:si,direction:ri,strings:li};var qt={};v(qt,{comments:()=>oi,default:()=>_i,direction:()=>ui,strings:()=>ci,thanks_to:()=>ai});var ai="Amber Song",oi="",ui="ltr",ci={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F09\u66F4\u591A\u7D50\u679C",search_label:"\u7AD9\u5167\u641C\u7D22",filters_label:"\u7BE9\u9078",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",many_results:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",one_result:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u6539\u70BA\u986F\u793A [DIFFERENT_TERM] \u7684\u76F8\u95DC\u7D50\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u8ACB\u5617\u8A66\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},_i={thanks_to:ai,comments:oi,direction:ui,strings:ci};var Bt={};v(Bt,{comments:()=>di,default:()=>pi,direction:()=>hi,strings:()=>mi,thanks_to:()=>fi});var fi="Amber Song",di="",hi="ltr",mi={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},pi={thanks_to:fi,comments:di,direction:hi,strings:mi};var gi=[dt,ht,mt,pt,gt,Et,bt,Rt,Tt,kt,Ct,yt,St,vt,Mt,At,wt,Ft,Ht,Nt,Ot,jt,zt,Dt,Ut,It,Pt,Lt,qt,Bt],Un=gi,In=["../../translations/af.json","../../translations/bn.json","../../translations/ca.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/ta.json","../../translations/tr.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function Pn(n,e,t){let s=n.slice();return s[48]=e[t],s}function Ln(n){let e,t,s;function r(i){n[34](i)}let l={show_empty_filters:n[4],available_filters:n[16],translate:n[18],automatic_translations:n[17],translations:n[5]};return n[7]!==void 0&&(l.selected_filters=n[7]),e=new Dn({props:l}),re.push(()=>an(e,"selected_filters",r)),{c(){Ze(e.$$.fragment)},m(i,a){he(e,i,a),s=!0},p(i,a){let o={};a[0]&16&&(o.show_empty_filters=i[4]),a[0]&65536&&(o.available_filters=i[16]),a[0]&131072&&(o.automatic_translations=i[17]),a[0]&32&&(o.translations=i[5]),!t&&a[0]&128&&(t=!0,o.selected_filters=i[7],nn(()=>t=!1)),e.$set(o)},i(i){s||(z(e.$$.fragment,i),s=!0)},o(i){I(e.$$.fragment,i),s=!1},d(i){oe(e,i)}}}function qn(n){let e,t,s,r,l=[Ri,bi],i=[];function a(o,h){return o[12]?0:1}return t=a(n,[-1,-1]),s=i[t]=l[t](n),{c(){e=k("div"),s.c(),p(e,"class","pagefind-ui__results-area svelte-e9gkc3")},m(o,h){y(o,e,h),i[t].m(e,null),r=!0},p(o,h){let _=t;t=a(o,h),t===_?i[t].p(o,h):(ie(),I(i[_],1,1,()=>{i[_]=null}),ae(),s=i[t],s?s.p(o,h):(s=i[t]=l[t](o),s.c()),z(s,1),s.m(e,null))},i(o){r||(z(s),r=!0)},o(o){I(s),r=!1},d(o){o&&C(e),i[t].d()}}}function bi(n){let e,t,s,r=[],l=new Map,i,a,o;function h(m,d){return m[11].results.length===0?Ci:m[11].results.length===1?ki:Ti}let _=h(n,[-1,-1]),f=_(n),c=n[11].results.slice(0,n[15]),E=m=>m[48].id;for(let m=0;mn[15]&&Wn(n);return{c(){e=k("p"),f.c(),t=M(),s=k("ol");for(let m=0;mm[15]?u?u.p(m,d):(u=Wn(m),u.c(),u.m(a.parentNode,a)):u&&(u.d(1),u=null)},i(m){if(!o){for(let d=0;d{o[c]=null}),ae(),r=o[s],r?r.p(e,f):(r=o[s]=a[s](e),r.c()),z(r,1),r.m(l.parentNode,l))},i(_){i||(z(r),i=!0)},o(_){I(r),i=!1},d(_){_&&C(t),o[s].d(_),_&&C(l)}}}function Wn(n){let e,t=n[18]("load_more",n[17],n[5])+"",s,r,l;return{c(){e=k("button"),s=A(t),p(e,"type","button"),p(e,"class","pagefind-ui__button svelte-e9gkc3")},m(i,a){y(i,e,a),b(e,s),r||(l=K(e,"click",n[20]),r=!0)},p(i,a){a[0]&131104&&t!==(t=i[18]("load_more",i[17],i[5])+"")&&N(s,t)},d(i){i&&C(e),r=!1,l()}}}function Vn(n){let e,t=n[18]("searching",n[17],n[5]).replace(/\[SEARCH_TERM\]/,n[14])+"",s;return{c(){e=k("p"),s=A(t),p(e,"class","pagefind-ui__message svelte-e9gkc3")},m(r,l){y(r,e,l),b(e,s)},p(r,l){l[0]&147488&&t!==(t=r[18]("searching",r[17],r[5]).replace(/\[SEARCH_TERM\]/,r[14])+"")&&N(s,t)},d(r){r&&C(e)}}}function vi(n){let e,t,s,r,l,i,a=n[18]("clear_search",n[17],n[5])+"",o,h,_,f,c,E,u,m,d=n[10]&&Ln(n),R=n[13]&&qn(n);return{c(){e=k("div"),t=k("form"),s=k("input"),l=M(),i=k("button"),o=A(a),h=M(),_=k("div"),d&&d.c(),f=M(),R&&R.c(),p(s,"class","pagefind-ui__search-input svelte-e9gkc3"),p(s,"type","text"),p(s,"placeholder",r=n[18]("placeholder",n[17],n[5])),p(s,"autocapitalize","none"),p(s,"enterkeyhint","search"),p(i,"class","pagefind-ui__search-clear svelte-e9gkc3"),W(i,"pagefind-ui__suppressed",!n[6]),p(_,"class","pagefind-ui__drawer svelte-e9gkc3"),W(_,"pagefind-ui__hidden",!n[13]),p(t,"class","pagefind-ui__form svelte-e9gkc3"),p(t,"role","search"),p(t,"aria-label",c=n[18]("search_label",n[17],n[5])),p(t,"action","javascript:void(0);"),p(e,"class","pagefind-ui svelte-e9gkc3"),W(e,"pagefind-ui--reset",n[0])},m(T,S){y(T,e,S),b(e,t),b(t,s),it(s,n[6]),n[31](s),b(t,l),b(t,i),b(i,o),n[32](i),b(t,h),b(t,_),d&&d.m(_,null),b(_,f),R&&R.m(_,null),E=!0,u||(m=[K(s,"focus",n[19]),K(s,"keydown",n[29]),K(s,"input",n[30]),K(i,"click",n[33]),K(t,"submit",Mi)],u=!0)},p(T,S){(!E||S[0]&131104&&r!==(r=T[18]("placeholder",T[17],T[5])))&&p(s,"placeholder",r),S[0]&64&&s.value!==T[6]&&it(s,T[6]),(!E||S[0]&131104)&&a!==(a=T[18]("clear_search",T[17],T[5])+"")&&N(o,a),(!E||S[0]&64)&&W(i,"pagefind-ui__suppressed",!T[6]),T[10]?d?(d.p(T,S),S[0]&1024&&z(d,1)):(d=Ln(T),d.c(),z(d,1),d.m(_,f)):d&&(ie(),I(d,1,1,()=>{d=null}),ae()),T[13]?R?(R.p(T,S),S[0]&8192&&z(R,1)):(R=qn(T),R.c(),z(R,1),R.m(_,null)):R&&(ie(),I(R,1,1,()=>{R=null}),ae()),(!E||S[0]&8192)&&W(_,"pagefind-ui__hidden",!T[13]),(!E||S[0]&131104&&c!==(c=T[18]("search_label",T[17],T[5])))&&p(t,"aria-label",c),(!E||S[0]&1)&&W(e,"pagefind-ui--reset",T[0])},i(T){E||(z(d),z(R),E=!0)},o(T){I(d),I(R),E=!1},d(T){T&&C(e),n[31](null),n[32](null),d&&d.d(),R&&R.d(),u=!1,V(m)}}}var Mi=n=>n.preventDefault();function Ai(n,e,t){let s={},r=In.map(g=>g.match(/([^\/]+)\.json$/)[1]);for(let g=0;gO[g]??H[g]??"";at(()=>{let g=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Qe(g.toLocaleLowerCase());t(17,Yt=s[`${H.language}-${H.script}-${H.region}`]||s[`${H.language}-${H.region}`]||s[`${H.language}`]||s.en)}),ot(()=>{w?.destroy?.(),w=null});let Xt=async()=>{if(!U&&(t(10,U=!0),!w)){let g;try{g=await import(`${l}pagefind.js`)}catch(O){console.error(O),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` +`))}_||t(22,_=h?12:30);let H={...m||{},excerptLength:_};await g.options(H);for(let O of d){if(!O.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=O.bundlePath;delete O.bundlePath,await g.mergeIndex(L,O)}w=g,Jn()}},Jn=async()=>{w&&(Jt=await w.filters(),(!ue||!Object.keys(ue).length)&&t(16,ue=Jt))},Yn=g=>{let H={};return Object.entries(g).filter(([,O])=>O).forEach(([O])=>{let[L,ls]=O.split(/:(.*)$/);H[L]=H[L]||[],H[L].push(ls)}),H},ce,Xn=async(g,H)=>{if(!g){t(13,$e=!1),ce&&clearTimeout(ce);return}let O=Yn(H),L=()=>Zn(g,O);u>0&&g?(ce&&clearTimeout(ce),ce=setTimeout(L,u),await Zt(),w.preload(g,{filters:O})):L(),Qn()},Zt=async()=>{for(;!w;)Xt(),await new Promise(g=>setTimeout(g,50))},Zn=async(g,H)=>{t(14,Kt=g||""),typeof c=="function"&&(g=c(g)),t(12,Z=!0),t(13,$e=!0),await Zt();let O=++Gt,L=await w.search(g,{filters:H});Gt===O&&(L.filters&&Object.keys(L.filters)?.length&&t(16,ue=L.filters),t(11,P=L),t(12,Z=!1),t(15,et=i))},Qn=()=>{let g=X.offsetWidth;g!=F&&t(8,B.style.paddingRight=`${g+2}px`,B)},xn=g=>{g?.preventDefault(),t(15,et+=i)},$n=g=>{g.key==="Escape"&&(t(6,S=""),B.blur()),g.key==="Enter"&&g.preventDefault()};function es(){S=this.value,t(6,S),t(21,R)}function ts(g){re[g?"unshift":"push"](()=>{B=g,t(8,B)})}function ns(g){re[g?"unshift":"push"](()=>{X=g,t(9,X)})}let ss=()=>{t(6,S=""),B.blur()};function rs(g){Ge=g,t(7,Ge)}return n.$$set=g=>{"base_path"in g&&t(23,l=g.base_path),"page_size"in g&&t(24,i=g.page_size),"reset_styles"in g&&t(0,a=g.reset_styles),"show_images"in g&&t(1,o=g.show_images),"show_sub_results"in g&&t(2,h=g.show_sub_results),"excerpt_length"in g&&t(22,_=g.excerpt_length),"process_result"in g&&t(3,f=g.process_result),"process_term"in g&&t(25,c=g.process_term),"show_empty_filters"in g&&t(4,E=g.show_empty_filters),"debounce_timeout_ms"in g&&t(26,u=g.debounce_timeout_ms),"pagefind_options"in g&&t(27,m=g.pagefind_options),"merge_index"in g&&t(28,d=g.merge_index),"trigger_search_term"in g&&t(21,R=g.trigger_search_term),"translations"in g&&t(5,T=g.translations)},n.$$.update=()=>{if(n.$$.dirty[0]&2097152)e:R&&(t(6,S=R),t(21,R=""));if(n.$$.dirty[0]&192)e:Xn(S,Ge)},[a,o,h,f,E,T,S,Ge,B,X,U,P,Z,$e,Kt,et,ue,Yt,Kn,Xt,xn,R,_,l,i,c,u,m,d,$n,es,ts,ns,ss,rs]}var Wt=class extends q{constructor(e){super(),J(this,e,Ai,vi,G,{base_path:23,page_size:24,reset_styles:0,show_images:1,show_sub_results:2,excerpt_length:22,process_result:3,process_term:25,show_empty_filters:4,debounce_timeout_ms:26,pagefind_options:27,merge_index:28,trigger_search_term:21,translations:5},null,[-1,-1])}},Gn=Wt;var Vt;try{Vt=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1]}catch{Vt="/pagefind/"}var xe=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",s=e.bundlePath??Vt,r=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,h=e.processResult??null,_=e.processTerm??null,f=e.showEmptyFilters??!0,c=e.debounceTimeoutMs??300,E=e.mergeIndex??[],u=e.translations??[];delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations;let m=t instanceof HTMLElement?t:document.querySelector(t);m?this._pfs=new Gn({target:m,props:{base_path:s,page_size:r,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:h,process_term:_,show_empty_filters:f,debounce_timeout_ms:c,merge_index:E,translations:u,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}destroy(){this._pfs.$destroy()}};window.PagefindUI=xe;})(); diff --git a/docs/go/_/pagefind/pagefind.js b/docs/go/_/pagefind/pagefind.js new file mode 100644 index 00000000..94ab9237 --- /dev/null +++ b/docs/go/_/pagefind/pagefind.js @@ -0,0 +1,9 @@ +const pagefind_version="1.0.4";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document==='undefined'){script_src=location.href}else{script_src=new URL("UNHANDLED",location.href).toString()}let wasm;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}let WASM_VECTOR_LEN=0;function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1);getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret};const cachedTextEncoder=new TextEncoder('utf-8');const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length);getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len);const mem=getUint8Memory0();let offset=0;for(;offset0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3);const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written}WASM_VECTOR_LEN=offset;return ptr}__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=new TextDecoder('utf-8',{ignoreBOM:true,fatal:true});cachedTextDecoder.decode();function getStringFromWasm0(ptr,len){return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_indexes=function(ptr,query){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_filter_indexes=function(ptr,filters){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_all_filter_indexes=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.filters=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.search=function(ptr,query,filter,sort,exact){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ptr1=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len1=WASM_VECTOR_LEN;const ptr2=passStringToWasm0(sort,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len2=WASM_VECTOR_LEN;wasm.search(retptr,ptr,ptr0,len0,ptr1,len1,ptr2,len2,exact);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};async function load(module,imports){if(typeof Response==='function'&&module instanceof Response){if(typeof WebAssembly.instantiateStreaming==='function'){try{return await WebAssembly.instantiateStreaming(module,imports)}catch(e){if(module.headers.get('Content-Type')!='application/wasm'){console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}else{throw e}}}const bytes=await module.arrayBuffer();return await WebAssembly.instantiate(bytes,imports)}else{const instance=await WebAssembly.instantiate(module,imports);if(instance instanceof WebAssembly.Instance){return{instance,module}}else{return instance}}}function getImports(){const imports={};imports.wbg={};return imports}function initMemory(imports,maybe_memory){}function finalizeInit(instance,module){wasm=instance.exports;init.__wbindgen_wasm_module=module;cachedInt32Memory0=null;cachedUint8Memory0=null;return wasm}function initSync(module){const imports=getImports();initMemory(imports);if(!(module instanceof WebAssembly.Module)){module=new WebAssembly.Module(module)}const instance=new WebAssembly.Instance(module,imports);return finalizeInit(instance,module)}async function init(input){if(typeof input==='undefined'){input=script_src.replace(/\.js$/,'_bg.wasm')}const imports=getImports();if(typeof input==='string'||(typeof Request==='function'&&input instanceof Request)||(typeof URL==='function'&&input instanceof URL)){input=fetch(input)}initMemory(imports);const{instance,module}=await load(await input,imports);return finalizeInit(instance,module)}wasm_bindgen=Object.assign(init,{initSync},__exports)})();var u8=Uint8Array;var u16=Uint16Array;var u32=Uint32Array;var fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]);var fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);var clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var freb=function(eb,start){var b=new u16(31);for(var i2=0;i2<31;++i2){b[i2]=start+=1<>>1|(i&21845)<<1;x=(x&52428)>>>2|(x&13107)<<2;x=(x&61680)>>>4|(x&3855)<<4;rev[i]=((x&65280)>>>8|(x&255)<<8)>>>1}var x;var i;var hMap=function(cd,mb,r){var s=cd.length;var i2=0;var l=new u16(mb);for(;i2>>rvb]=sv}}}}else{co=new u16(s);for(i2=0;i2>>15-cd[i2]}}}return co};var flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;var i;for(i=144;i<256;++i)flt[i]=9;var i;for(i=256;i<280;++i)flt[i]=7;var i;for(i=280;i<288;++i)flt[i]=8;var i;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var i;var flrm=hMap(flt,9,1);var fdrm=hMap(fdt,5,1);var max=function(a){var m=a[0];for(var i2=1;i2m)m=a[i2]}return m};var bits=function(d,p,m){var o=p/8|0;return(d[o]|d[o+1]<<8)>>(p&7)&m};var bits16=function(d,p){var o=p/8|0;return(d[o]|d[o+1]<<8|d[o+2]<<16)>>(p&7)};var shft=function(p){return(p+7)/8|0};var slc=function(v,s,e){if(s==null||s<0)s=0;if(e==null||e>v.length)e=v.length;var n=new(v.BYTES_PER_ELEMENT==2?u16:v.BYTES_PER_ELEMENT==4?u32:u8)(e-s);n.set(v.subarray(s,e));return n};var ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"];var err=function(ind,msg,nt){var e=new Error(msg||ec[ind]);e.code=ind;if(Error.captureStackTrace)Error.captureStackTrace(e,err);if(!nt)throw e;return e};var inflt=function(dat,buf,st){var sl=dat.length;if(!sl||st&&st.f&&!st.l)return buf||new u8(0);var noBuf=!buf||st;var noSt=!st||st.i;if(!st)st={};if(!buf)buf=new u8(sl*3);var cbuf=function(l2){var bl=buf.length;if(l2>bl){var nbuf=new u8(Math.max(bl*2,l2));nbuf.set(buf);buf=nbuf}};var final=st.f||0,pos=st.p||0,bt=st.b||0,lm=st.l,dm=st.d,lbt=st.m,dbt=st.n;var tbts=sl*8;do{if(!lm){final=bits(dat,pos,1);var type=bits(dat,pos+1,3);pos+=3;if(!type){var s=shft(pos)+4,l=dat[s-4]|dat[s-3]<<8,t=s+l;if(t>sl){if(noSt)err(0);break}if(noBuf)cbuf(bt+l);buf.set(dat.subarray(s,t),bt);st.b=bt+=l,st.p=pos=t*8,st.f=final;continue}else if(type==1)lm=flrm,dm=fdrm,lbt=9,dbt=5;else if(type==2){var hLit=bits(dat,pos,31)+257,hcLen=bits(dat,pos+10,15)+4;var tl=hLit+bits(dat,pos+5,31)+1;pos+=14;var ldt=new u8(tl);var clt=new u8(19);for(var i2=0;i2>>4;if(s<16){ldt[i2++]=s}else{var c=0,n=0;if(s==16)n=3+bits(dat,pos,3),pos+=2,c=ldt[i2-1];else if(s==17)n=3+bits(dat,pos,7),pos+=3;else if(s==18)n=11+bits(dat,pos,127),pos+=7;while(n--)ldt[i2++]=c}}var lt=ldt.subarray(0,hLit),dt=ldt.subarray(hLit);lbt=max(lt);dbt=max(dt);lm=hMap(lt,lbt,1);dm=hMap(dt,dbt,1)}else err(1);if(pos>tbts){if(noSt)err(0);break}}if(noBuf)cbuf(bt+131072);var lms=(1<>>4;pos+=c&15;if(pos>tbts){if(noSt)err(0);break}if(!c)err(2);if(sym<256)buf[bt++]=sym;else if(sym==256){lpos=pos,lm=null;break}else{var add=sym-254;if(sym>264){var i2=sym-257,b=fleb[i2];add=bits(dat,pos,(1<>>4;if(!d)err(3);pos+=d&15;var dt=fd[dsym];if(dsym>3){var b=fdeb[dsym];dt+=bits16(dat,pos)&(1<tbts){if(noSt)err(0);break}if(noBuf)cbuf(bt+131072);var end=bt+add;for(;bt>3&1)+(flg>>4&1);zs>0;zs-=!d[st++]);return st+(flg&2)};var gzl=function(d){var l=d.length;return(d[l-4]|d[l-3]<<8|d[l-2]<<16|d[l-1]<<24)>>>0};function gunzipSync(data,out){return inflt(data.subarray(gzs(data),-8),out||new u8(gzl(data)))}var td=typeof TextDecoder!="undefined"&&new TextDecoder();var tds=0;try{td.decode(et,{stream:true});tds=1}catch(e){}var gz_default=gunzipSync;var calculate_excerpt_region=(word_positions,excerpt_length)=>{if(word_positions.length===0){return 0}let words=[];for(const word of word_positions){words[word.location]=words[word.location]||0;words[word.location]+=word.balanced_score}if(words.length<=excerpt_length){return 0}let densest=words.slice(0,excerpt_length).reduce((partialSum,a)=>partialSum+a,0);let working_sum=densest;let densest_at=[0];for(let i2=0;i2densest){densest=working_sum;densest_at=[i2]}else if(working_sum===densest&&densest_at[densest_at.length-1]===i2-1){densest_at.push(i2)}}let midpoint=densest_at[Math.floor(densest_at.length/2)];return midpoint};var build_excerpt=(content,start,length,locations,not_before,not_from)=>{let is_zws_delimited=content.includes("\u200B");let fragment_words=[];if(is_zws_delimited){fragment_words=content.split("\u200B")}else{fragment_words=content.split(/[\r\n\s]+/g)}for(let word of locations){if(fragment_words[word]?.startsWith(``)){continue}fragment_words[word]=`${fragment_words[word]}`}let endcap=not_from??fragment_words.length;let startcap=not_before??0;if(endcap-startcapendcap){start=endcap-length}if(start{const anchors=fragment.anchors.filter((a)=>/h\d/i.test(a.element)&&a.text?.length&&/\S/.test(a.text)).sort((a,b)=>a.location-b.location);const results=[];let current_anchor_position=0;let current_anchor={title:fragment.meta["title"],url:fragment.url,weighted_locations:[],locations:[],excerpt:""};const add_result=(end_range)=>{if(current_anchor.locations.length){const relative_weighted_locations=current_anchor.weighted_locations.map((l)=>{return{weight:l.weight,balanced_score:l.balanced_score,location:l.location-current_anchor_position}});const excerpt_start=calculate_excerpt_region(relative_weighted_locations,desired_excerpt_length)+current_anchor_position;const excerpt_length=end_range?Math.min(end_range-excerpt_start,desired_excerpt_length):desired_excerpt_length;current_anchor.excerpt=build_excerpt(fragment.raw_content??"",excerpt_start,excerpt_length,current_anchor.locations,current_anchor_position,end_range);results.push(current_anchor)}};for(let word of fragment.weighted_locations){if(!anchors.length||word.location=anchors[0].location){next_anchor=anchors.shift()}let anchored_url=fragment.url;try{const url_is_fq=/^((https?:)?\/\/)/.test(anchored_url);if(url_is_fq){let fq_url=new URL(anchored_url);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString()}else{if(!/^\//.test(anchored_url)){anchored_url=`/${anchored_url}`}let fq_url=new URL(`https://example.com${anchored_url}`);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString().replace(/^https:\/\/example.com/,"")}}catch(e){console.error(`Pagefind: Couldn't process ${anchored_url} for a search result`)}current_anchor_position=next_anchor.location;current_anchor={title:next_anchor.text,url:anchored_url,anchor:next_anchor,weighted_locations:[word],locations:[word.location],excerpt:""}}}add_result(anchors[0]?.location);return results};var asyncSleep=async(ms=100)=>{return new Promise((r)=>setTimeout(r,ms))};var PagefindInstance=class{constructor(opts={}){this.version=pagefind_version;this.backend=wasm_bindgen;this.decoder=new TextDecoder("utf-8");this.wasm=null;this.basePath=opts.basePath||"/pagefind/";this.primary=opts.primary||false;if(this.primary&&!opts.basePath){this.initPrimary()}if(/[^\/]$/.test(this.basePath)){this.basePath=`${this.basePath}/`}if(window?.location?.origin&&this.basePath.startsWith(window.location.origin)){this.basePath=this.basePath.replace(window.location.origin,"")}this.baseUrl=opts.baseUrl||this.defaultBaseUrl();if(!/^(\/|https?:\/\/)/.test(this.baseUrl)){this.baseUrl=`/${this.baseUrl}`}this.indexWeight=opts.indexWeight??1;this.excerptLength=opts.excerptLength??30;this.mergeFilter=opts.mergeFilter??{};this.highlightParam=opts.highlightParam??null;this.loaded_chunks={};this.loaded_filters={};this.loaded_fragments={};this.raw_ptr=null;this.searchMeta=null;this.languages=null}initPrimary(){let derivedBasePath=import.meta.url.match(/^(.*\/)pagefind.js.*$/)?.[1];if(derivedBasePath){this.basePath=derivedBasePath}else{console.warn(["Pagefind couldn't determine the base of the bundle from the import path. Falling back to the default.","Set a basePath option when initialising Pagefind to ignore this message."].join("\n"))}}defaultBaseUrl(){let default_base=this.basePath.match(/^(.*\/)_?pagefind/)?.[1];return default_base||"/"}async options(options2){const opts=["basePath","baseUrl","indexWeight","excerptLength","mergeFilter","highlightParam"];for(const[k,v]of Object.entries(options2)){if(k==="mergeFilter"){let filters2=this.stringifyFilters(v);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}else if(opts.includes(k)){if(k==="basePath"&&typeof v==="string")this.basePath=v;if(k==="baseUrl"&&typeof v==="string")this.baseUrl=v;if(k==="indexWeight"&&typeof v==="number")this.indexWeight=v;if(k==="excerptLength"&&typeof v==="number")this.excerptLength=v;if(k==="mergeFilter"&&typeof v==="object")this.mergeFilter=v;if(k==="highlightParam"&&typeof v==="string")this.highlightParam=v}else{console.warn(`Unknown Pagefind option ${k}. Allowed options: [${opts.join(", ")}]`)}}}decompress(data,file="unknown file"){if(this.decoder.decode(data.slice(0,12))==="pagefind_dcd"){return data.slice(12)}data=gz_default(data);if(this.decoder.decode(data.slice(0,12))!=="pagefind_dcd"){console.error(`Decompressing ${file} appears to have failed: Missing signature`);return data}return data.slice(12)}async init(language,opts){await this.loadEntry();let index=this.findIndex(language);let lang_wasm=index.wasm?index.wasm:"unknown";let resources=[this.loadMeta(index.hash)];if(opts.load_wasm===true){resources.push(this.loadWasm(lang_wasm))}await Promise.all(resources);this.raw_ptr=this.backend.init_pagefind(new Uint8Array(this.searchMeta));if(Object.keys(this.mergeFilter)?.length){let filters2=this.stringifyFilters(this.mergeFilter);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}}async loadEntry(){try{let entry_response=await fetch(`${this.basePath}pagefind-entry.json?ts=${Date.now()}`);let entry_json=await entry_response.json();this.languages=entry_json.languages;if(entry_json.version!==this.version){if(this.primary){console.warn(["Pagefind JS version doesn't match the version in your search index.",`Pagefind JS: ${this.version}. Pagefind index: ${entry_json.version}`,"If you upgraded Pagefind recently, you likely have a cached pagefind.js file.","If you encounter any search errors, try clearing your cache."].join("\n"))}else{console.warn(["Merging a Pagefind index from a different version than the main Pagefind instance.",`Main Pagefind JS: ${this.version}. Merged index (${this.basePath}): ${entry_json.version}`,"If you encounter any search errors, make sure that both sites are running the same version of Pagefind."].join("\n"))}}}catch(e){console.error(`Failed to load Pagefind metadata: +${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index: +${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM: +${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM: +${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}: +${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(//g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}parseFilters(str){let output={};if(!str)return output;for(const block of str.split("__PF_FILTER_DELIM__")){let[filter,values]=block.split(/:(.*)$/);output[filter]={};if(values){for(const valueBlock of values.split("__PF_VALUE_DELIM__")){if(valueBlock){let extract=valueBlock.match(/^(.*):(\d+)$/);if(extract){let[,value,count]=extract;output[filter][value]=parseInt(count)??count}}}}}return output}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_chunks=filters2.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks]);ptr=await this.getPtr();let results=this.backend.filters(ptr);return this.parseFilters(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}term=term.toLowerCase().trim().replace(/[\.`~!@#\$%\^&\*\(\)\{\}\[\]\\\|:;'",<>\/\?\-]/g,"").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let chunks=index_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...chunks,...filter_chunks]);log(`Loaded necessary chunks to run search`);if(options2.preload){log(`Preload \u2014 bailing out of search operation now.`);return null}ptr=await this.getPtr();let searchStart=Date.now();let result=this.backend.search(ptr,term,filter_list,sort_list,exact_search);log(`Got the raw search result: ${result}`);let[unfilteredResultCount,all_results,filters2,totalFilters]=result.split(/:([^:]*):(.*)__PF_UNFILTERED_DELIM__(.*)$/);let filterObj=this.parseFilters(filters2);let totalFilterObj=this.parseFilters(totalFilters);log(`Remaining filters: ${JSON.stringify(result)}`);let results=all_results.length?all_results.split(" "):[];let resultsInterface=results.map((result2)=>{let[hash,score,all_locations]=result2.split("@");log(`Processing result: + hash:${hash} + score:${score} + locations:${all_locations}`);let weighted_locations=all_locations.length?all_locations.split(",").map((l)=>{let[weight,balanced_score,location]=l.split(">");return{weight:parseInt(weight)/24,balanced_score:parseFloat(balanced_score),location:parseInt(location)}}):[];let locations=weighted_locations.map((l)=>l.location);return{id:hash,score:parseFloat(score)*this.indexWeight,words:locations,data:async()=>await this.loadFragment(hash,weighted_locations,term)}});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);return{results:resultsInterface,unfilteredResultCount:parseInt(unfilteredResultCount),filters:filterObj,totalFilters:totalFilterObj,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}}}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async init(overrideLanguage){if(document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);return{results,unfilteredResultCount,filters:filters2,totalFilters,timings}}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta b/docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta new file mode 100644 index 0000000000000000000000000000000000000000..f927785aa80766b3c8855a38c0608923a74540fa GIT binary patch literal 154 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 + + + + + + + + + + +elastic + + + +

    package elastic

    +
    import "backend/app/internal/elastic"
    +

    Index

    +

    Functions

    +

    func Connect

    +
    func Connect(config structs.ElasticConfig) *elasticsearch.Client
    +

    Connect - used to connect to the elasticsearch database. It will return an elasticsearch client that can be used to +perform queries on the database. +

    func DeleteDocument

    +
    func DeleteDocument(client *elasticsearch.Client, id string, index string)
    +

    DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to +be passed to the function. +

    func ParseEmbedding

    +
    func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.EmbeddingResponse) *structs.EsDocument
    +

    ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the +Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the +function. +

    func SearchDocument

    +
    func SearchDocument(client *elasticsearch.Client, query string, index string) *structs.EsDocument
    +

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need +to be passed to the function. +

    func SendDocument

    +
    func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, index string)
    +

    SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need +to be passed to the function. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/embedding/index.html b/docs/go/embedding/index.html new file mode 100644 index 00000000..1d02b8a9 --- /dev/null +++ b/docs/go/embedding/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + +embedding + + + +

    package embedding

    +
    import "backend/app/internal/embedding"
    +

    Index

    +

    Functions

    +

    func ExtractTags

    +
    func ExtractTags(fragments []string) []string
    +

    ExtractTags - extract the NL tags from a fragment (JSON document documenting a REST API), and return an array of +strings, one for each fragment. An array of fragments needs to be passed to the function. +

    func PreprocessFragment

    +
    func PreprocessFragment(fragments []string, isQuery bool) []string
    +

    PreprocessFragment - fragments are preprocessed by running a standard NLP pipeline, composed of string cleaning, +stop-word removal, and stemming. An array of fragments (string), and a boolean indicating is the fragments are +queries or not need to be passed to the function. +

    func Stemming

    +
    func Stemming(fragments []string) []string
    +

    Stemming - stem all the words contained in the given strings. An array of strings needs to be passed to the +function. +

    func StopWordRemoval

    +
    func StopWordRemoval(fragments []string) []string
    +

    StopWordRemoval - remove all stopwords from the given strings. An array of strings needs to be passed to the +function. +

    Types

    +

    type Embeddings

    +
    type Embeddings = structs.EmbeddingResponse
    +

    func Embed

    +
    func Embed(fragments []string) *Embeddings
    +

    Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of +embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. +

    func PerformPipeline

    +
    func PerformPipeline(fragments []string, isQuery bool) *Embeddings
    +

    PerformPipeline - fragments are preprocessed and embeddings are generated and returned. An array of fragments +(string) and a boolean indicating if the fragments are queries or not need to be passed to the function. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/helpers/index.html b/docs/go/helpers/index.html new file mode 100644 index 00000000..c545dc14 --- /dev/null +++ b/docs/go/helpers/index.html @@ -0,0 +1,62 @@ + + + + + + + + + + + +helpers + + + +

    package helpers

    +
    import "backend/app/internal/helpers"
    +

    Index

    +

    Functions

    +

    func GetCertificate

    +
    func GetCertificate() []byte
    +

    GetCertificate - retrieve the elasticsearch cluster certificate. +

    Types

    +

    type Config

    +
    type Config = structs.Config
    +

    func LoadConfigs

    +
    func LoadConfigs() Config
    +

    LoadConfigs - parse and store in a struct all the config values needed by the backend. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/index.html b/docs/go/index.html new file mode 100644 index 00000000..4b39340d --- /dev/null +++ b/docs/go/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + +backend/app/internal + + + +

    Directories

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    elastic
    embedding
    helpers
    mongodb
    routes
    structs
    +
    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/mongodb/index.html b/docs/go/mongodb/index.html new file mode 100644 index 00000000..75ec306e --- /dev/null +++ b/docs/go/mongodb/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + +mongodb + + + +

    package mongodb

    +
    import "backend/app/internal/mongodb"
    +

    Index

    +

    Functions

    +

    func Connect

    +
    func Connect(config structs.MongoConfig) *mongo.Client
    +

    Connect - used to connect to the mongodb database. It will return a mongodb client that can be used to perform +queries on the database. +

    func DeleteDocuments

    +
    func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    +

    DeleteDocuments - every time a documents is deleted from the database, it will be searched in the elasticsearch +index (based on the mongodb ObjectId) and deleted from the elasticsearch database. +

    func InsertDocuments

    +
    func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    +

    InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and +saved in the respective elasticsearch index. +

    func SearchDocument

    +
    func SearchDocument(database *mongo.Database, query bson.M, collection string) string
    +

    SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection +need to be passed to the function. +

    func WatchDatabase

    +
    func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string)
    +

    WatchDatabase - watch for a certain type of events in the mongodb `apis` database. The supported events are +document insertion and document deletion. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/routes/index.html b/docs/go/routes/index.html new file mode 100644 index 00000000..1389b53f --- /dev/null +++ b/docs/go/routes/index.html @@ -0,0 +1,61 @@ + + + + + + + + + + + +routes + + + +

    package routes

    +
    import "backend/app/internal/routes"
    +

    Index

    +

    Functions

    +

    func InitRetrieverRoutes

    +
    func InitRetrieverRoutes(router *gin.Engine)
    +

    func InitRoutes

    +
    func InitRoutes(router *gin.Engine)
    + +
    func Search(c *gin.Context)
    +

    Types

    +

    type EmbeddingRequest

    +
    type EmbeddingRequest = structs.EmbeddingRequest
    +
    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/go/structs/index.html b/docs/go/structs/index.html new file mode 100644 index 00000000..541a28b0 --- /dev/null +++ b/docs/go/structs/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + +structs + + + +

    package structs

    +
    import "backend/app/internal/structs"
    +

    Index

    +

    Types

    +

    type BackendConfig

    +
    type BackendConfig struct {
    +	Port int `yaml:"port"`
    +}
    +

    BackendConfig - all backend-related configurations. +

    type Config

    +
    type Config struct {
    +	Backend BackendConfig `yaml:"backend"`
    +	Mongo   MongoConfig   `yaml:"mongodb"`
    +	Elastic ElasticConfig `yaml:"elastic"`
    +}
    +

    Config - used to store all configurations needed by the backend. +

    type ElasticConfig

    +
    type ElasticConfig struct {
    +	Protocol string `yaml:"protocol"`
    +	Host     string `yaml:"host"`
    +	Port     int    `yaml:"port"`
    +	User     string `yaml:"user"`
    +	Password string `yaml:"password"`
    +}
    +

    ElasticConfig - all elasticsearch-related configurations. +

    type EmbeddingRequest

    +
    type EmbeddingRequest struct {
    +	Fragment string `json:"fragment"`
    +}
    +

    EmbeddingRequest - structure of the request to be sent to the embedding server. +

    type EmbeddingResponse

    +
    type EmbeddingResponse struct {
    +	Predictions [][]float32
    +}
    +

    EmbeddingResponse - structure of the response sent back by the embedding server. +

    type EsDocument

    +
    type EsDocument struct {
    +	MongoId    primitive.ObjectID `json:"mongo_id"`
    +	Collection string             `json:"mongo_collection"`
    +	Embedding  []float32          `json:"embedding"`
    +}
    +

    EsDocument - structure of an elasticsearch document returned by the elasticsearch client. +

    type MongoConfig

    +
    type MongoConfig struct {
    +	Protocol string `yaml:"protocol"`
    +	Host     string `yaml:"host"`
    +	Port     int    `yaml:"port"`
    +	User     string `yaml:"user"`
    +	Password string `yaml:"password"`
    +}
    +

    MongoConfig - all mongodb-related configurations. +

    type SyncDocument

    +
    type SyncDocument struct {
    +	Id         string `bson:"_id"`
    +	Collection string `bson:"coll"`
    +	Api        string
    +}
    +

    SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/go.mod b/go.mod index 8fed6ba0..ae4465ff 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/dchest/stemmer v0.0.0-20161207102402-66719a20c4b5 github.com/elastic/go-elasticsearch/v8 v8.12.1 github.com/gin-gonic/gin v1.9.1 + github.com/goccy/go-json v0.10.2 github.com/kelseyhightower/envconfig v1.4.0 github.com/writeas/go-strip-markdown v2.0.1+incompatible go.mongodb.org/mongo-driver v1.14.0 @@ -25,32 +26,31 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.19.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/golang/snappy v0.0.1 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.13.6 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/montanaflynn/stats v0.7.1 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/arch v0.7.0 // indirect - golang.org/x/crypto v0.20.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index bab364dd..33b1bf84 100644 --- a/go.sum +++ b/go.sum @@ -40,6 +40,8 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -47,6 +49,8 @@ github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dv github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -62,6 +66,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -88,6 +94,9 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= @@ -101,20 +110,31 @@ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUu golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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-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= @@ -123,6 +143,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -134,9 +156,13 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/scripts/hooks/generate-go-docs.sh b/scripts/hooks/generate-go-docs.sh new file mode 100755 index 00000000..039fa82f --- /dev/null +++ b/scripts/hooks/generate-go-docs.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cd ./app/internal || exit +doc2go -config ./doc2go.rc ./... From fa79f2eb8c1c16546d2a4bee9c9dc93b4e69d898 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 00:49:35 +0100 Subject: [PATCH 05/60] testing pre-commit hooks --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 324419ff..43129277 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,6 @@ repos: rev: v4.3.0 hooks: - id: trailing-whitespace - - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files - repo: local From 33ee906d81ddc396421e5cee8bdc708764a83edb Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 02:30:43 +0100 Subject: [PATCH 06/60] added swaggerhub documentation --- .pre-commit-config.yaml | 4 + Dockerfile | 2 +- app/internal/controller/controller.go | 16 + app/internal/controller/retrieve.go | 35 + app/internal/doc2go.rc | 2 +- app/internal/elastic/elastic.go | 4 +- app/internal/elastic/operations.go | 8 +- app/internal/elastic/parser.go | 6 +- app/internal/embedding/embedding.go | 4 +- app/internal/helpers/config.go | 4 +- app/internal/{structs => models}/config.go | 2 +- app/internal/{structs => models}/document.go | 2 +- .../{structs => models}/embeddings.go | 2 +- app/internal/mongodb/mongo.go | 4 +- app/internal/mongodb/sync.go | 6 +- app/internal/routes/retrieve.go | 29 - app/internal/routes/routes.go | 9 - app/{cmd/main => }/main.go | 16 +- docs/go/_/css/main.css | 161 --- docs/go/_/icons/apple-touch-icon.png | Bin 20698 -> 0 bytes docs/go/_/icons/favicon-16x16.png | Bin 1302 -> 0 bytes docs/go/_/icons/favicon-32x32.png | Bin 2441 -> 0 bytes docs/go/_/icons/favicon.ico | Bin 15086 -> 0 bytes docs/go/_/js/permalink.js | 44 - .../pagefind/filter/unknown_9115dcc.pf_filter | Bin 65 -> 0 bytes .../fragment/unknown_1363832.pf_fragment | Bin 388 -> 0 bytes .../fragment/unknown_95c2f17.pf_fragment | Bin 351 -> 0 bytes .../fragment/unknown_96ce833.pf_fragment | Bin 815 -> 0 bytes .../fragment/unknown_aab62d4.pf_fragment | Bin 1021 -> 0 bytes .../fragment/unknown_c53c497.pf_fragment | Bin 735 -> 0 bytes .../fragment/unknown_d9365e2.pf_fragment | Bin 686 -> 0 bytes .../_/pagefind/index/unknown_1446bce.pf_index | Bin 3986 -> 0 bytes docs/go/_/pagefind/pagefind-entry.json | 1 - docs/go/_/pagefind/pagefind-highlight.js | 1069 ----------------- docs/go/_/pagefind/pagefind-modular-ui.css | 214 ---- docs/go/_/pagefind/pagefind-modular-ui.js | 8 - docs/go/_/pagefind/pagefind-ui.css | 1 - docs/go/_/pagefind/pagefind-ui.js | 2 - docs/go/_/pagefind/pagefind.js | 9 - .../pagefind.unknown_4bda9216e98df89.pf_meta | Bin 154 -> 0 bytes docs/go/_/pagefind/wasm.unknown.pagefind | Bin 55176 -> 0 bytes docs/go/elastic/index.html | 72 -- docs/go/embedding/index.html | 85 -- docs/go/helpers/index.html | 62 - docs/go/index.html | 69 -- docs/go/mongodb/index.html | 71 -- docs/go/routes/index.html | 61 - docs/go/structs/index.html | 124 -- go.mod | 20 + go.sum | 85 +- scripts/hooks/generate-swagger-docs.sh | 4 + 51 files changed, 180 insertions(+), 2137 deletions(-) create mode 100644 app/internal/controller/controller.go create mode 100644 app/internal/controller/retrieve.go rename app/internal/{structs => models}/config.go (98%) rename app/internal/{structs => models}/document.go (97%) rename app/internal/{structs => models}/embeddings.go (94%) delete mode 100644 app/internal/routes/retrieve.go delete mode 100644 app/internal/routes/routes.go rename app/{cmd/main => }/main.go (71%) delete mode 100644 docs/go/_/css/main.css delete mode 100644 docs/go/_/icons/apple-touch-icon.png delete mode 100644 docs/go/_/icons/favicon-16x16.png delete mode 100644 docs/go/_/icons/favicon-32x32.png delete mode 100644 docs/go/_/icons/favicon.ico delete mode 100644 docs/go/_/js/permalink.js delete mode 100644 docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter delete mode 100644 docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment delete mode 100644 docs/go/_/pagefind/fragment/unknown_95c2f17.pf_fragment delete mode 100644 docs/go/_/pagefind/fragment/unknown_96ce833.pf_fragment delete mode 100644 docs/go/_/pagefind/fragment/unknown_aab62d4.pf_fragment delete mode 100644 docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment delete mode 100644 docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment delete mode 100644 docs/go/_/pagefind/index/unknown_1446bce.pf_index delete mode 100644 docs/go/_/pagefind/pagefind-entry.json delete mode 100644 docs/go/_/pagefind/pagefind-highlight.js delete mode 100644 docs/go/_/pagefind/pagefind-modular-ui.css delete mode 100644 docs/go/_/pagefind/pagefind-modular-ui.js delete mode 100644 docs/go/_/pagefind/pagefind-ui.css delete mode 100644 docs/go/_/pagefind/pagefind-ui.js delete mode 100644 docs/go/_/pagefind/pagefind.js delete mode 100644 docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta delete mode 100644 docs/go/_/pagefind/wasm.unknown.pagefind delete mode 100644 docs/go/elastic/index.html delete mode 100644 docs/go/embedding/index.html delete mode 100644 docs/go/helpers/index.html delete mode 100644 docs/go/index.html delete mode 100644 docs/go/mongodb/index.html delete mode 100644 docs/go/routes/index.html delete mode 100644 docs/go/structs/index.html create mode 100755 scripts/hooks/generate-swagger-docs.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 43129277..243e0710 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,3 +11,7 @@ repos: name: generate-go-docs entry: ./scripts/hooks/generate-go-docs.sh language: system + - id: generate-swagger-docs + name: generate-swagger-docs + entry: ./scripts/hooks/generate-swagger-docs.sh + language: system diff --git a/Dockerfile b/Dockerfile index 19e0acec..95473789 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ COPY go.* ./ RUN go mod download COPY . . -RUN go build -o /backend/build/app ./app/cmd/main +RUN go build -o /backend/build/app ./app FROM alpine:latest diff --git a/app/internal/controller/controller.go b/app/internal/controller/controller.go new file mode 100644 index 00000000..4b7feb45 --- /dev/null +++ b/app/internal/controller/controller.go @@ -0,0 +1,16 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" +) + +func SetupRoutes(router *gin.Engine) { + v1 := router.Group("/api/v1") + { + v1.POST("/search", Search) + } + + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) +} diff --git a/app/internal/controller/retrieve.go b/app/internal/controller/retrieve.go new file mode 100644 index 00000000..6e6218da --- /dev/null +++ b/app/internal/controller/retrieve.go @@ -0,0 +1,35 @@ +package controller + +import ( + "log" + "net/http" + + "backend/app/internal/embedding" + "backend/app/internal/models" + + "github.com/gin-gonic/gin" +) + +type EmbeddingRequest = models.EmbeddingRequest + +// Search godoc +// @Summary Search OpenAPI specifications +// @Description retrieve OpenAPI specifications matching the given query +// @Tags search +// @Accept json +// @Produce json +// @Success 200 {string} ok +// @Failure 400 {string} Bad Request +// @Failure 500 {string} Internal Server Error +// @Router /search [post] +func Search(ctx *gin.Context) { + var body EmbeddingRequest + err := ctx.BindJSON(&body) + + if err != nil { + ctx.JSON(http.StatusBadRequest, "") + } + + embeddings := embedding.PerformPipeline([]string{body.Fragment}, true) + log.Print(len(embeddings.Predictions[0])) +} diff --git a/app/internal/doc2go.rc b/app/internal/doc2go.rc index e4e7c38d..92e6d379 100644 --- a/app/internal/doc2go.rc +++ b/app/internal/doc2go.rc @@ -1,3 +1,3 @@ pagefind -out ../../docs/go +out ../../docs home backend/app/internal/ diff --git a/app/internal/elastic/elastic.go b/app/internal/elastic/elastic.go index f3616abd..605c23cb 100644 --- a/app/internal/elastic/elastic.go +++ b/app/internal/elastic/elastic.go @@ -5,14 +5,14 @@ import ( "log" "backend/app/internal/helpers" - "backend/app/internal/structs" + "backend/app/internal/models" "github.com/elastic/go-elasticsearch/v8" ) // Connect - used to connect to the elasticsearch database. It will return an elasticsearch client that can be used to // perform queries on the database. -func Connect(config structs.ElasticConfig) *elasticsearch.Client { +func Connect(config models.ElasticConfig) *elasticsearch.Client { esConfig := elasticsearch.Config{ Addresses: []string{ fmt.Sprintf("%s://%s:%d", config.Protocol, config.Host, config.Port), diff --git a/app/internal/elastic/operations.go b/app/internal/elastic/operations.go index 91eb5e69..8259f10f 100644 --- a/app/internal/elastic/operations.go +++ b/app/internal/elastic/operations.go @@ -7,7 +7,7 @@ import ( "os" "strings" - "backend/app/internal/structs" + "backend/app/internal/models" "github.com/elastic/go-elasticsearch/v8" "github.com/elastic/go-elasticsearch/v8/esapi" @@ -16,7 +16,7 @@ import ( // SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need // to be passed to the function. -func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, index string) { +func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string) { jsonDocument, err := json.Marshal(document) if err != nil { @@ -36,8 +36,8 @@ func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, in // SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need // to be passed to the function. -func SearchDocument(client *elasticsearch.Client, query string, index string) *structs.EsDocument { - var response structs.EsDocument +func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsDocument { + var response models.EsDocument request := esapi.SearchRequest{ Index: []string{index}, Body: strings.NewReader(query), diff --git a/app/internal/elastic/parser.go b/app/internal/elastic/parser.go index f51e28fe..be8cae40 100644 --- a/app/internal/elastic/parser.go +++ b/app/internal/elastic/parser.go @@ -1,16 +1,16 @@ package elastic import ( - "backend/app/internal/structs" + "backend/app/internal/models" "go.mongodb.org/mongo-driver/bson/primitive" ) // ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the // Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the // function. -func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.EmbeddingResponse) *structs.EsDocument { +func ParseEmbedding(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument { var err error - var esDocument structs.EsDocument + var esDocument models.EsDocument esDocument.MongoId, err = primitive.ObjectIDFromHex(document.Id) diff --git a/app/internal/embedding/embedding.go b/app/internal/embedding/embedding.go index 95558031..d46a1357 100644 --- a/app/internal/embedding/embedding.go +++ b/app/internal/embedding/embedding.go @@ -7,10 +7,10 @@ import ( "net/http" "os" - "backend/app/internal/structs" + "backend/app/internal/models" ) -type Embeddings = structs.EmbeddingResponse +type Embeddings = models.EmbeddingResponse // Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of // embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. diff --git a/app/internal/helpers/config.go b/app/internal/helpers/config.go index 534c9339..92aa1441 100644 --- a/app/internal/helpers/config.go +++ b/app/internal/helpers/config.go @@ -4,13 +4,13 @@ import ( "log" "os" - "backend/app/internal/structs" + "backend/app/internal/models" "github.com/kelseyhightower/envconfig" "gopkg.in/yaml.v2" ) -type Config = structs.Config +type Config = models.Config // LoadConfigs - parse and store in a struct all the config values needed by the backend. func LoadConfigs() Config { diff --git a/app/internal/structs/config.go b/app/internal/models/config.go similarity index 98% rename from app/internal/structs/config.go rename to app/internal/models/config.go index 8ddf4264..43d3a1fb 100644 --- a/app/internal/structs/config.go +++ b/app/internal/models/config.go @@ -1,4 +1,4 @@ -package structs +package models // Config - used to store all configurations needed by the backend. type Config struct { diff --git a/app/internal/structs/document.go b/app/internal/models/document.go similarity index 97% rename from app/internal/structs/document.go rename to app/internal/models/document.go index b52e60fc..1763cbf2 100644 --- a/app/internal/structs/document.go +++ b/app/internal/models/document.go @@ -1,4 +1,4 @@ -package structs +package models import ( "go.mongodb.org/mongo-driver/bson/primitive" diff --git a/app/internal/structs/embeddings.go b/app/internal/models/embeddings.go similarity index 94% rename from app/internal/structs/embeddings.go rename to app/internal/models/embeddings.go index 3e696872..e80065a7 100644 --- a/app/internal/structs/embeddings.go +++ b/app/internal/models/embeddings.go @@ -1,4 +1,4 @@ -package structs +package models // EmbeddingRequest - structure of the request to be sent to the embedding server. type EmbeddingRequest struct { diff --git a/app/internal/mongodb/mongo.go b/app/internal/mongodb/mongo.go index 5b953d90..2fc90f68 100644 --- a/app/internal/mongodb/mongo.go +++ b/app/internal/mongodb/mongo.go @@ -5,7 +5,7 @@ import ( "fmt" "log" - "backend/app/internal/structs" + "backend/app/internal/models" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -13,7 +13,7 @@ import ( // Connect - used to connect to the mongodb database. It will return a mongodb client that can be used to perform // queries on the database. -func Connect(config structs.MongoConfig) *mongo.Client { +func Connect(config models.MongoConfig) *mongo.Client { ctx := context.TODO() uri := fmt.Sprintf( "%s://%s:%s@%s:%d/?directConnection=true&authSource=apis", diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go index d546bdaf..a768ece6 100644 --- a/app/internal/mongodb/sync.go +++ b/app/internal/mongodb/sync.go @@ -8,7 +8,7 @@ import ( "backend/app/internal/elastic" "backend/app/internal/embedding" - "backend/app/internal/structs" + "backend/app/internal/models" "github.com/elastic/go-elasticsearch/v8" "go.mongodb.org/mongo-driver/bson" @@ -42,7 +42,7 @@ func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operati // saved in the respective elasticsearch index. func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { for stream.Next(context.TODO()) { - var document structs.SyncDocument + var document models.SyncDocument // Retrieve the mongo document id err := stream.Current.Lookup("documentKey").Unmarshal(&document) @@ -78,7 +78,7 @@ func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, // index (based on the mongodb ObjectId) and deleted from the elasticsearch database. func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { for stream.Next(context.TODO()) { - var specification structs.SyncDocument + var specification models.SyncDocument err := stream.Current.Lookup("documentKey").Unmarshal(&specification) if err != nil { diff --git a/app/internal/routes/retrieve.go b/app/internal/routes/retrieve.go deleted file mode 100644 index 765c6224..00000000 --- a/app/internal/routes/retrieve.go +++ /dev/null @@ -1,29 +0,0 @@ -package routes - -import ( - "log" - "net/http" - - "backend/app/internal/embedding" - "backend/app/internal/structs" - - "github.com/gin-gonic/gin" -) - -type EmbeddingRequest = structs.EmbeddingRequest - -func InitRetrieverRoutes(router *gin.Engine) { - router.POST("/search", Search) -} - -func Search(c *gin.Context) { - var body EmbeddingRequest - err := c.BindJSON(&body) - - if err != nil { - c.JSON(http.StatusBadRequest, "") - } - - embeddings := embedding.PerformPipeline([]string{body.Fragment}, true) - log.Print(len(embeddings.Predictions[0])) -} diff --git a/app/internal/routes/routes.go b/app/internal/routes/routes.go deleted file mode 100644 index 55e6d447..00000000 --- a/app/internal/routes/routes.go +++ /dev/null @@ -1,9 +0,0 @@ -package routes - -import ( - "github.com/gin-gonic/gin" -) - -func InitRoutes(router *gin.Engine) { - InitRetrieverRoutes(router) -} diff --git a/app/cmd/main/main.go b/app/main.go similarity index 71% rename from app/cmd/main/main.go rename to app/main.go index ea107544..7f5c0894 100644 --- a/app/cmd/main/main.go +++ b/app/main.go @@ -1,17 +1,23 @@ package main import ( - "backend/app/internal/elastic" - "backend/app/internal/mongodb" + "backend/app/internal/controller" "fmt" "log" + _ "backend/app/docs" + "backend/app/internal/elastic" "backend/app/internal/helpers" - "backend/app/internal/routes" + "backend/app/internal/mongodb" "github.com/gin-gonic/gin" ) +// @title API Scout +// @version 1.0 +// @description This is the backend for the API Scout platform. + +// @BasePath /api/v1 func main() { cfg := helpers.LoadConfigs() @@ -21,8 +27,10 @@ func main() { go mongodb.WatchDatabase(mongoClient, elasticClient, "insert") go mongodb.WatchDatabase(mongoClient, elasticClient, "delete") + + // Start the webserver router := gin.Default() - routes.InitRoutes(router) + controller.SetupRoutes(router) err := router.Run(fmt.Sprintf(":%d", cfg.Backend.Port)) if err != nil { diff --git a/docs/go/_/css/main.css b/docs/go/_/css/main.css deleted file mode 100644 index aad59947..00000000 --- a/docs/go/_/css/main.css +++ /dev/null @@ -1,161 +0,0 @@ -body { - margin: 1em 2em; - font-family: Helvetica, sans-serif; - background-color: #f8f8f8; - font-size: 1em; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0.3em; - margin-bottom: 0.3em; -} -h1, h2, h3, h4 { font-weight: 500; } -h2 { font-size: 1.75em } -h3 { font-size: 1.5em } -h4 { font-size: 1.33em } -h5 { font-size: 1em } - -a { - text-decoration: none; - color: #0366a5; -} -a:hover { - text-decoration: underline; -} - -a.permalink { display: none; } -a.permalink:hover { - text-decoration: none; -} -*:hover > a.permalink { display: inline; } - -nav { - padding: 1em; - background-color: #eee; - border-radius: 0.5em; - display: flex; - flex-wrap: wrap; -} - -nav .navbar-right { - margin-left: auto; -} - -/* Remove first level of nesting for a package's index section. */ -#pkg-index + ul, #pkg-examples + ul { - list-style-type: none; - padding: 0; -} - -code, kbd, pre { - font-family: Consolas, monospace; -} - -pre { - color: #222; - overflow-x: auto; - border: 1px solid #ccc; - border-radius: 0.5em; - background-color: #eee; - padding: 0.75em; - font-size: 0.9em; -} - -details.example > summary { - color: #0366a5; - cursor: pointer; -} - -details.deprecated > summary { - list-style: none; -} - -span.deprecated-tag { - color: #eee; - background-color: #999; - padding: 0.125rem 0.3rem; - border-radius: 0.3rem; - font-size: 0.7rem; - vertical-align: middle; - cursor: pointer; -} - -#search { margin: 0.3em 0; } - -#generated-by-footer { font-size: x-small; } - -/* Background */ .bg { background-color: #ffffff; } -/* PreWrapper */ .chroma { background-color: #ffffff; } -/* Error */ .chroma .err { color: #a61717; background-color: #e3d2d2 } -/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } -/* LineHighlight */ .chroma .hl { background-color: #e5e5e5 } -/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* Line */ .chroma .line { display: flex; } -/* Keyword */ .chroma .k { color: #000000; font-weight: bold } -/* KeywordConstant */ .chroma .kc { color: #000000; font-weight: bold } -/* KeywordDeclaration */ .chroma .kd { color: #000000; font-weight: bold } -/* KeywordNamespace */ .chroma .kn { color: #000000; font-weight: bold } -/* KeywordPseudo */ .chroma .kp { color: #000000; font-weight: bold } -/* KeywordReserved */ .chroma .kr { color: #000000; font-weight: bold } -/* KeywordType */ .chroma .kt { color: #445588; font-weight: bold } -/* NameAttribute */ .chroma .na { color: #008080 } -/* NameBuiltin */ .chroma .nb { color: #0086b3 } -/* NameBuiltinPseudo */ .chroma .bp { color: #999999 } -/* NameClass */ .chroma .nc { color: #445588; font-weight: bold } -/* NameConstant */ .chroma .no { color: #008080 } -/* NameDecorator */ .chroma .nd { color: #3c5d5d; font-weight: bold } -/* NameEntity */ .chroma .ni { color: #800080 } -/* NameException */ .chroma .ne { color: #990000; font-weight: bold } -/* NameFunction */ .chroma .nf { color: #990000; font-weight: bold } -/* NameLabel */ .chroma .nl { color: #990000; font-weight: bold } -/* NameNamespace */ .chroma .nn { color: #555555 } -/* NameTag */ .chroma .nt { color: #000080 } -/* NameVariable */ .chroma .nv { color: #008080 } -/* NameVariableClass */ .chroma .vc { color: #008080 } -/* NameVariableGlobal */ .chroma .vg { color: #008080 } -/* NameVariableInstance */ .chroma .vi { color: #008080 } -/* LiteralString */ .chroma .s { color: #dd1144 } -/* LiteralStringAffix */ .chroma .sa { color: #dd1144 } -/* LiteralStringBacktick */ .chroma .sb { color: #dd1144 } -/* LiteralStringChar */ .chroma .sc { color: #dd1144 } -/* LiteralStringDelimiter */ .chroma .dl { color: #dd1144 } -/* LiteralStringDoc */ .chroma .sd { color: #dd1144 } -/* LiteralStringDouble */ .chroma .s2 { color: #dd1144 } -/* LiteralStringEscape */ .chroma .se { color: #dd1144 } -/* LiteralStringHeredoc */ .chroma .sh { color: #dd1144 } -/* LiteralStringInterpol */ .chroma .si { color: #dd1144 } -/* LiteralStringOther */ .chroma .sx { color: #dd1144 } -/* LiteralStringRegex */ .chroma .sr { color: #009926 } -/* LiteralStringSingle */ .chroma .s1 { color: #dd1144 } -/* LiteralStringSymbol */ .chroma .ss { color: #990073 } -/* LiteralNumber */ .chroma .m { color: #009999 } -/* LiteralNumberBin */ .chroma .mb { color: #009999 } -/* LiteralNumberFloat */ .chroma .mf { color: #009999 } -/* LiteralNumberHex */ .chroma .mh { color: #009999 } -/* LiteralNumberInteger */ .chroma .mi { color: #009999 } -/* LiteralNumberIntegerLong */ .chroma .il { color: #009999 } -/* LiteralNumberOct */ .chroma .mo { color: #009999 } -/* Operator */ .chroma .o { color: #000000; font-weight: bold } -/* OperatorWord */ .chroma .ow { color: #000000; font-weight: bold } -/* Comment */ .chroma .c { color: #999988; font-style: italic } -/* CommentHashbang */ .chroma .ch { color: #999988; font-style: italic } -/* CommentMultiline */ .chroma .cm { color: #999988; font-style: italic } -/* CommentSingle */ .chroma .c1 { color: #999988; font-style: italic } -/* CommentSpecial */ .chroma .cs { color: #999999; font-weight: bold; font-style: italic } -/* CommentPreproc */ .chroma .cp { color: #999999; font-weight: bold; font-style: italic } -/* CommentPreprocFile */ .chroma .cpf { color: #999999; font-weight: bold; font-style: italic } -/* GenericDeleted */ .chroma .gd { color: #000000; background-color: #ffdddd } -/* GenericEmph */ .chroma .ge { color: #000000; font-style: italic } -/* GenericError */ .chroma .gr { color: #aa0000 } -/* GenericHeading */ .chroma .gh { color: #999999 } -/* GenericInserted */ .chroma .gi { color: #000000; background-color: #ddffdd } -/* GenericOutput */ .chroma .go { color: #888888 } -/* GenericPrompt */ .chroma .gp { color: #555555 } -/* GenericStrong */ .chroma .gs { font-weight: bold } -/* GenericSubheading */ .chroma .gu { color: #aaaaaa } -/* GenericTraceback */ .chroma .gt { color: #aa0000 } -/* GenericUnderline */ .chroma .gl { text-decoration: underline } -/* TextWhitespace */ .chroma .w { color: #bbbbbb } diff --git a/docs/go/_/icons/apple-touch-icon.png b/docs/go/_/icons/apple-touch-icon.png deleted file mode 100644 index 8b84711223432bf683e20daff7014583594786e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20698 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 YtO;;q_YmsY;1&?$Yv%ej2Ph=~T6sckb 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 diff --git a/docs/go/_/js/permalink.js b/docs/go/_/js/permalink.js deleted file mode 100644 index 062ccf3f..00000000 --- a/docs/go/_/js/permalink.js +++ /dev/null @@ -1,44 +0,0 @@ -// If the page was opened with an anchor (e.g. #foo), -// and the destination is a
    element, open it. -function openDetailsAnchor() { - let hash = window.location.hash - if (!hash) { - return - } - let el = document.getElementById(hash.slice(1)) // remove leading '#' - if (!el) { - return - } - - let details = el.closest("details") - while (details) { - details.open = true - details = details.parentElement.closest("details") - } - - // New elements may have appeared. - // Set hash again to scroll to the right place. - window.location.hash = hash; - return false; -} - -window.addEventListener('hashchange', openDetailsAnchor) - -window.addEventListener('load', () => { - document.querySelectorAll("h2, h3, h4, h5, h6").forEach((el) => { - if (!el.id) { - return - } - el.innerHTML += ' ' - }) - - document.querySelectorAll("details.example > summary").forEach((el) => { - let id = el.parentElement.id; - if (!id) { - return - } - el.innerHTML += ' ' - }) - - openDetailsAnchor() -}) diff --git a/docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter b/docs/go/_/pagefind/filter/unknown_9115dcc.pf_filter deleted file mode 100644 index 4282e114ecd74b621b1c727b541b5dadc009df93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmb2|=3oE;rvHpu3|IdbB&MgPW#*;CrzEE|WrbxHXC`IlWR_GmHf4C`m82HsCFZm- RFfuW-upW8X&ZPy^2mrxc6)XS% diff --git a/docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment b/docs/go/_/pagefind/fragment/unknown_1363832.pf_fragment deleted file mode 100644 index 24e34e487817d2a8189b475aeabe639b47a08419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek)*iwFP!00002|9z4{PXaLzh5yQ=CrxlsBpygSc`zoPy&y5AonpiJe}d zkQhGITq@}8P{%kVu_v$Hk@2aZti6F({8839WgM^$2*9cr8 zpwpSjWYo!2U|gN0C75$MZzIA>@FgvJ2Y80esWzO8PB_f*9<*)Gx%j2XSe^Gwl$oMV z89{q1$dC}ogYM{{ojZ(b+KX%LYRupfEn1jw54CPc57Y`-HhXx`2YZ5D`3*hb_%C1^#|d&Vce?4RTK85x?u+|^_ZfECa&`5@D9L0r1P|rljP&$NYDw(~ x?8@~F{d^PMNxTM)xEI-5`WPBuhaNhh!_Z|-w;kG|P-Hq0 zDodUuw+o8=_ffXvS02lu7el6~Py9ZLWXk3k3l%*@JbDWkwT8Gj~ssI~_nl2jW955bJ~P(?$Qrb9sojAF9Jc?clR6o;$7&M@xo*xU{_EWOyU zc|uoNxPP?H(7B^()pUeDVDSfTfpGH;oVUhCC%|Bh0==)(?>7)>p5?#mg$HABdo{g- z%gOao2uwv_&}Bx^5|}Y;2|9-2UK@f|2(dPRj4vwm0bDkG>&O*iWWi~eA*9S&jQo!e z)6;cAtCIM{U}`i+Yrj;GJ2tim6N0cmGBit=X)PNvZJs8z>hsJ{Sd|L}H(P?qlqy8A zjT*jRpRK{Dhsa6)tmf+2U#(FEy4-LqC2^j(SSbi#EVk}XfqHkTCu2)<~ zXdt1l%wsl8St{y+`kwbm$tCw@U%>j_-r4b}9|<~Pi95tnGj}qoJ&s65kixpoxxyDavBK^kE<|9&@u0FU5v7nxdqL-{qu}&bHYg^ z$J$0%O!0;GH{QPmC^0GK=3+$tBJvaTdETcIG%o^QJqC@jZF7~jr1tV?6^uWw!WP)c z8muu9Ypm{2Z9$#xg4&!K9mK5;4dC-#$m<^3!E2anl#4wmtzNbP*4?c!k4HO6*ELb& tb(&Qh>a3fJ(-u@W38k$GaJ~zmQ5ri zfVWbtW&Ljww6(T;X@lMrL>o?<|C2ygTkCY%Ja!s{8wrx6VpUdg7DzCbL&$QE%!V~7 zyL6(3PT7L3RnkZ*3v1!Rt16w{%KBewllnJcv%b#Ke9}y%A3;*8`iN-#Q>y%EQD?9B zB34|N)@_z%MA6Op0>9ZVS)K#_1N*UK+H{!xR{W>PdJCQ1s`{p-097kzcdF9wuN`3r zb&{*98p^q#eoHtWmI;4a4{N>#t9oYYSd=ay1=eK`3&(O!>t1+xdU#qDl9N7&VL6?QT}*;tQ{8{7M!D zt8z&9ypE!+zdA;(FrRG`-->oc^4gNziHLg$yeBBHon&)=XeqUcp$m5x_ zpO(OWotVGiC?u`wh3B`2s|Yn}P|-;9tmE+;;l?pemqeTd4s6eQs{7?RS*Na(f=(#O z?z^Qp4Nj3~d4uN+Cl@)@A@P*vXTZ3-$Z$iz$`;-Y86Q7@Puf1VfFLgcg;vfa_(jtNX5u(RI5b0FEg*b~6U zXHIhXKI(bHWRt8P@4^L>O~yTST^Ll8SwGH&>m{4s_SDnwcFCrrt|EqSrKF09E5Oap r-0ab7FFXNh^Uv;jLjI)v@3Njycrbce{UgMT4^M~Rx6W@P)DQpwY`X-! diff --git a/docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment b/docs/go/_/pagefind/fragment/unknown_c53c497.pf_fragment deleted file mode 100644 index 3342564fc74424aefdb58f85a0dd66db576c37b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmV<50wDb#iwFP!00002|Fu=YQrj>P{goY^0%H;=Fm!V3z$FK!2RiKm7?7<^qGC&~ zBqwB;{CiijoJ3C2o;W4mUA^6X+PA9t45w0w7g2~0)|irw*{ITLrbRwt87s7Ms2o{q zUc6B-MCTA>RcqtmiRI)$B}TliN0P#g;$?^N#9-Q}0&cZZSh!*GH6Zkttb(n_?b2 z%6!+zt4*JCu4ecUY}qDZ=e>*HC;co$2rkg9z{v`!N3n583nIh{m>OLrePkdbIn;Yw z7KO>S*`!)B3VerwKP5UkIwHU4zv%`h;sm%7``J>U9)}ZU(YQW`J?kfN*voQ^Lr)nUpQSp_t&C8bxo&;LGOKrqUp&P$_FK%u! zHkBnUSIfp9?5DIcm!)(oHhyH2xOCa`I%5?&?n5T+dak*f)As(?j;35rx)Ld@vk(qf z#a#Prj~|Sxs@hjz{)M8Y@bAIf>`aqv77~{p0pAb2667d#5%^}~^L3U$U3O4$xo=T+ zABhCw>KH_CE%u=Hy<5o3>tmR`HPOS|_iiz7j@Fq9t_Qj2+#+6_e?117%x@2|@7n>q Rx?Vr8{{p-KO)>um006)0TP6Si diff --git a/docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment b/docs/go/_/pagefind/fragment/unknown_d9365e2.pf_fragment deleted file mode 100644 index 8c3beaf521bcbc8fb117b91d6292b5a0e6e345ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmV;f0#W@RiwFP!00002|D9D$PvbBU{VOA%0EKqDfLQgm0uJ0(i*_%7kZVs{i^R^_ z4y8ikPMq)F2jajBa5cr)*LJkI$7=Ss^LDdYz$Y|5r=j45|si7`uD8oWCS#5Jc&gHsU@If&_d}2 z{nZlRZ)T{c50smDR%Nz>g~eZ~)KEovSKU>)h&h$j0ty4+}or&~VPXwa=hlF%5u zp(Vnh*X=U##EHmkT{<(P7p9fK!3t?Ec$K-;Qa|sHR#d_96do{K3xRN_g^_3pl1?O? z8fisJwtbTJv0kG^RJ$qkX~iGPv+E65*LY;W!T_)L%-E2~U2qaPj?b~V<5i_YgBN@G z(&&-=az}>NbVP*Rp==rVMcIZe>FesYIQ}+p`?^$1qyrLk2I8{<&`w?%D_?{u!djmE zxK7wyrL=V&n|`pr%Bh)3m0z>zBfF2=m_2V2mZ9e%xY&%)$+=xNMW^w zaJUvr6RJIakQuY;d02j@XeGl#@wzxSbWh$Ct^xwS4?G{_NR8lu5}SV8Bps-W8Y=Gk z7G?YO=s;ZVgXnI~9@37p1-!W0huB>_J;WVni+DZRhuFPkJ;WVni#VBF?}u#Xb_cNI U+Jd{f+&pjo13>mdViE`d0Al4*VE_OC diff --git a/docs/go/_/pagefind/index/unknown_1446bce.pf_index b/docs/go/_/pagefind/index/unknown_1446bce.pf_index deleted file mode 100644 index f2caa334e26f5ea3cc8a279239fb66e0357f6180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3986 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 diff --git a/docs/go/_/pagefind/pagefind-entry.json b/docs/go/_/pagefind/pagefind-entry.json deleted file mode 100644 index 3aa81cdd..00000000 --- a/docs/go/_/pagefind/pagefind-entry.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_4bda9216e98df89","wasm":null,"page_count":6}}} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind-highlight.js b/docs/go/_/pagefind/pagefind-highlight.js deleted file mode 100644 index c823fbfe..00000000 --- a/docs/go/_/pagefind/pagefind-highlight.js +++ /dev/null @@ -1,1069 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// node_modules/mark.js/dist/mark.js -var require_mark = __commonJS({ - "node_modules/mark.js/dist/mark.js"(exports, module) { - (function(global, factory) { - typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.Mark = factory(); - })(exports, function() { - "use strict"; - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - var classCallCheck = function(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - }; - var createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) - descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - if (protoProps) - defineProperties(Constructor.prototype, protoProps); - if (staticProps) - defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - var DOMIterator = function() { - function DOMIterator2(ctx) { - var iframes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; - var exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; - var iframesTimeout = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 5e3; - classCallCheck(this, DOMIterator2); - this.ctx = ctx; - this.iframes = iframes; - this.exclude = exclude; - this.iframesTimeout = iframesTimeout; - } - createClass(DOMIterator2, [{ - key: "getContexts", - value: function getContexts() { - var ctx = void 0, filteredCtx = []; - if (typeof this.ctx === "undefined" || !this.ctx) { - ctx = []; - } else if (NodeList.prototype.isPrototypeOf(this.ctx)) { - ctx = Array.prototype.slice.call(this.ctx); - } else if (Array.isArray(this.ctx)) { - ctx = this.ctx; - } else if (typeof this.ctx === "string") { - ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx)); - } else { - ctx = [this.ctx]; - } - ctx.forEach(function(ctx2) { - var isDescendant = filteredCtx.filter(function(contexts) { - return contexts.contains(ctx2); - }).length > 0; - if (filteredCtx.indexOf(ctx2) === -1 && !isDescendant) { - filteredCtx.push(ctx2); - } - }); - return filteredCtx; - } - }, { - key: "getIframeContents", - value: function getIframeContents(ifr, successFn) { - var errorFn = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() { - }; - var doc = void 0; - try { - var ifrWin = ifr.contentWindow; - doc = ifrWin.document; - if (!ifrWin || !doc) { - throw new Error("iframe inaccessible"); - } - } catch (e) { - errorFn(); - } - if (doc) { - successFn(doc); - } - } - }, { - key: "isIframeBlank", - value: function isIframeBlank(ifr) { - var bl = "about:blank", src = ifr.getAttribute("src").trim(), href = ifr.contentWindow.location.href; - return href === bl && src !== bl && src; - } - }, { - key: "observeIframeLoad", - value: function observeIframeLoad(ifr, successFn, errorFn) { - var _this = this; - var called = false, tout = null; - var listener = function listener2() { - if (called) { - return; - } - called = true; - clearTimeout(tout); - try { - if (!_this.isIframeBlank(ifr)) { - ifr.removeEventListener("load", listener2); - _this.getIframeContents(ifr, successFn, errorFn); - } - } catch (e) { - errorFn(); - } - }; - ifr.addEventListener("load", listener); - tout = setTimeout(listener, this.iframesTimeout); - } - }, { - key: "onIframeReady", - value: function onIframeReady(ifr, successFn, errorFn) { - try { - if (ifr.contentWindow.document.readyState === "complete") { - if (this.isIframeBlank(ifr)) { - this.observeIframeLoad(ifr, successFn, errorFn); - } else { - this.getIframeContents(ifr, successFn, errorFn); - } - } else { - this.observeIframeLoad(ifr, successFn, errorFn); - } - } catch (e) { - errorFn(); - } - } - }, { - key: "waitForIframes", - value: function waitForIframes(ctx, done) { - var _this2 = this; - var eachCalled = 0; - this.forEachIframe(ctx, function() { - return true; - }, function(ifr) { - eachCalled++; - _this2.waitForIframes(ifr.querySelector("html"), function() { - if (!--eachCalled) { - done(); - } - }); - }, function(handled) { - if (!handled) { - done(); - } - }); - } - }, { - key: "forEachIframe", - value: function forEachIframe(ctx, filter, each) { - var _this3 = this; - var end = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { - }; - var ifr = ctx.querySelectorAll("iframe"), open = ifr.length, handled = 0; - ifr = Array.prototype.slice.call(ifr); - var checkEnd = function checkEnd2() { - if (--open <= 0) { - end(handled); - } - }; - if (!open) { - checkEnd(); - } - ifr.forEach(function(ifr2) { - if (DOMIterator2.matches(ifr2, _this3.exclude)) { - checkEnd(); - } else { - _this3.onIframeReady(ifr2, function(con) { - if (filter(ifr2)) { - handled++; - each(con); - } - checkEnd(); - }, checkEnd); - } - }); - } - }, { - key: "createIterator", - value: function createIterator(ctx, whatToShow, filter) { - return document.createNodeIterator(ctx, whatToShow, filter, false); - } - }, { - key: "createInstanceOnIframe", - value: function createInstanceOnIframe(contents) { - return new DOMIterator2(contents.querySelector("html"), this.iframes); - } - }, { - key: "compareNodeIframe", - value: function compareNodeIframe(node, prevNode, ifr) { - var compCurr = node.compareDocumentPosition(ifr), prev = Node.DOCUMENT_POSITION_PRECEDING; - if (compCurr & prev) { - if (prevNode !== null) { - var compPrev = prevNode.compareDocumentPosition(ifr), after = Node.DOCUMENT_POSITION_FOLLOWING; - if (compPrev & after) { - return true; - } - } else { - return true; - } - } - return false; - } - }, { - key: "getIteratorNode", - value: function getIteratorNode(itr) { - var prevNode = itr.previousNode(); - var node = void 0; - if (prevNode === null) { - node = itr.nextNode(); - } else { - node = itr.nextNode() && itr.nextNode(); - } - return { - prevNode, - node - }; - } - }, { - key: "checkIframeFilter", - value: function checkIframeFilter(node, prevNode, currIfr, ifr) { - var key = false, handled = false; - ifr.forEach(function(ifrDict, i) { - if (ifrDict.val === currIfr) { - key = i; - handled = ifrDict.handled; - } - }); - if (this.compareNodeIframe(node, prevNode, currIfr)) { - if (key === false && !handled) { - ifr.push({ - val: currIfr, - handled: true - }); - } else if (key !== false && !handled) { - ifr[key].handled = true; - } - return true; - } - if (key === false) { - ifr.push({ - val: currIfr, - handled: false - }); - } - return false; - } - }, { - key: "handleOpenIframes", - value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) { - var _this4 = this; - ifr.forEach(function(ifrDict) { - if (!ifrDict.handled) { - _this4.getIframeContents(ifrDict.val, function(con) { - _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb); - }); - } - }); - } - }, { - key: "iterateThroughNodes", - value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) { - var _this5 = this; - var itr = this.createIterator(ctx, whatToShow, filterCb); - var ifr = [], elements = [], node = void 0, prevNode = void 0, retrieveNodes = function retrieveNodes2() { - var _getIteratorNode = _this5.getIteratorNode(itr); - prevNode = _getIteratorNode.prevNode; - node = _getIteratorNode.node; - return node; - }; - while (retrieveNodes()) { - if (this.iframes) { - this.forEachIframe(ctx, function(currIfr) { - return _this5.checkIframeFilter(node, prevNode, currIfr, ifr); - }, function(con) { - _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function(ifrNode) { - return elements.push(ifrNode); - }, filterCb); - }); - } - elements.push(node); - } - elements.forEach(function(node2) { - eachCb(node2); - }); - if (this.iframes) { - this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb); - } - doneCb(); - } - }, { - key: "forEachNode", - value: function forEachNode(whatToShow, each, filter) { - var _this6 = this; - var done = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { - }; - var contexts = this.getContexts(); - var open = contexts.length; - if (!open) { - done(); - } - contexts.forEach(function(ctx) { - var ready = function ready2() { - _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function() { - if (--open <= 0) { - done(); - } - }); - }; - if (_this6.iframes) { - _this6.waitForIframes(ctx, ready); - } else { - ready(); - } - }); - } - }], [{ - key: "matches", - value: function matches(element, selector) { - var selectors = typeof selector === "string" ? [selector] : selector, fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector; - if (fn) { - var match = false; - selectors.every(function(sel) { - if (fn.call(element, sel)) { - match = true; - return false; - } - return true; - }); - return match; - } else { - return false; - } - } - }]); - return DOMIterator2; - }(); - var Mark$1 = function() { - function Mark3(ctx) { - classCallCheck(this, Mark3); - this.ctx = ctx; - this.ie = false; - var ua = window.navigator.userAgent; - if (ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1) { - this.ie = true; - } - } - createClass(Mark3, [{ - key: "log", - value: function log(msg) { - var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "debug"; - var log2 = this.opt.log; - if (!this.opt.debug) { - return; - } - if ((typeof log2 === "undefined" ? "undefined" : _typeof(log2)) === "object" && typeof log2[level] === "function") { - log2[level]("mark.js: " + msg); - } - } - }, { - key: "escapeStr", - value: function escapeStr(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - } - }, { - key: "createRegExp", - value: function createRegExp(str) { - if (this.opt.wildcards !== "disabled") { - str = this.setupWildcardsRegExp(str); - } - str = this.escapeStr(str); - if (Object.keys(this.opt.synonyms).length) { - str = this.createSynonymsRegExp(str); - } - if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { - str = this.setupIgnoreJoinersRegExp(str); - } - if (this.opt.diacritics) { - str = this.createDiacriticsRegExp(str); - } - str = this.createMergedBlanksRegExp(str); - if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { - str = this.createJoinersRegExp(str); - } - if (this.opt.wildcards !== "disabled") { - str = this.createWildcardsRegExp(str); - } - str = this.createAccuracyRegExp(str); - return str; - } - }, { - key: "createSynonymsRegExp", - value: function createSynonymsRegExp(str) { - var syn = this.opt.synonyms, sens = this.opt.caseSensitive ? "" : "i", joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : ""; - for (var index in syn) { - if (syn.hasOwnProperty(index)) { - var value = syn[index], k1 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(index) : this.escapeStr(index), k2 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(value) : this.escapeStr(value); - if (k1 !== "" && k2 !== "") { - str = str.replace(new RegExp("(" + this.escapeStr(k1) + "|" + this.escapeStr(k2) + ")", "gm" + sens), joinerPlaceholder + ("(" + this.processSynomyms(k1) + "|") + (this.processSynomyms(k2) + ")") + joinerPlaceholder); - } - } - } - return str; - } - }, { - key: "processSynomyms", - value: function processSynomyms(str) { - if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { - str = this.setupIgnoreJoinersRegExp(str); - } - return str; - } - }, { - key: "setupWildcardsRegExp", - value: function setupWildcardsRegExp(str) { - str = str.replace(/(?:\\)*\?/g, function(val) { - return val.charAt(0) === "\\" ? "?" : ""; - }); - return str.replace(/(?:\\)*\*/g, function(val) { - return val.charAt(0) === "\\" ? "*" : ""; - }); - } - }, { - key: "createWildcardsRegExp", - value: function createWildcardsRegExp(str) { - var spaces = this.opt.wildcards === "withSpaces"; - return str.replace(/\u0001/g, spaces ? "[\\S\\s]?" : "\\S?").replace(/\u0002/g, spaces ? "[\\S\\s]*?" : "\\S*"); - } - }, { - key: "setupIgnoreJoinersRegExp", - value: function setupIgnoreJoinersRegExp(str) { - return str.replace(/[^(|)\\]/g, function(val, indx, original) { - var nextChar = original.charAt(indx + 1); - if (/[(|)\\]/.test(nextChar) || nextChar === "") { - return val; - } else { - return val + "\0"; - } - }); - } - }, { - key: "createJoinersRegExp", - value: function createJoinersRegExp(str) { - var joiner = []; - var ignorePunctuation = this.opt.ignorePunctuation; - if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) { - joiner.push(this.escapeStr(ignorePunctuation.join(""))); - } - if (this.opt.ignoreJoiners) { - joiner.push("\\u00ad\\u200b\\u200c\\u200d"); - } - return joiner.length ? str.split(/\u0000+/).join("[" + joiner.join("") + "]*") : str; - } - }, { - key: "createDiacriticsRegExp", - value: function createDiacriticsRegExp(str) { - var sens = this.opt.caseSensitive ? "" : "i", dct = this.opt.caseSensitive ? ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105", "A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010D", "C\xC7\u0106\u010C", "d\u0111\u010F", "D\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119", "E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B", "I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142", "L\u0141", "n\xF1\u0148\u0144", "N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D", "O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159", "R\u0158", "s\u0161\u015B\u0219\u015F", "S\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163", "T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B", "U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF", "Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017A", "Z\u017D\u017B\u0179"] : ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010DC\xC7\u0106\u010C", "d\u0111\u010FD\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142L\u0141", "n\xF1\u0148\u0144N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159R\u0158", "s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017AZ\u017D\u017B\u0179"]; - var handled = []; - str.split("").forEach(function(ch) { - dct.every(function(dct2) { - if (dct2.indexOf(ch) !== -1) { - if (handled.indexOf(dct2) > -1) { - return false; - } - str = str.replace(new RegExp("[" + dct2 + "]", "gm" + sens), "[" + dct2 + "]"); - handled.push(dct2); - } - return true; - }); - }); - return str; - } - }, { - key: "createMergedBlanksRegExp", - value: function createMergedBlanksRegExp(str) { - return str.replace(/[\s]+/gmi, "[\\s]+"); - } - }, { - key: "createAccuracyRegExp", - value: function createAccuracyRegExp(str) { - var _this = this; - var chars = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF"; - var acc = this.opt.accuracy, val = typeof acc === "string" ? acc : acc.value, ls = typeof acc === "string" ? [] : acc.limiters, lsJoin = ""; - ls.forEach(function(limiter) { - lsJoin += "|" + _this.escapeStr(limiter); - }); - switch (val) { - case "partially": - default: - return "()(" + str + ")"; - case "complementary": - lsJoin = "\\s" + (lsJoin ? lsJoin : this.escapeStr(chars)); - return "()([^" + lsJoin + "]*" + str + "[^" + lsJoin + "]*)"; - case "exactly": - return "(^|\\s" + lsJoin + ")(" + str + ")(?=$|\\s" + lsJoin + ")"; - } - } - }, { - key: "getSeparatedKeywords", - value: function getSeparatedKeywords(sv) { - var _this2 = this; - var stack = []; - sv.forEach(function(kw) { - if (!_this2.opt.separateWordSearch) { - if (kw.trim() && stack.indexOf(kw) === -1) { - stack.push(kw); - } - } else { - kw.split(" ").forEach(function(kwSplitted) { - if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) { - stack.push(kwSplitted); - } - }); - } - }); - return { - "keywords": stack.sort(function(a, b) { - return b.length - a.length; - }), - "length": stack.length - }; - } - }, { - key: "isNumeric", - value: function isNumeric(value) { - return Number(parseFloat(value)) == value; - } - }, { - key: "checkRanges", - value: function checkRanges(array) { - var _this3 = this; - if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== "[object Object]") { - this.log("markRanges() will only accept an array of objects"); - this.opt.noMatch(array); - return []; - } - var stack = []; - var last = 0; - array.sort(function(a, b) { - return a.start - b.start; - }).forEach(function(item) { - var _callNoMatchOnInvalid = _this3.callNoMatchOnInvalidRanges(item, last), start = _callNoMatchOnInvalid.start, end = _callNoMatchOnInvalid.end, valid = _callNoMatchOnInvalid.valid; - if (valid) { - item.start = start; - item.length = end - start; - stack.push(item); - last = end; - } - }); - return stack; - } - }, { - key: "callNoMatchOnInvalidRanges", - value: function callNoMatchOnInvalidRanges(range, last) { - var start = void 0, end = void 0, valid = false; - if (range && typeof range.start !== "undefined") { - start = parseInt(range.start, 10); - end = start + parseInt(range.length, 10); - if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) { - valid = true; - } else { - this.log("Ignoring invalid or overlapping range: " + ("" + JSON.stringify(range))); - this.opt.noMatch(range); - } - } else { - this.log("Ignoring invalid range: " + JSON.stringify(range)); - this.opt.noMatch(range); - } - return { - start, - end, - valid - }; - } - }, { - key: "checkWhitespaceRanges", - value: function checkWhitespaceRanges(range, originalLength, string) { - var end = void 0, valid = true, max = string.length, offset = originalLength - max, start = parseInt(range.start, 10) - offset; - start = start > max ? max : start; - end = start + parseInt(range.length, 10); - if (end > max) { - end = max; - this.log("End range automatically set to the max value of " + max); - } - if (start < 0 || end - start < 0 || start > max || end > max) { - valid = false; - this.log("Invalid range: " + JSON.stringify(range)); - this.opt.noMatch(range); - } else if (string.substring(start, end).replace(/\s+/g, "") === "") { - valid = false; - this.log("Skipping whitespace only range: " + JSON.stringify(range)); - this.opt.noMatch(range); - } - return { - start, - end, - valid - }; - } - }, { - key: "getTextNodes", - value: function getTextNodes(cb) { - var _this4 = this; - var val = "", nodes = []; - this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function(node) { - nodes.push({ - start: val.length, - end: (val += node.textContent).length, - node - }); - }, function(node) { - if (_this4.matchesExclude(node.parentNode)) { - return NodeFilter.FILTER_REJECT; - } else { - return NodeFilter.FILTER_ACCEPT; - } - }, function() { - cb({ - value: val, - nodes - }); - }); - } - }, { - key: "matchesExclude", - value: function matchesExclude(el) { - return DOMIterator.matches(el, this.opt.exclude.concat(["script", "style", "title", "head", "html"])); - } - }, { - key: "wrapRangeInTextNode", - value: function wrapRangeInTextNode(node, start, end) { - var hEl = !this.opt.element ? "mark" : this.opt.element, startNode = node.splitText(start), ret = startNode.splitText(end - start); - var repl = document.createElement(hEl); - repl.setAttribute("data-markjs", "true"); - if (this.opt.className) { - repl.setAttribute("class", this.opt.className); - } - repl.textContent = startNode.textContent; - startNode.parentNode.replaceChild(repl, startNode); - return ret; - } - }, { - key: "wrapRangeInMappedTextNode", - value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { - var _this5 = this; - dict.nodes.every(function(n, i) { - var sibl = dict.nodes[i + 1]; - if (typeof sibl === "undefined" || sibl.start > start) { - if (!filterCb(n.node)) { - return false; - } - var s = start - n.start, e = (end > n.end ? n.end : end) - n.start, startStr = dict.value.substr(0, n.start), endStr = dict.value.substr(e + n.start); - n.node = _this5.wrapRangeInTextNode(n.node, s, e); - dict.value = startStr + endStr; - dict.nodes.forEach(function(k, j) { - if (j >= i) { - if (dict.nodes[j].start > 0 && j !== i) { - dict.nodes[j].start -= e; - } - dict.nodes[j].end -= e; - } - }); - end -= e; - eachCb(n.node.previousSibling, n.start); - if (end > n.end) { - start = n.end; - } else { - return false; - } - } - return true; - }); - } - }, { - key: "wrapMatches", - value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) { - var _this6 = this; - var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; - this.getTextNodes(function(dict) { - dict.nodes.forEach(function(node) { - node = node.node; - var match = void 0; - while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== "") { - if (!filterCb(match[matchIdx], node)) { - continue; - } - var pos = match.index; - if (matchIdx !== 0) { - for (var i = 1; i < matchIdx; i++) { - pos += match[i].length; - } - } - node = _this6.wrapRangeInTextNode(node, pos, pos + match[matchIdx].length); - eachCb(node.previousSibling); - regex.lastIndex = 0; - } - }); - endCb(); - }); - } - }, { - key: "wrapMatchesAcrossElements", - value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { - var _this7 = this; - var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; - this.getTextNodes(function(dict) { - var match = void 0; - while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== "") { - var start = match.index; - if (matchIdx !== 0) { - for (var i = 1; i < matchIdx; i++) { - start += match[i].length; - } - } - var end = start + match[matchIdx].length; - _this7.wrapRangeInMappedTextNode(dict, start, end, function(node) { - return filterCb(match[matchIdx], node); - }, function(node, lastIndex) { - regex.lastIndex = lastIndex; - eachCb(node); - }); - } - endCb(); - }); - } - }, { - key: "wrapRangeFromIndex", - value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) { - var _this8 = this; - this.getTextNodes(function(dict) { - var originalLength = dict.value.length; - ranges.forEach(function(range, counter) { - var _checkWhitespaceRange = _this8.checkWhitespaceRanges(range, originalLength, dict.value), start = _checkWhitespaceRange.start, end = _checkWhitespaceRange.end, valid = _checkWhitespaceRange.valid; - if (valid) { - _this8.wrapRangeInMappedTextNode(dict, start, end, function(node) { - return filterCb(node, range, dict.value.substring(start, end), counter); - }, function(node) { - eachCb(node, range); - }); - } - }); - endCb(); - }); - } - }, { - key: "unwrapMatches", - value: function unwrapMatches(node) { - var parent = node.parentNode; - var docFrag = document.createDocumentFragment(); - while (node.firstChild) { - docFrag.appendChild(node.removeChild(node.firstChild)); - } - parent.replaceChild(docFrag, node); - if (!this.ie) { - parent.normalize(); - } else { - this.normalizeTextNode(parent); - } - } - }, { - key: "normalizeTextNode", - value: function normalizeTextNode(node) { - if (!node) { - return; - } - if (node.nodeType === 3) { - while (node.nextSibling && node.nextSibling.nodeType === 3) { - node.nodeValue += node.nextSibling.nodeValue; - node.parentNode.removeChild(node.nextSibling); - } - } else { - this.normalizeTextNode(node.firstChild); - } - this.normalizeTextNode(node.nextSibling); - } - }, { - key: "markRegExp", - value: function markRegExp(regexp, opt) { - var _this9 = this; - this.opt = opt; - this.log('Searching with expression "' + regexp + '"'); - var totalMatches = 0, fn = "wrapMatches"; - var eachCb = function eachCb2(element) { - totalMatches++; - _this9.opt.each(element); - }; - if (this.opt.acrossElements) { - fn = "wrapMatchesAcrossElements"; - } - this[fn](regexp, this.opt.ignoreGroups, function(match, node) { - return _this9.opt.filter(node, match, totalMatches); - }, eachCb, function() { - if (totalMatches === 0) { - _this9.opt.noMatch(regexp); - } - _this9.opt.done(totalMatches); - }); - } - }, { - key: "mark", - value: function mark(sv, opt) { - var _this10 = this; - this.opt = opt; - var totalMatches = 0, fn = "wrapMatches"; - var _getSeparatedKeywords = this.getSeparatedKeywords(typeof sv === "string" ? [sv] : sv), kwArr = _getSeparatedKeywords.keywords, kwArrLen = _getSeparatedKeywords.length, sens = this.opt.caseSensitive ? "" : "i", handler = function handler2(kw) { - var regex = new RegExp(_this10.createRegExp(kw), "gm" + sens), matches = 0; - _this10.log('Searching with expression "' + regex + '"'); - _this10[fn](regex, 1, function(term, node) { - return _this10.opt.filter(node, kw, totalMatches, matches); - }, function(element) { - matches++; - totalMatches++; - _this10.opt.each(element); - }, function() { - if (matches === 0) { - _this10.opt.noMatch(kw); - } - if (kwArr[kwArrLen - 1] === kw) { - _this10.opt.done(totalMatches); - } else { - handler2(kwArr[kwArr.indexOf(kw) + 1]); - } - }); - }; - if (this.opt.acrossElements) { - fn = "wrapMatchesAcrossElements"; - } - if (kwArrLen === 0) { - this.opt.done(totalMatches); - } else { - handler(kwArr[0]); - } - } - }, { - key: "markRanges", - value: function markRanges(rawRanges, opt) { - var _this11 = this; - this.opt = opt; - var totalMatches = 0, ranges = this.checkRanges(rawRanges); - if (ranges && ranges.length) { - this.log("Starting to mark with the following ranges: " + JSON.stringify(ranges)); - this.wrapRangeFromIndex(ranges, function(node, range, match, counter) { - return _this11.opt.filter(node, range, match, counter); - }, function(element, range) { - totalMatches++; - _this11.opt.each(element, range); - }, function() { - _this11.opt.done(totalMatches); - }); - } else { - this.opt.done(totalMatches); - } - } - }, { - key: "unmark", - value: function unmark(opt) { - var _this12 = this; - this.opt = opt; - var sel = this.opt.element ? this.opt.element : "*"; - sel += "[data-markjs]"; - if (this.opt.className) { - sel += "." + this.opt.className; - } - this.log('Removal selector "' + sel + '"'); - this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function(node) { - _this12.unwrapMatches(node); - }, function(node) { - var matchesSel = DOMIterator.matches(node, sel), matchesExclude = _this12.matchesExclude(node); - if (!matchesSel || matchesExclude) { - return NodeFilter.FILTER_REJECT; - } else { - return NodeFilter.FILTER_ACCEPT; - } - }, this.opt.done); - } - }, { - key: "opt", - set: function set$$1(val) { - this._opt = _extends({}, { - "element": "", - "className": "", - "exclude": [], - "iframes": false, - "iframesTimeout": 5e3, - "separateWordSearch": true, - "diacritics": true, - "synonyms": {}, - "accuracy": "partially", - "acrossElements": false, - "caseSensitive": false, - "ignoreJoiners": false, - "ignoreGroups": 0, - "ignorePunctuation": [], - "wildcards": "disabled", - "each": function each() { - }, - "noMatch": function noMatch() { - }, - "filter": function filter() { - return true; - }, - "done": function done() { - }, - "debug": false, - "log": window.console - }, val); - }, - get: function get$$1() { - return this._opt; - } - }, { - key: "iterator", - get: function get$$1() { - return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout); - } - }]); - return Mark3; - }(); - function Mark2(ctx) { - var _this = this; - var instance = new Mark$1(ctx); - this.mark = function(sv, opt) { - instance.mark(sv, opt); - return _this; - }; - this.markRegExp = function(sv, opt) { - instance.markRegExp(sv, opt); - return _this; - }; - this.markRanges = function(sv, opt) { - instance.markRanges(sv, opt); - return _this; - }; - this.unmark = function(opt) { - instance.unmark(opt); - return _this; - }; - return this; - } - return Mark2; - }); - } -}); - -// lib/highlight.ts -var import_mark = __toESM(require_mark(), 1); -var PagefindHighlight = class { - constructor(options = { - markContext: null, - highlightParam: "pagefind-highlight", - markOptions: { - className: "pagefind-highlight", - exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] - }, - addStyles: true - }) { - var _a, _b; - const { highlightParam, markContext, markOptions, addStyles } = options; - this.highlightParam = highlightParam ?? "pagefind-highlight"; - this.addStyles = addStyles ?? true; - this.markContext = markContext !== void 0 ? markContext : null; - this.markOptions = markOptions !== void 0 ? markOptions : { - className: "pagefind-highlight", - exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] - }; - (_a = this.markOptions).className ?? (_a.className = "pagefind__highlight"); - (_b = this.markOptions).exclude ?? (_b.exclude = [ - "[data-pagefind-ignore]", - "[data-pagefind-ignore] *" - ]); - this.markOptions.separateWordSearch = false; - this.highlight(); - } - getHighlightParams(paramName) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.getAll(paramName); - } - // Inline styles might be too hard to override - addHighlightStyles(className) { - if (!className) - return; - const styleElement = document.createElement("style"); - styleElement.innerText = `:where(.${className}) { background-color: yellow; color: black; }`; - document.head.appendChild(styleElement); - } - createMarkInstance() { - if (this.markContext) { - return new import_mark.default(this.markContext); - } - const pagefindBody = document.querySelectorAll("[data-pagefind-body]"); - if (pagefindBody.length !== 0) { - return new import_mark.default(pagefindBody); - } else { - return new import_mark.default(document.body); - } - } - markText(instance, text) { - instance.mark(text, this.markOptions); - } - highlight() { - const params = this.getHighlightParams(this.highlightParam); - if (!params || params.length === 0) - return; - this.addStyles && this.addHighlightStyles(this.markOptions.className); - const markInstance = this.createMarkInstance(); - this.markText(markInstance, params); - } -}; -window.PagefindHighlight = PagefindHighlight; -export { - PagefindHighlight as default -}; -/*! Bundled license information: - -mark.js/dist/mark.js: - (*!*************************************************** - * mark.js v8.11.1 - * https://markjs.io/ - * Copyright (c) 2014–2018, Julian Kühnel - * Released under the MIT license https://git.io/vwTVl - *****************************************************) -*/ diff --git a/docs/go/_/pagefind/pagefind-modular-ui.css b/docs/go/_/pagefind/pagefind-modular-ui.css deleted file mode 100644 index 9c6793ed..00000000 --- a/docs/go/_/pagefind/pagefind-modular-ui.css +++ /dev/null @@ -1,214 +0,0 @@ -:root { - --pagefind-ui-scale: 0.8; - --pagefind-ui-primary: #034AD8; - --pagefind-ui-fade: #707070; - --pagefind-ui-text: #393939; - --pagefind-ui-background: #ffffff; - --pagefind-ui-border: #eeeeee; - --pagefind-ui-tag: #eeeeee; - --pagefind-ui-border-width: 2px; - --pagefind-ui-border-radius: 8px; - --pagefind-ui-image-border-radius: 8px; - --pagefind-ui-image-box-ratio: 3 / 2; - --pagefind-ui-font: system, -apple-system, ".SFNSText-Regular", - "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", - "Lucida Grande", sans-serif; -} - -[data-pfmod-hidden] { - display: none !important; -} - -[data-pfmod-suppressed] { - opacity: 0 !important; - pointer-events: none !important; -} - -[data-pfmod-sr-hidden] { - -webkit-clip: rect(0 0 0 0) !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(100%) !important; - clip-path: inset(100%) !important; - height: 1px !important; - overflow: hidden !important; - overflow: clip !important; - position: absolute !important; - white-space: nowrap !important; - width: 1px !important; -} - -[data-pfmod-loading] { - color: var(--pagefind-ui-text); - background-color: var(--pagefind-ui-text); - border-radius: var(--pagefind-ui-border-radius); - opacity: 0.1; - pointer-events: none; -} - -/* Input */ - -.pagefind-modular-input-wrapper { - position: relative; -} - -.pagefind-modular-input-wrapper::before { - background-color: var(--pagefind-ui-text); - width: calc(18px * var(--pagefind-ui-scale)); - height: calc(18px * var(--pagefind-ui-scale)); - top: calc(23px * var(--pagefind-ui-scale)); - left: calc(20px * var(--pagefind-ui-scale)); - content: ""; - position: absolute; - display: block; - opacity: 0.7; - -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); - mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); - -webkit-mask-size: 100%; - mask-size: 100%; - z-index: 9; - pointer-events: none; -} - -.pagefind-modular-input { - height: calc(64px * var(--pagefind-ui-scale)); - padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale)); - background-color: var(--pagefind-ui-background); - border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); - border-radius: var(--pagefind-ui-border-radius); - font-size: calc(21px * var(--pagefind-ui-scale)); - position: relative; - appearance: none; - -webkit-appearance: none; - display: flex; - width: 100%; - box-sizing: border-box; - font-weight: 700; -} - -.pagefind-modular-input::placeholder { - opacity: 0.2; -} - -.pagefind-modular-input-clear { - position: absolute; - top: calc(2px * var(--pagefind-ui-scale)); - right: calc(2px * var(--pagefind-ui-scale)); - height: calc(60px * var(--pagefind-ui-scale)); - border-radius: var(--pagefind-ui-border-radius); - padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale)); - color: var(--pagefind-ui-text); - font-size: calc(14px * var(--pagefind-ui-scale)); - cursor: pointer; - background-color: var(--pagefind-ui-background); - border: none; - appearance: none; -} - -/* ResultList */ - -.pagefind-modular-list-result { - list-style-type: none; - display: flex; - align-items: flex-start; - gap: min(calc(40px * var(--pagefind-ui-scale)), 3%); - padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale)); - border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); -} - -.pagefind-modular-list-result:last-of-type { - border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); -} - -.pagefind-modular-list-thumb { - width: min(30%, - calc((30% - (100px * var(--pagefind-ui-scale))) * 100000)); - max-width: calc(120px * var(--pagefind-ui-scale)); - margin-top: calc(10px * var(--pagefind-ui-scale)); - aspect-ratio: var(--pagefind-ui-image-box-ratio); - position: relative; -} - -.pagefind-modular-list-image { - display: block; - position: absolute; - left: 50%; - transform: translateX(-50%); - font-size: 0; - width: auto; - height: auto; - max-width: 100%; - max-height: 100%; - border-radius: var(--pagefind-ui-image-border-radius); -} - -.pagefind-modular-list-inner { - flex: 1; - display: flex; - flex-direction: column; - align-items: flex-start; - margin-top: calc(10px * var(--pagefind-ui-scale)); -} - -.pagefind-modular-list-title { - display: inline-block; - font-weight: 700; - font-size: calc(21px * var(--pagefind-ui-scale)); - margin-top: 0; - margin-bottom: 0; -} - -.pagefind-modular-list-link { - color: var(--pagefind-ui-text); - text-decoration: none; -} - -.pagefind-modular-list-link:hover { - text-decoration: underline; -} - -.pagefind-modular-list-excerpt { - display: inline-block; - font-weight: 400; - font-size: calc(16px * var(--pagefind-ui-scale)); - margin-top: calc(4px * var(--pagefind-ui-scale)); - margin-bottom: 0; - min-width: calc(250px * var(--pagefind-ui-scale)); -} - -/* FilterPills */ - -.pagefind-modular-filter-pills-wrapper { - overflow-x: scroll; - padding: 15px 0; -} - -.pagefind-modular-filter-pills { - display: flex; - gap: 6px; -} - -.pagefind-modular-filter-pill { - display: flex; - justify-content: center; - align-items: center; - border: none; - appearance: none; - padding: 0 calc(24px * var(--pagefind-ui-scale)); - background-color: var(--pagefind-ui-background); - color: var(--pagefind-ui-fade); - border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); - border-radius: calc(25px * var(--pagefind-ui-scale)); - font-size: calc(18px * var(--pagefind-ui-scale)); - height: calc(50px * var(--pagefind-ui-scale)); - cursor: pointer; - white-space: nowrap; -} - -.pagefind-modular-filter-pill:hover { - border-color: var(--pagefind-ui-primary); -} - -.pagefind-modular-filter-pill[aria-pressed="true"] { - border-color: var(--pagefind-ui-primary); - color: var(--pagefind-ui-primary); -} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind-modular-ui.js b/docs/go/_/pagefind/pagefind-modular-ui.js deleted file mode 100644 index 93019091..00000000 --- a/docs/go/_/pagefind/pagefind-modular-ui.js +++ /dev/null @@ -1,8 +0,0 @@ -(()=>{var b=Object.defineProperty;var w=(i,e)=>{for(var t in e)b(i,t,{get:e[t],enumerable:!0})};var f={};w(f,{FilterPills:()=>h,Input:()=>l,Instance:()=>p,ResultList:()=>a,Summary:()=>o});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),l=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`
  • -
    -
    -

    ${i(30)}

    -

    ${i(40)}

    -
    -
  • `},y=i=>{let e=new r("li").class("pagefind-modular-list-result"),t=new r("div").class("pagefind-modular-list-thumb").addTo(e);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(t);let s=new r("div").class("pagefind-modular-list-inner").addTo(e),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),e.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},a=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var o=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var h=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`${e} (${t})`:`${e}`}renderNew(){this.available.forEach(([e,t])=>{new r("button").class("pagefind-modular-filter-pill").html(this.pillInner(e,t)).attrs({"aria-pressed":this.selected.includes(e),type:"button"}).handle("click",()=>{e==="All"?this.selected=["All"]:this.selected.includes(e)?this.selected=this.selected.filter(s=>s!==e):this.selectMultiple?this.selected.push(e):this.selected=[e],this.selected?.length?this.selected?.length>1&&(this.selected=this.selected.filter(s=>s!=="All")):this.selected=["All"],this.update(),this.pushFilters()}).addTo(this.pillContainer)})}updateExisting(){let e=[...this.pillContainer.childNodes];this.available.forEach(([t,s],n)=>{e[n].innerHTML=this.pillInner(t,s),e[n].setAttribute("aria-pressed",this.selected.includes(t))})}register(e){this.instance=e,this.instance.on("filters",t=>{if(!this.pillContainer)return;this.selectMultiple?t=t.available:t=t.total;let s=t[this.filter];if(!s){console.warn(`[Pagefind FilterPills component]: No possible values found for the ${this.filter} filter`);return}this.available=Object.entries(s),Array.isArray(this.ordering)?this.available.sort((n,c)=>{let m=this.ordering.indexOf(n[0]),_=this.ordering.indexOf(c[0]);return(m===-1?1/0:m)-(_===-1?1/0:_)}):this.available.sort((n,c)=>n[0].localeCompare(c[0])),this.available.unshift(["All",this.total]),this.update()}),e.on("results",t=>{this.pillContainer&&(this.total=t?.unfilteredResultCount||0,this.available?.[0]?.[0]==="All"&&(this.available[0][1]=this.total),this.total||this.alwaysShow?this.wrapper.removeAttribute("data-pfmod-hidden"):this.wrapper.setAttribute("data-pfmod-hidden","true"),this.update())})}};var F=async(i=50)=>await new Promise(e=>setTimeout(e,i)),u;try{u=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?modular-ui.js.*$/)[1]}catch{u="/pagefind/"}var p=class{constructor(e={}){this.__pagefind__=null,this.__initializing__=null,this.__searchID__=0,this.__hooks__={search:[],filters:[],loading:[],results:[]},this.components=[],this.searchTerm="",this.searchFilters={},this.searchResult={},this.availableFilters=null,this.totalFilters=null,this.options={bundlePath:e.bundlePath??u,mergeIndex:e.mergeIndex??[]},delete e.bundlePath,delete e.resetStyles,delete e.processResult,delete e.processTerm,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,this.pagefindOptions=e}add(e){e?.register?.(this),this.components.push(e)}on(e,t){if(!this.__hooks__[e]){let s=Object.keys(this.__hooks__).join(", ");console.error(`[Pagefind Composable]: Unknown event type ${e}. Supported events: [${s}]`);return}if(typeof t!="function"){console.error(`[Pagefind Composable]: Expected callback to be a function, received ${typeof t}`);return}this.__hooks__[e].push(t)}triggerLoad(){this.__load__()}triggerSearch(e){this.searchTerm=e,this.__dispatch__("search",e,this.searchFilters),this.__search__(e,this.searchFilters)}triggerSearchWithFilters(e,t){this.searchTerm=e,this.searchFilters=t,this.__dispatch__("search",e,t),this.__search__(e,t)}triggerFilters(e){this.searchFilters=e,this.__dispatch__("search",this.searchTerm,e),this.__search__(this.searchTerm,e)}triggerFilter(e,t){this.searchFilters=this.searchFilters||{},this.searchFilters[e]=t,this.__dispatch__("search",this.searchTerm,this.searchFilters),this.__search__(this.searchTerm,this.searchFilters)}__dispatch__(e,...t){this.__hooks__[e]?.forEach(s=>s?.(...t))}async __clear__(){this.__dispatch__("results",{results:[],unfilteredTotalCount:0}),this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}async __search__(e,t){this.__dispatch__("loading"),await this.__load__();let s=++this.__searchID__;if(!e||!e.length)return this.__clear__();let n=await this.__pagefind__.search(e,{filters:t});n&&this.__searchID__===s&&(n.filters&&Object.keys(n.filters)?.length&&(this.availableFilters=n.filters,this.totalFilters=n.totalFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})),this.searchResult=n,this.__dispatch__("results",this.searchResult))}async __load__(){if(this.__initializing__){for(;!this.__pagefind__;)await F(50);return}if(this.__initializing__=!0,!this.__pagefind__){let e;try{e=await import(`${this.options.bundlePath}pagefind.js`)}catch(t){console.error(t),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindComposable Instance",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` -`))}await e.options(this.pagefindOptions||{});for(let t of this.options.mergeIndex){if(!t.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let s=t.bundlePath;delete t.bundlePath,await e.mergeIndex(s,t)}this.__pagefind__=e}this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}};window.PagefindModularUI=f;})(); diff --git a/docs/go/_/pagefind/pagefind-ui.css b/docs/go/_/pagefind/pagefind-ui.css deleted file mode 100644 index d7984a98..00000000 --- a/docs/go/_/pagefind/pagefind-ui.css +++ /dev/null @@ -1 +0,0 @@ -.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"\2937 ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;appearance:revert}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable="true"]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)} diff --git a/docs/go/_/pagefind/pagefind-ui.js b/docs/go/_/pagefind/pagefind-ui.js deleted file mode 100644 index e964ecaf..00000000 --- a/docs/go/_/pagefind/pagefind-ui.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{var is=Object.defineProperty;var v=(n,e)=>{for(var t in e)is(n,t,{get:e[t],enumerable:!0})};function j(){}function lt(n){return n()}function Qt(){return Object.create(null)}function V(n){n.forEach(lt)}function Ye(n){return typeof n=="function"}function G(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var Ke;function le(n,e){return Ke||(Ke=document.createElement("a")),Ke.href=e,n===Ke.href}function xt(n){return Object.keys(n).length===0}var $t=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,fe=class{constructor(e){this.options=e,this._listeners="WeakMap"in $t?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var s;for(let r of t)fe.entries.set(r.target,r),(s=this._listeners.get(r.target))===null||s===void 0||s(r)})}};fe.entries="WeakMap"in $t?new WeakMap:void 0;var en=!1;function as(){en=!0}function os(){en=!1}function b(n,e){n.appendChild(e)}function y(n,e,t){n.insertBefore(e,t||null)}function C(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;tn.removeEventListener(e,t,s)}function p(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function cs(n){return Array.from(n.childNodes)}function N(n,e){e=""+e,n.data!==e&&(n.data=e)}function it(n,e){n.value=e??""}function W(n,e,t){n.classList[t?"add":"remove"](e)}var Xe=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,s=null){this.e||(this.is_svg?this.e=us(t.nodeName):this.e=k(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(s)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;tn.indexOf(s)===-1?e.push(s):t.push(s)),t.forEach(s=>s()),se=e}var Je=new Set,ee;function ie(){ee={r:0,c:[],p:ee}}function ae(){ee.r||V(ee.c),ee=ee.p}function z(n,e){n&&n.i&&(Je.delete(n),n.i(e))}function I(n,e,t,s){if(n&&n.o){if(Je.has(n))return;Je.add(n),ee.c.push(()=>{Je.delete(n),s&&(t&&n.d(1),s())}),n.o(e)}else s&&s()}function rn(n,e){I(n,1,1,()=>{e.delete(n.key)})}function ln(n,e,t,s,r,l,i,a,o,h,_,f){let c=n.length,E=l.length,u=c,m={};for(;u--;)m[n[u].key]=u;let d=[],R=new Map,T=new Map,S=[];for(u=E;u--;){let F=f(r,l,u),U=t(F),P=i.get(U);P?s&&S.push(()=>P.p(F,e)):(P=h(U,F),P.c()),R.set(U,d[u]=P),U in m&&T.set(U,Math.abs(u-m[U]))}let w=new Set,B=new Set;function X(F){z(F,1),F.m(a,_),i.set(F.key,F),_=F.first,E--}for(;c&&E;){let F=d[E-1],U=n[c-1],P=F.key,Z=U.key;F===U?(_=F.first,c--,E--):R.has(Z)?!i.has(P)||w.has(P)?X(F):B.has(Z)?c--:T.get(P)>T.get(Z)?(B.add(P),X(F)):(w.add(Z),c--):(o(U,i),c--)}for(;c--;){let F=n[c];R.has(F.key)||o(F,i)}for(;E;)X(d[E-1]);return V(S),d}var ms=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Fi=new Set([...ms]);function an(n,e,t){let s=n.$$.props[e];s!==void 0&&(n.$$.bound[s]=t,t(n.$$.ctx[s]))}function Ze(n){n&&n.c()}function he(n,e,t,s){let{fragment:r,after_update:l}=n.$$;r&&r.m(e,t),s||rt(()=>{let i=n.$$.on_mount.map(lt).filter(Ye);n.$$.on_destroy?n.$$.on_destroy.push(...i):V(i),n.$$.on_mount=[]}),l.forEach(rt)}function oe(n,e){let t=n.$$;t.fragment!==null&&(hs(t.after_update),V(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function ps(n,e){n.$$.dirty[0]===-1&&(ne.push(n),fs(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{let u=E.length?E[0]:c;return h.ctx&&r(h.ctx[f],h.ctx[f]=u)&&(!h.skip_bound&&h.bound[f]&&h.bound[f](u),_&&ps(n,f)),c}):[],h.update(),_=!0,V(h.before_update),h.fragment=s?s(h.ctx):!1,e.target){if(e.hydrate){as();let f=cs(e.target);h.fragment&&h.fragment.l(f),f.forEach(C)}else h.fragment&&h.fragment.c();e.intro&&z(n.$$.fragment),he(n,e.target,e.anchor,e.customElement),os(),sn()}_e(o)}var gs;typeof HTMLElement=="function"&&(gs=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:n}=this.$$;this.$$.on_disconnect=n.map(lt).filter(Ye);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(n,e,t){this[n]=t}disconnectedCallback(){V(this.$$.on_disconnect)}$destroy(){oe(this,1),this.$destroy=j}$on(n,e){if(!Ye(e))return j;let t=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return t.push(e),()=>{let s=t.indexOf(e);s!==-1&&t.splice(s,1)}}$set(n){this.$$set&&!xt(n)&&(this.$$.skip_bound=!0,this.$$set(n),this.$$.skip_bound=!1)}});var q=class{$destroy(){oe(this,1),this.$destroy=j}$on(e,t){if(!Ye(t))return j;let s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(t),()=>{let r=s.indexOf(t);r!==-1&&s.splice(r,1)}}$set(e){this.$$set&&!xt(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function D(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=97&&e<=122||e>=65&&e<=90}function $(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=48&&e<=57}function Y(n){return D(n)||$(n)}var on=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"];var ut={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"};var Es={}.hasOwnProperty;function Qe(n,e={}){let t=un(),s=String(n),r=s.toLowerCase(),l=0;if(n==null)throw new Error("Expected string, got `"+n+"`");if(Es.call(ut,r)){let a=ut[r];return(e.normalize===void 0||e.normalize===null||e.normalize)&&typeof a=="string"?Qe(a):(t[on.includes(r)?"regular":"irregular"]=s,t)}for(;D(r.charCodeAt(l))&&l<9;)l++;if(l>1&&l<9){if(t.language=s.slice(0,l),l<4){let a=0;for(;r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&!D(r.charCodeAt(l+4));){if(a>2)return i(l,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(s.slice(l+1,l+4)),l+=4,a++}}for(r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&D(r.charCodeAt(l+4))&&!D(r.charCodeAt(l+5))&&(t.script=s.slice(l+1,l+5),l+=5),r.charCodeAt(l)===45&&(D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&!D(r.charCodeAt(l+3))?(t.region=s.slice(l+1,l+3),l+=3):$(r.charCodeAt(l+1))&&$(r.charCodeAt(l+2))&&$(r.charCodeAt(l+3))&&!$(r.charCodeAt(l+4))&&(t.region=s.slice(l+1,l+4),l+=4));r.charCodeAt(l)===45;){let a=l+1,o=a;for(;Y(r.charCodeAt(o));){if(o-a>7)return i(o,1,"Too long variant, expected at most 8 characters");o++}if(o-a>4||o-a>3&&$(r.charCodeAt(a)))t.variants.push(s.slice(a,o)),l=o;else break}for(;r.charCodeAt(l)===45&&!(r.charCodeAt(l+1)===120||!Y(r.charCodeAt(l+1))||r.charCodeAt(l+2)!==45||!Y(r.charCodeAt(l+3)));){let a=l+2,o=0;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1))&&Y(r.charCodeAt(a+2));){let h=a+1;for(a=h+2,o++;Y(r.charCodeAt(a));){if(a-h>7)return i(a,2,"Too long extension, expected at most 8 characters");a++}}if(!o)return i(a,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:s.charAt(l+1),extensions:s.slice(l+3,a).split("-")}),l=a}}else l=0;if(l===0&&r.charCodeAt(l)===120||r.charCodeAt(l)===45&&r.charCodeAt(l+1)===120){l=l?l+2:1;let a=l;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1));){let o=l+1;for(a=o;Y(r.charCodeAt(a));){if(a-o>7)return i(a,5,"Too long private-use area, expected at most 8 characters");a++}t.privateuse.push(s.slice(l+1,a)),l=a}}if(l!==s.length)return i(l,6,"Found superfluous content after tag");return t;function i(a,o,h){return e.warning&&e.warning(h,o,a),e.forgiving?t:un()}}function un(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function cn(n,e,t){let s=n.slice();return s[8]=e[t][0],s[9]=e[t][1],s}function bs(n){let e,t,s,r,l,i=n[0]&&_n(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[3](30)}`,r=M(),l=k("p"),l.textContent=`${n[3](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=_n(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function Rs(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_=n[1].excerpt+"",f,c=n[0]&&fn(n),E=n[2].length&&hn(n);return{c(){c&&c.c(),e=M(),t=k("div"),s=k("p"),r=k("a"),i=A(l),o=M(),h=k("p"),f=M(),E&&E.c(),p(r,"class","pagefind-ui__result-link svelte-j9e30"),p(r,"href",a=n[1].meta?.url||n[1].url),p(s,"class","pagefind-ui__result-title svelte-j9e30"),p(h,"class","pagefind-ui__result-excerpt svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(u,m){c&&c.m(u,m),y(u,e,m),y(u,t,m),b(t,s),b(s,r),b(r,i),b(t,o),b(t,h),h.innerHTML=_,b(t,f),E&&E.m(t,null)},p(u,m){u[0]?c?c.p(u,m):(c=fn(u),c.c(),c.m(e.parentNode,e)):c&&(c.d(1),c=null),m&2&&l!==(l=u[1].meta?.title+"")&&N(i,l),m&2&&a!==(a=u[1].meta?.url||u[1].url)&&p(r,"href",a),m&2&&_!==(_=u[1].excerpt+"")&&(h.innerHTML=_),u[2].length?E?E.p(u,m):(E=hn(u),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(u){c&&c.d(u),u&&C(e),u&&C(t),E&&E.d()}}}function _n(n){let e;return{c(){e=k("div"),p(e,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,s){y(t,e,s)},d(t){t&&C(e)}}}function fn(n){let e,t=n[1].meta.image&&dn(n);return{c(){e=k("div"),t&&t.c(),p(e,"class","pagefind-ui__result-thumb svelte-j9e30")},m(s,r){y(s,e,r),t&&t.m(e,null)},p(s,r){s[1].meta.image?t?t.p(s,r):(t=dn(s),t.c(),t.m(e,null)):t&&(t.d(1),t=null)},d(s){s&&C(e),t&&t.d()}}}function dn(n){let e,t,s;return{c(){e=k("img"),p(e,"class","pagefind-ui__result-image svelte-j9e30"),le(e.src,t=n[1].meta?.image)||p(e,"src",t),p(e,"alt",s=n[1].meta?.image_alt||n[1].meta?.title)},m(r,l){y(r,e,l)},p(r,l){l&2&&!le(e.src,t=r[1].meta?.image)&&p(e,"src",t),l&2&&s!==(s=r[1].meta?.image_alt||r[1].meta?.title)&&p(e,"alt",s)},d(r){r&&C(e)}}}function hn(n){let e,t=n[2],s=[];for(let r=0;rn.toLocaleUpperCase();function ks(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=async f=>{t(1,a=await f.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([c])=>!i.includes(c)))},_=(f=30)=>". ".repeat(Math.floor(10+Math.random()*f));return n.$$set=f=>{"show_images"in f&&t(0,s=f.show_images),"process_result"in f&&t(4,r=f.process_result),"result"in f&&t(5,l=f.result)},n.$$.update=()=>{if(n.$$.dirty&32)e:h(l)},[s,a,o,_,r,l]}var ct=class extends q{constructor(e){super(),J(this,e,ks,Ts,G,{show_images:0,process_result:4,result:5})}},gn=ct;function En(n,e,t){let s=n.slice();return s[11]=e[t][0],s[12]=e[t][1],s}function bn(n,e,t){let s=n.slice();return s[15]=e[t],s}function Cs(n){let e,t,s,r,l,i=n[0]&&Rn(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[5](30)}`,r=M(),l=k("p"),l.textContent=`${n[5](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),p(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=Rn(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function ys(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_,f=n[0]&&Tn(n),c=n[4]&&Cn(n),E=n[3],u=[];for(let d=0;dn.toLocaleUpperCase();function vs(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=[],_=!1,f=(u,m)=>{if(u.length<=m)return u;let d=[...u].sort((R,T)=>T.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return u.filter(R=>d.includes(R.url))},c=async u=>{t(1,a=await u.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([m])=>!i.includes(m))),Array.isArray(a.sub_results)&&(t(4,_=a.sub_results?.[0]?.url===(a.meta?.url||a.url)),_?t(3,h=f(a.sub_results.slice(1),3)):t(3,h=f([...a.sub_results],3)))},E=(u=30)=>". ".repeat(Math.floor(10+Math.random()*u));return n.$$set=u=>{"show_images"in u&&t(0,s=u.show_images),"process_result"in u&&t(6,r=u.process_result),"result"in u&&t(7,l=u.result)},n.$$.update=()=>{if(n.$$.dirty&128)e:c(l)},[s,a,o,h,_,E,r,l]}var _t=class extends q{constructor(e){super(),J(this,e,vs,Ss,G,{show_images:0,process_result:6,result:7})}},An=_t;function wn(n,e,t){let s=n.slice();return s[9]=e[t][0],s[10]=e[t][1],s[11]=e,s[12]=t,s}function Fn(n,e,t){let s=n.slice();return s[13]=e[t][0],s[14]=e[t][1],s[15]=e,s[16]=t,s}function Hn(n){let e,t,s=n[3]("filters_label",n[4],n[5])+"",r,l,i=Object.entries(n[1]),a=[];for(let o=0;on.toLocaleUpperCase();function As(n,e,t){let{available_filters:s=null}=e,{show_empty_filters:r=!0}=e,{translate:l=()=>""}=e,{automatic_translations:i={}}=e,{translations:a={}}=e,o={},h=!1,_=!1;function f(c,E){o[`${c}:${E}`]=this.checked,t(0,o)}return n.$$set=c=>{"available_filters"in c&&t(1,s=c.available_filters),"show_empty_filters"in c&&t(2,r=c.show_empty_filters),"translate"in c&&t(3,l=c.translate),"automatic_translations"in c&&t(4,i=c.automatic_translations),"translations"in c&&t(5,a=c.translations)},n.$$.update=()=>{if(n.$$.dirty&130){e:if(s&&!h){t(7,h=!0);let c=Object.entries(s||{});c.length===1&&Object.entries(c[0][1])?.length<=6&&t(6,_=!0)}}},[o,s,r,l,i,a,_,h,f]}var ft=class extends q{constructor(e){super(),J(this,e,As,Ms,G,{available_filters:1,show_empty_filters:2,translate:3,automatic_translations:4,translations:5,selected_filters:0})}get selected_filters(){return this.$$.ctx[0]}},Dn=ft;var dt={};v(dt,{comments:()=>Fs,default:()=>Os,direction:()=>Hs,strings:()=>Ns,thanks_to:()=>ws});var ws="Jan Claasen ",Fs="",Hs="ltr",Ns={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},Os={thanks_to:ws,comments:Fs,direction:Hs,strings:Ns};var ht={};v(ht,{comments:()=>zs,default:()=>Is,direction:()=>Ds,strings:()=>Us,thanks_to:()=>js});var js="Maruf Alom ",zs="",Ds="ltr",Us={placeholder:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",clear_search:"\u09AE\u09C1\u099B\u09C7 \u09AB\u09C7\u09B2\u09C1\u09A8",load_more:"\u0986\u09B0\u09CB \u09AB\u09B2\u09BE\u09AB\u09B2 \u09A6\u09C7\u0996\u09C1\u09A8",search_label:"\u098F\u0987 \u0993\u09DF\u09C7\u09AC\u09B8\u09BE\u0987\u099F\u09C7 \u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",filters_label:"\u09AB\u09BF\u09B2\u09CD\u099F\u09BE\u09B0",zero_results:"[SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF",many_results:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",one_result:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",alt_search:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF. \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09C7 [DIFFERENT_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u09A6\u09C7\u0996\u09BE\u09A8\u09CB \u09B9\u099A\u09CD\u099B\u09C7",search_suggestion:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u09AC\u09BF\u09B7\u09DF\u09C7. \u09A8\u09BF\u09A8\u09CD\u09AE\u09C7\u09B0 \u09AC\u09BF\u09B7\u09DF\u09AC\u09B8\u09CD\u09A4\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09A6\u09C7\u0996\u09C1\u09A8:",searching:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u099A\u09B2\u099B\u09C7 [SEARCH_TERM]..."},Is={thanks_to:js,comments:zs,direction:Ds,strings:Us};var mt={};v(mt,{comments:()=>Ls,default:()=>Ws,direction:()=>qs,strings:()=>Bs,thanks_to:()=>Ps});var Ps="Pablo Villaverde ",Ls="",qs="ltr",Bs={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure m\xE9es resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques seg\xFCents:",searching:"Cercant [SEARCH_TERM]..."},Ws={thanks_to:Ps,comments:Ls,direction:qs,strings:Bs};var pt={};v(pt,{comments:()=>Gs,default:()=>Ys,direction:()=>Ks,strings:()=>Js,thanks_to:()=>Vs});var Vs="Jonas Smedegaard ",Gs="",Ks="ltr",Js={placeholder:"S\xF8g",clear_search:"Nulstil",load_more:"Indl\xE6s flere resultater",search_label:"S\xF8g p\xE5 dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v et af disse s\xF8geord i stedet:",searching:"S\xF8ger efter [SEARCH_TERM]..."},Ys={thanks_to:Vs,comments:Gs,direction:Ks,strings:Js};var gt={};v(gt,{comments:()=>Zs,default:()=>$s,direction:()=>Qs,strings:()=>xs,thanks_to:()=>Xs});var Xs="Jan Claasen ",Zs="",Qs="ltr",xs={placeholder:"Suche",clear_search:"L\xF6schen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse f\xFCr [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse f\xFCr [SEARCH_TERM]",one_result:"[COUNT] Ergebnis f\xFCr [SEARCH_TERM]",alt_search:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Stattdessen werden Ergebnisse f\xFCr [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche f\xFCr [SEARCH_TERM]"},$s={thanks_to:Xs,comments:Zs,direction:Qs,strings:xs};var Et={};v(Et,{comments:()=>tr,default:()=>rr,direction:()=>nr,strings:()=>sr,thanks_to:()=>er});var er="Liam Bigelow ",tr="",nr="ltr",sr={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},rr={thanks_to:er,comments:tr,direction:nr,strings:sr};var bt={};v(bt,{comments:()=>ir,default:()=>ur,direction:()=>ar,strings:()=>or,thanks_to:()=>lr});var lr="Pablo Villaverde ",ir="",ar="ltr",or={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver m\xE1s resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes b\xFAsquedas:",searching:"Buscando [SEARCH_TERM]..."},ur={thanks_to:lr,comments:ir,direction:ar,strings:or};var Rt={};v(Rt,{comments:()=>_r,default:()=>hr,direction:()=>fr,strings:()=>dr,thanks_to:()=>cr});var cr="Valtteri Laitinen ",_r="",fr="ltr",dr={placeholder:"Haku",clear_search:"Tyhjenn\xE4",load_more:"Lataa lis\xE4\xE4 tuloksia",search_label:"Hae t\xE4lt\xE4 sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. N\xE4ytet\xE4\xE4n tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},hr={thanks_to:cr,comments:_r,direction:fr,strings:dr};var Tt={};v(Tt,{comments:()=>pr,default:()=>br,direction:()=>gr,strings:()=>Er,thanks_to:()=>mr});var mr="Nicolas Friedli ",pr="",gr="ltr",Er={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de r\xE9sultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de r\xE9sultat pour [SEARCH_TERM]",many_results:"[COUNT] r\xE9sultats pour [SEARCH_TERM]",one_result:"[COUNT] r\xE9sultat pour [SEARCH_TERM]",alt_search:"Pas de r\xE9sultat pour [SEARCH_TERM]. Montre les r\xE9sultats pour [DIFFERENT_TERM] \xE0 la place",search_suggestion:"Pas de r\xE9sultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},br={thanks_to:mr,comments:pr,direction:gr,strings:Er};var kt={};v(kt,{comments:()=>Tr,default:()=>yr,direction:()=>kr,strings:()=>Cr,thanks_to:()=>Rr});var Rr="Pablo Villaverde ",Tr="",kr="ltr",Cr={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver m\xE1is resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},yr={thanks_to:Rr,comments:Tr,direction:kr,strings:Cr};var Ct={};v(Ct,{comments:()=>vr,default:()=>wr,direction:()=>Mr,strings:()=>Ar,thanks_to:()=>Sr});var Sr="Amit Yadav ",vr="",Mr="ltr",Ar={placeholder:"\u0916\u094B\u091C\u0947\u0902",clear_search:"\u0938\u093E\u092B \u0915\u0930\u0947\u0902",load_more:"\u0914\u0930 \u0905\u0927\u093F\u0915 \u092A\u0930\u093F\u0923\u093E\u092E \u0932\u094B\u0921 \u0915\u0930\u0947\u0902",search_label:"\u0907\u0938 \u0938\u093E\u0907\u091F \u092E\u0947\u0902 \u0916\u094B\u091C\u0947\u0902",filters_label:"\u092B\u093C\u093F\u0932\u094D\u091F\u0930",zero_results:"\u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",many_results:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u0947",one_result:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u093E",alt_search:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0907\u0938\u0915\u0947 \u092C\u091C\u093E\u092F [DIFFERENT_TERM] \u0915\u0947 \u0932\u093F\u090F \u092A\u0930\u093F\u0923\u093E\u092E \u0926\u093F\u0916\u093E \u0930\u0939\u093E \u0939\u0948",search_suggestion:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0928\u093F\u092E\u094D\u0928\u0932\u093F\u0916\u093F\u0924 \u0916\u094B\u091C\u094B\u0902 \u092E\u0947\u0902 \u0938\u0947 \u0915\u094B\u0908 \u090F\u0915 \u0906\u091C\u093C\u092E\u093E\u090F\u0902:",searching:"[SEARCH_TERM] \u0915\u0940 \u0916\u094B\u091C \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948..."},wr={thanks_to:Sr,comments:vr,direction:Mr,strings:Ar};var yt={};v(yt,{comments:()=>Hr,default:()=>jr,direction:()=>Nr,strings:()=>Or,thanks_to:()=>Fr});var Fr="Diomed ",Hr="",Nr="ltr",Or={placeholder:"Tra\u017Ei",clear_search:"O\u010Disti",load_more:"U\u010Ditaj vi\u0161e rezultata",search_label:"Pretra\u017Ei ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Poku\u0161aj s jednom od ovih pretraga:",searching:"Pretra\u017Eujem [SEARCH_TERM]..."},jr={thanks_to:Fr,comments:Hr,direction:Nr,strings:Or};var St={};v(St,{comments:()=>Dr,default:()=>Pr,direction:()=>Ur,strings:()=>Ir,thanks_to:()=>zr});var zr="Adam Laki ",Dr="",Ur="ltr",Ir={placeholder:"Keres\xE9s",clear_search:"T\xF6rl\xE9s",load_more:"Tov\xE1bbi tal\xE1latok bet\xF6lt\xE9se",search_label:"Keres\xE9s az oldalon",filters_label:"Sz\u0171r\xE9s",zero_results:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",many_results:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",one_result:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",alt_search:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Tal\xE1latok mutat\xE1sa ink\xE1bb a(z) [DIFFERENT_TERM] kifejez\xE9sre",search_suggestion:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Pr\xF3b\xE1ld meg a k\xF6vetkez\u0151 keres\xE9sek egyik\xE9t:",searching:"Keres\xE9s a(z) [SEARCH_TERM] kifejez\xE9sre..."},Pr={thanks_to:zr,comments:Dr,direction:Ur,strings:Ir};var vt={};v(vt,{comments:()=>qr,default:()=>Vr,direction:()=>Br,strings:()=>Wr,thanks_to:()=>Lr});var Lr="Nixentric",qr="",Br="ltr",Wr={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},Vr={thanks_to:Lr,comments:qr,direction:Br,strings:Wr};var Mt={};v(Mt,{comments:()=>Kr,default:()=>Xr,direction:()=>Jr,strings:()=>Yr,thanks_to:()=>Gr});var Gr="Cosette Bruhns Alonso, Andrew Janco ",Kr="",Jr="ltr",Yr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra pi\xF9 risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},Xr={thanks_to:Gr,comments:Kr,direction:Jr,strings:Yr};var At={};v(At,{comments:()=>Qr,default:()=>el,direction:()=>xr,strings:()=>$r,thanks_to:()=>Zr});var Zr="Tate",Qr="",xr="ltr",$r={placeholder:"\u691C\u7D22",clear_search:"\u6D88\u3059",load_more:"\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080",search_label:"\u3053\u306E\u30B5\u30A4\u30C8\u3092\u691C\u7D22",filters_label:"\u30D5\u30A3\u30EB\u30BF",zero_results:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F",many_results:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",one_result:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",alt_search:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002[DIFFERENT_TERM]\u306E\u691C\u7D22\u7D50\u679C\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059",search_suggestion:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u691C\u7D22\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044",searching:"[SEARCH_TERM]\u3092\u691C\u7D22\u3057\u3066\u3044\u307E\u3059"},el={thanks_to:Zr,comments:Qr,direction:xr,strings:$r};var wt={};v(wt,{comments:()=>nl,default:()=>ll,direction:()=>sl,strings:()=>rl,thanks_to:()=>tl});var tl="",nl="",sl="ltr",rl={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta \u0113tahi otinga k\u0113",search_label:"Rapu",filters_label:"T\u0101tari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga k\u0113 ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakam\u0101tau ki ng\u0101 mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},ll={thanks_to:tl,comments:nl,direction:sl,strings:rl};var Ft={};v(Ft,{comments:()=>al,default:()=>cl,direction:()=>ol,strings:()=>ul,thanks_to:()=>il});var il="Paul van Brouwershaven",al="",ol="ltr",ul={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},cl={thanks_to:il,comments:al,direction:ol,strings:ul};var Ht={};v(Ht,{comments:()=>fl,default:()=>ml,direction:()=>dl,strings:()=>hl,thanks_to:()=>_l});var _l="Christopher Wingate",fl="",dl="ltr",hl={placeholder:"S\xF8k",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"S\xF8k p\xE5 denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v en av disse s\xF8keordene i stedet:",searching:"S\xF8ker etter [SEARCH_TERM]"},ml={thanks_to:_l,comments:fl,direction:dl,strings:hl};var Nt={};v(Nt,{comments:()=>gl,default:()=>Rl,direction:()=>El,strings:()=>bl,thanks_to:()=>pl});var pl="",gl="",El="ltr",bl={placeholder:"Szukaj",clear_search:"Wyczy\u015B\u0107",load_more:"Za\u0142aduj wi\u0119cej",search_label:"Przeszukaj t\u0119 stron\u0119",filters_label:"Filtry",zero_results:"Brak wynik\xF3w dla [SEARCH_TERM]",many_results:"[COUNT] wynik\xF3w dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wynik\xF3w dla [SEARCH_TERM]. Wy\u015Bwietlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wynik\xF3w dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Rl={thanks_to:pl,comments:gl,direction:El,strings:bl};var Ot={};v(Ot,{comments:()=>kl,default:()=>Sl,direction:()=>Cl,strings:()=>yl,thanks_to:()=>Tl});var Tl="Jonatah",kl="",Cl="ltr",yl={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},Sl={thanks_to:Tl,comments:kl,direction:Cl,strings:yl};var jt={};v(jt,{comments:()=>Ml,default:()=>Fl,direction:()=>Al,strings:()=>wl,thanks_to:()=>vl});var vl="Aleksandr Gordeev",Ml="",Al="ltr",wl={placeholder:"\u041F\u043E\u0438\u0441\u043A",clear_search:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u043B\u0435",load_more:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0435\u0449\u0435",search_label:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0441\u0430\u0439\u0442\u0443",filters_label:"\u0424\u0438\u043B\u044C\u0442\u0440\u044B",zero_results:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",alt_search:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u044B \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [DIFFERENT_TERM]",search_suggestion:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0438\u0437 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",searching:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]"},Fl={thanks_to:vl,comments:Ml,direction:Al,strings:wl};var zt={};v(zt,{comments:()=>Nl,default:()=>zl,direction:()=>Ol,strings:()=>jl,thanks_to:()=>Hl});var Hl="Andrija Sagicc",Nl="",Ol="ltr",jl={placeholder:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430",clear_search:"\u0411\u0440\u0438\u0441\u0430\u045A\u0435",load_more:"\u041F\u0440\u0438\u043A\u0430\u0437 \u0432\u0438\u0448\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430",search_label:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0430\u0458\u0442\u0430",filters_label:"\u0424\u0438\u043B\u0442\u0435\u0440\u0438",zero_results:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",alt_search:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u0440\u0438\u043A\u0430\u0437 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043A \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [DIFFERENT_TERM]",search_suggestion:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0441\u0430 \u043D\u0435\u043A\u043E\u043C \u043E\u0434 \u0441\u043B\u0435\u0434\u0435\u045B\u0438\u0445 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430:",searching:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0442\u0435\u0440\u043C\u0438\u043D\u0430 [SEARCH_TERM]..."},zl={thanks_to:Hl,comments:Nl,direction:Ol,strings:jl};var Dt={};v(Dt,{comments:()=>Ul,default:()=>Ll,direction:()=>Il,strings:()=>Pl,thanks_to:()=>Dl});var Dl="Montazar Al-Jaber ",Ul="",Il="ltr",Pl={placeholder:"S\xF6k",clear_search:"Rensa",load_more:"Visa fler tr\xE4ffar",search_label:"S\xF6k p\xE5 denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga tr\xE4ffar",many_results:"[SEARCH_TERM] gav [COUNT] tr\xE4ffar",one_result:"[SEARCH_TERM] gav [COUNT] tr\xE4ff",alt_search:"[SEARCH_TERM] gav inga tr\xE4ffar. Visar resultat f\xF6r [DIFFERENT_TERM] ist\xE4llet",search_suggestion:"[SEARCH_TERM] gav inga tr\xE4ffar. F\xF6rs\xF6k igen med en av f\xF6ljande s\xF6kord:",searching:"S\xF6ker efter [SEARCH_TERM]..."},Ll={thanks_to:Dl,comments:Ul,direction:Il,strings:Pl};var Ut={};v(Ut,{comments:()=>Bl,default:()=>Gl,direction:()=>Wl,strings:()=>Vl,thanks_to:()=>ql});var ql="",Bl="",Wl="ltr",Vl={placeholder:"\u0BA4\u0BC7\u0B9F\u0BC1\u0B95",clear_search:"\u0B85\u0BB4\u0BBF\u0B95\u0BCD\u0B95\u0BC1\u0B95",load_more:"\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95",search_label:"\u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BB3\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B95",filters_label:"\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",zero_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8",many_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 [COUNT] \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD",one_result:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1",alt_search:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD\u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8, \u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B92\u0BA4\u0BCD\u0BA4 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8.\u0B87\u0BA4\u0BB1\u0BCD\u0B95\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC0\u0B9F\u0BBE\u0BA9 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC8 \u0BA4\u0BC7\u0B9F\u0BC1\u0B95:",searching:"[SEARCH_TERM] \u0BA4\u0BC7\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1"},Gl={thanks_to:ql,comments:Bl,direction:Wl,strings:Vl};var It={};v(It,{comments:()=>Jl,default:()=>Zl,direction:()=>Yl,strings:()=>Xl,thanks_to:()=>Kl});var Kl="Taylan \xD6zg\xFCr Bildik",Jl="",Yl="ltr",Xl={placeholder:"Ara\u015Ft\u0131r",clear_search:"Temizle",load_more:"Daha fazla sonu\xE7",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] i\xE7in sonu\xE7 yok",many_results:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",one_result:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",alt_search:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Bunun yerine [DIFFERENT_TERM] i\xE7in sonu\xE7lar g\xF6steriliyor",search_suggestion:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Alternatif olarak a\u015Fa\u011F\u0131daki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] ara\u015Ft\u0131r\u0131l\u0131yor..."},Zl={thanks_to:Kl,comments:Jl,direction:Yl,strings:Xl};var Pt={};v(Pt,{comments:()=>xl,default:()=>ti,direction:()=>$l,strings:()=>ei,thanks_to:()=>Ql});var Ql="Long Nhat Nguyen",xl="",$l="ltr",ei={placeholder:"T\xECm ki\u1EBFm",clear_search:"X\xF3a",load_more:"Nhi\u1EC1u k\u1EBFt qu\u1EA3 h\u01A1n",search_label:"T\xECm ki\u1EBFm trong trang n\xE0y",filters_label:"B\u1ED9 l\u1ECDc",zero_results:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",many_results:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",one_result:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",alt_search:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Ki\u1EC3m th\u1ECB k\u1EBFt qu\u1EA3 thay th\u1EBF v\u1EDBi [DIFFERENT_TERM]",search_suggestion:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Th\u1EED m\u1ED9t trong c\xE1c t\xECm ki\u1EBFm:",searching:"\u0110ang t\xECm ki\u1EBFm cho [SEARCH_TERM]..."},ti={thanks_to:Ql,comments:xl,direction:$l,strings:ei};var Lt={};v(Lt,{comments:()=>si,default:()=>ii,direction:()=>ri,strings:()=>li,thanks_to:()=>ni});var ni="Amber Song",si="",ri="ltr",li={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},ii={thanks_to:ni,comments:si,direction:ri,strings:li};var qt={};v(qt,{comments:()=>oi,default:()=>_i,direction:()=>ui,strings:()=>ci,thanks_to:()=>ai});var ai="Amber Song",oi="",ui="ltr",ci={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F09\u66F4\u591A\u7D50\u679C",search_label:"\u7AD9\u5167\u641C\u7D22",filters_label:"\u7BE9\u9078",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",many_results:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",one_result:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u6539\u70BA\u986F\u793A [DIFFERENT_TERM] \u7684\u76F8\u95DC\u7D50\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u8ACB\u5617\u8A66\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},_i={thanks_to:ai,comments:oi,direction:ui,strings:ci};var Bt={};v(Bt,{comments:()=>di,default:()=>pi,direction:()=>hi,strings:()=>mi,thanks_to:()=>fi});var fi="Amber Song",di="",hi="ltr",mi={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},pi={thanks_to:fi,comments:di,direction:hi,strings:mi};var gi=[dt,ht,mt,pt,gt,Et,bt,Rt,Tt,kt,Ct,yt,St,vt,Mt,At,wt,Ft,Ht,Nt,Ot,jt,zt,Dt,Ut,It,Pt,Lt,qt,Bt],Un=gi,In=["../../translations/af.json","../../translations/bn.json","../../translations/ca.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/ta.json","../../translations/tr.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function Pn(n,e,t){let s=n.slice();return s[48]=e[t],s}function Ln(n){let e,t,s;function r(i){n[34](i)}let l={show_empty_filters:n[4],available_filters:n[16],translate:n[18],automatic_translations:n[17],translations:n[5]};return n[7]!==void 0&&(l.selected_filters=n[7]),e=new Dn({props:l}),re.push(()=>an(e,"selected_filters",r)),{c(){Ze(e.$$.fragment)},m(i,a){he(e,i,a),s=!0},p(i,a){let o={};a[0]&16&&(o.show_empty_filters=i[4]),a[0]&65536&&(o.available_filters=i[16]),a[0]&131072&&(o.automatic_translations=i[17]),a[0]&32&&(o.translations=i[5]),!t&&a[0]&128&&(t=!0,o.selected_filters=i[7],nn(()=>t=!1)),e.$set(o)},i(i){s||(z(e.$$.fragment,i),s=!0)},o(i){I(e.$$.fragment,i),s=!1},d(i){oe(e,i)}}}function qn(n){let e,t,s,r,l=[Ri,bi],i=[];function a(o,h){return o[12]?0:1}return t=a(n,[-1,-1]),s=i[t]=l[t](n),{c(){e=k("div"),s.c(),p(e,"class","pagefind-ui__results-area svelte-e9gkc3")},m(o,h){y(o,e,h),i[t].m(e,null),r=!0},p(o,h){let _=t;t=a(o,h),t===_?i[t].p(o,h):(ie(),I(i[_],1,1,()=>{i[_]=null}),ae(),s=i[t],s?s.p(o,h):(s=i[t]=l[t](o),s.c()),z(s,1),s.m(e,null))},i(o){r||(z(s),r=!0)},o(o){I(s),r=!1},d(o){o&&C(e),i[t].d()}}}function bi(n){let e,t,s,r=[],l=new Map,i,a,o;function h(m,d){return m[11].results.length===0?Ci:m[11].results.length===1?ki:Ti}let _=h(n,[-1,-1]),f=_(n),c=n[11].results.slice(0,n[15]),E=m=>m[48].id;for(let m=0;mn[15]&&Wn(n);return{c(){e=k("p"),f.c(),t=M(),s=k("ol");for(let m=0;mm[15]?u?u.p(m,d):(u=Wn(m),u.c(),u.m(a.parentNode,a)):u&&(u.d(1),u=null)},i(m){if(!o){for(let d=0;d{o[c]=null}),ae(),r=o[s],r?r.p(e,f):(r=o[s]=a[s](e),r.c()),z(r,1),r.m(l.parentNode,l))},i(_){i||(z(r),i=!0)},o(_){I(r),i=!1},d(_){_&&C(t),o[s].d(_),_&&C(l)}}}function Wn(n){let e,t=n[18]("load_more",n[17],n[5])+"",s,r,l;return{c(){e=k("button"),s=A(t),p(e,"type","button"),p(e,"class","pagefind-ui__button svelte-e9gkc3")},m(i,a){y(i,e,a),b(e,s),r||(l=K(e,"click",n[20]),r=!0)},p(i,a){a[0]&131104&&t!==(t=i[18]("load_more",i[17],i[5])+"")&&N(s,t)},d(i){i&&C(e),r=!1,l()}}}function Vn(n){let e,t=n[18]("searching",n[17],n[5]).replace(/\[SEARCH_TERM\]/,n[14])+"",s;return{c(){e=k("p"),s=A(t),p(e,"class","pagefind-ui__message svelte-e9gkc3")},m(r,l){y(r,e,l),b(e,s)},p(r,l){l[0]&147488&&t!==(t=r[18]("searching",r[17],r[5]).replace(/\[SEARCH_TERM\]/,r[14])+"")&&N(s,t)},d(r){r&&C(e)}}}function vi(n){let e,t,s,r,l,i,a=n[18]("clear_search",n[17],n[5])+"",o,h,_,f,c,E,u,m,d=n[10]&&Ln(n),R=n[13]&&qn(n);return{c(){e=k("div"),t=k("form"),s=k("input"),l=M(),i=k("button"),o=A(a),h=M(),_=k("div"),d&&d.c(),f=M(),R&&R.c(),p(s,"class","pagefind-ui__search-input svelte-e9gkc3"),p(s,"type","text"),p(s,"placeholder",r=n[18]("placeholder",n[17],n[5])),p(s,"autocapitalize","none"),p(s,"enterkeyhint","search"),p(i,"class","pagefind-ui__search-clear svelte-e9gkc3"),W(i,"pagefind-ui__suppressed",!n[6]),p(_,"class","pagefind-ui__drawer svelte-e9gkc3"),W(_,"pagefind-ui__hidden",!n[13]),p(t,"class","pagefind-ui__form svelte-e9gkc3"),p(t,"role","search"),p(t,"aria-label",c=n[18]("search_label",n[17],n[5])),p(t,"action","javascript:void(0);"),p(e,"class","pagefind-ui svelte-e9gkc3"),W(e,"pagefind-ui--reset",n[0])},m(T,S){y(T,e,S),b(e,t),b(t,s),it(s,n[6]),n[31](s),b(t,l),b(t,i),b(i,o),n[32](i),b(t,h),b(t,_),d&&d.m(_,null),b(_,f),R&&R.m(_,null),E=!0,u||(m=[K(s,"focus",n[19]),K(s,"keydown",n[29]),K(s,"input",n[30]),K(i,"click",n[33]),K(t,"submit",Mi)],u=!0)},p(T,S){(!E||S[0]&131104&&r!==(r=T[18]("placeholder",T[17],T[5])))&&p(s,"placeholder",r),S[0]&64&&s.value!==T[6]&&it(s,T[6]),(!E||S[0]&131104)&&a!==(a=T[18]("clear_search",T[17],T[5])+"")&&N(o,a),(!E||S[0]&64)&&W(i,"pagefind-ui__suppressed",!T[6]),T[10]?d?(d.p(T,S),S[0]&1024&&z(d,1)):(d=Ln(T),d.c(),z(d,1),d.m(_,f)):d&&(ie(),I(d,1,1,()=>{d=null}),ae()),T[13]?R?(R.p(T,S),S[0]&8192&&z(R,1)):(R=qn(T),R.c(),z(R,1),R.m(_,null)):R&&(ie(),I(R,1,1,()=>{R=null}),ae()),(!E||S[0]&8192)&&W(_,"pagefind-ui__hidden",!T[13]),(!E||S[0]&131104&&c!==(c=T[18]("search_label",T[17],T[5])))&&p(t,"aria-label",c),(!E||S[0]&1)&&W(e,"pagefind-ui--reset",T[0])},i(T){E||(z(d),z(R),E=!0)},o(T){I(d),I(R),E=!1},d(T){T&&C(e),n[31](null),n[32](null),d&&d.d(),R&&R.d(),u=!1,V(m)}}}var Mi=n=>n.preventDefault();function Ai(n,e,t){let s={},r=In.map(g=>g.match(/([^\/]+)\.json$/)[1]);for(let g=0;gO[g]??H[g]??"";at(()=>{let g=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Qe(g.toLocaleLowerCase());t(17,Yt=s[`${H.language}-${H.script}-${H.region}`]||s[`${H.language}-${H.region}`]||s[`${H.language}`]||s.en)}),ot(()=>{w?.destroy?.(),w=null});let Xt=async()=>{if(!U&&(t(10,U=!0),!w)){let g;try{g=await import(`${l}pagefind.js`)}catch(O){console.error(O),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` -`))}_||t(22,_=h?12:30);let H={...m||{},excerptLength:_};await g.options(H);for(let O of d){if(!O.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=O.bundlePath;delete O.bundlePath,await g.mergeIndex(L,O)}w=g,Jn()}},Jn=async()=>{w&&(Jt=await w.filters(),(!ue||!Object.keys(ue).length)&&t(16,ue=Jt))},Yn=g=>{let H={};return Object.entries(g).filter(([,O])=>O).forEach(([O])=>{let[L,ls]=O.split(/:(.*)$/);H[L]=H[L]||[],H[L].push(ls)}),H},ce,Xn=async(g,H)=>{if(!g){t(13,$e=!1),ce&&clearTimeout(ce);return}let O=Yn(H),L=()=>Zn(g,O);u>0&&g?(ce&&clearTimeout(ce),ce=setTimeout(L,u),await Zt(),w.preload(g,{filters:O})):L(),Qn()},Zt=async()=>{for(;!w;)Xt(),await new Promise(g=>setTimeout(g,50))},Zn=async(g,H)=>{t(14,Kt=g||""),typeof c=="function"&&(g=c(g)),t(12,Z=!0),t(13,$e=!0),await Zt();let O=++Gt,L=await w.search(g,{filters:H});Gt===O&&(L.filters&&Object.keys(L.filters)?.length&&t(16,ue=L.filters),t(11,P=L),t(12,Z=!1),t(15,et=i))},Qn=()=>{let g=X.offsetWidth;g!=F&&t(8,B.style.paddingRight=`${g+2}px`,B)},xn=g=>{g?.preventDefault(),t(15,et+=i)},$n=g=>{g.key==="Escape"&&(t(6,S=""),B.blur()),g.key==="Enter"&&g.preventDefault()};function es(){S=this.value,t(6,S),t(21,R)}function ts(g){re[g?"unshift":"push"](()=>{B=g,t(8,B)})}function ns(g){re[g?"unshift":"push"](()=>{X=g,t(9,X)})}let ss=()=>{t(6,S=""),B.blur()};function rs(g){Ge=g,t(7,Ge)}return n.$$set=g=>{"base_path"in g&&t(23,l=g.base_path),"page_size"in g&&t(24,i=g.page_size),"reset_styles"in g&&t(0,a=g.reset_styles),"show_images"in g&&t(1,o=g.show_images),"show_sub_results"in g&&t(2,h=g.show_sub_results),"excerpt_length"in g&&t(22,_=g.excerpt_length),"process_result"in g&&t(3,f=g.process_result),"process_term"in g&&t(25,c=g.process_term),"show_empty_filters"in g&&t(4,E=g.show_empty_filters),"debounce_timeout_ms"in g&&t(26,u=g.debounce_timeout_ms),"pagefind_options"in g&&t(27,m=g.pagefind_options),"merge_index"in g&&t(28,d=g.merge_index),"trigger_search_term"in g&&t(21,R=g.trigger_search_term),"translations"in g&&t(5,T=g.translations)},n.$$.update=()=>{if(n.$$.dirty[0]&2097152)e:R&&(t(6,S=R),t(21,R=""));if(n.$$.dirty[0]&192)e:Xn(S,Ge)},[a,o,h,f,E,T,S,Ge,B,X,U,P,Z,$e,Kt,et,ue,Yt,Kn,Xt,xn,R,_,l,i,c,u,m,d,$n,es,ts,ns,ss,rs]}var Wt=class extends q{constructor(e){super(),J(this,e,Ai,vi,G,{base_path:23,page_size:24,reset_styles:0,show_images:1,show_sub_results:2,excerpt_length:22,process_result:3,process_term:25,show_empty_filters:4,debounce_timeout_ms:26,pagefind_options:27,merge_index:28,trigger_search_term:21,translations:5},null,[-1,-1])}},Gn=Wt;var Vt;try{Vt=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1]}catch{Vt="/pagefind/"}var xe=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",s=e.bundlePath??Vt,r=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,h=e.processResult??null,_=e.processTerm??null,f=e.showEmptyFilters??!0,c=e.debounceTimeoutMs??300,E=e.mergeIndex??[],u=e.translations??[];delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations;let m=t instanceof HTMLElement?t:document.querySelector(t);m?this._pfs=new Gn({target:m,props:{base_path:s,page_size:r,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:h,process_term:_,show_empty_filters:f,debounce_timeout_ms:c,merge_index:E,translations:u,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}destroy(){this._pfs.$destroy()}};window.PagefindUI=xe;})(); diff --git a/docs/go/_/pagefind/pagefind.js b/docs/go/_/pagefind/pagefind.js deleted file mode 100644 index 94ab9237..00000000 --- a/docs/go/_/pagefind/pagefind.js +++ /dev/null @@ -1,9 +0,0 @@ -const pagefind_version="1.0.4";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document==='undefined'){script_src=location.href}else{script_src=new URL("UNHANDLED",location.href).toString()}let wasm;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}let WASM_VECTOR_LEN=0;function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1);getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret};const cachedTextEncoder=new TextEncoder('utf-8');const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length);getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len);const mem=getUint8Memory0();let offset=0;for(;offset0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3);const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written}WASM_VECTOR_LEN=offset;return ptr}__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=new TextDecoder('utf-8',{ignoreBOM:true,fatal:true});cachedTextDecoder.decode();function getStringFromWasm0(ptr,len){return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_indexes=function(ptr,query){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_filter_indexes=function(ptr,filters){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_all_filter_indexes=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.filters=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.search=function(ptr,query,filter,sort,exact){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ptr1=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len1=WASM_VECTOR_LEN;const ptr2=passStringToWasm0(sort,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len2=WASM_VECTOR_LEN;wasm.search(retptr,ptr,ptr0,len0,ptr1,len1,ptr2,len2,exact);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};async function load(module,imports){if(typeof Response==='function'&&module instanceof Response){if(typeof WebAssembly.instantiateStreaming==='function'){try{return await WebAssembly.instantiateStreaming(module,imports)}catch(e){if(module.headers.get('Content-Type')!='application/wasm'){console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}else{throw e}}}const bytes=await module.arrayBuffer();return await WebAssembly.instantiate(bytes,imports)}else{const instance=await WebAssembly.instantiate(module,imports);if(instance instanceof WebAssembly.Instance){return{instance,module}}else{return instance}}}function getImports(){const imports={};imports.wbg={};return imports}function initMemory(imports,maybe_memory){}function finalizeInit(instance,module){wasm=instance.exports;init.__wbindgen_wasm_module=module;cachedInt32Memory0=null;cachedUint8Memory0=null;return wasm}function initSync(module){const imports=getImports();initMemory(imports);if(!(module instanceof WebAssembly.Module)){module=new WebAssembly.Module(module)}const instance=new WebAssembly.Instance(module,imports);return finalizeInit(instance,module)}async function init(input){if(typeof input==='undefined'){input=script_src.replace(/\.js$/,'_bg.wasm')}const imports=getImports();if(typeof input==='string'||(typeof Request==='function'&&input instanceof Request)||(typeof URL==='function'&&input instanceof URL)){input=fetch(input)}initMemory(imports);const{instance,module}=await load(await input,imports);return finalizeInit(instance,module)}wasm_bindgen=Object.assign(init,{initSync},__exports)})();var u8=Uint8Array;var u16=Uint16Array;var u32=Uint32Array;var fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]);var fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);var clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var freb=function(eb,start){var b=new u16(31);for(var i2=0;i2<31;++i2){b[i2]=start+=1<>>1|(i&21845)<<1;x=(x&52428)>>>2|(x&13107)<<2;x=(x&61680)>>>4|(x&3855)<<4;rev[i]=((x&65280)>>>8|(x&255)<<8)>>>1}var x;var i;var hMap=function(cd,mb,r){var s=cd.length;var i2=0;var l=new u16(mb);for(;i2>>rvb]=sv}}}}else{co=new u16(s);for(i2=0;i2>>15-cd[i2]}}}return co};var flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;var i;for(i=144;i<256;++i)flt[i]=9;var i;for(i=256;i<280;++i)flt[i]=7;var i;for(i=280;i<288;++i)flt[i]=8;var i;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var i;var flrm=hMap(flt,9,1);var fdrm=hMap(fdt,5,1);var max=function(a){var m=a[0];for(var i2=1;i2m)m=a[i2]}return m};var bits=function(d,p,m){var o=p/8|0;return(d[o]|d[o+1]<<8)>>(p&7)&m};var bits16=function(d,p){var o=p/8|0;return(d[o]|d[o+1]<<8|d[o+2]<<16)>>(p&7)};var shft=function(p){return(p+7)/8|0};var slc=function(v,s,e){if(s==null||s<0)s=0;if(e==null||e>v.length)e=v.length;var n=new(v.BYTES_PER_ELEMENT==2?u16:v.BYTES_PER_ELEMENT==4?u32:u8)(e-s);n.set(v.subarray(s,e));return n};var ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"];var err=function(ind,msg,nt){var e=new Error(msg||ec[ind]);e.code=ind;if(Error.captureStackTrace)Error.captureStackTrace(e,err);if(!nt)throw e;return e};var inflt=function(dat,buf,st){var sl=dat.length;if(!sl||st&&st.f&&!st.l)return buf||new u8(0);var noBuf=!buf||st;var noSt=!st||st.i;if(!st)st={};if(!buf)buf=new u8(sl*3);var cbuf=function(l2){var bl=buf.length;if(l2>bl){var nbuf=new u8(Math.max(bl*2,l2));nbuf.set(buf);buf=nbuf}};var final=st.f||0,pos=st.p||0,bt=st.b||0,lm=st.l,dm=st.d,lbt=st.m,dbt=st.n;var tbts=sl*8;do{if(!lm){final=bits(dat,pos,1);var type=bits(dat,pos+1,3);pos+=3;if(!type){var s=shft(pos)+4,l=dat[s-4]|dat[s-3]<<8,t=s+l;if(t>sl){if(noSt)err(0);break}if(noBuf)cbuf(bt+l);buf.set(dat.subarray(s,t),bt);st.b=bt+=l,st.p=pos=t*8,st.f=final;continue}else if(type==1)lm=flrm,dm=fdrm,lbt=9,dbt=5;else if(type==2){var hLit=bits(dat,pos,31)+257,hcLen=bits(dat,pos+10,15)+4;var tl=hLit+bits(dat,pos+5,31)+1;pos+=14;var ldt=new u8(tl);var clt=new u8(19);for(var i2=0;i2>>4;if(s<16){ldt[i2++]=s}else{var c=0,n=0;if(s==16)n=3+bits(dat,pos,3),pos+=2,c=ldt[i2-1];else if(s==17)n=3+bits(dat,pos,7),pos+=3;else if(s==18)n=11+bits(dat,pos,127),pos+=7;while(n--)ldt[i2++]=c}}var lt=ldt.subarray(0,hLit),dt=ldt.subarray(hLit);lbt=max(lt);dbt=max(dt);lm=hMap(lt,lbt,1);dm=hMap(dt,dbt,1)}else err(1);if(pos>tbts){if(noSt)err(0);break}}if(noBuf)cbuf(bt+131072);var lms=(1<>>4;pos+=c&15;if(pos>tbts){if(noSt)err(0);break}if(!c)err(2);if(sym<256)buf[bt++]=sym;else if(sym==256){lpos=pos,lm=null;break}else{var add=sym-254;if(sym>264){var i2=sym-257,b=fleb[i2];add=bits(dat,pos,(1<>>4;if(!d)err(3);pos+=d&15;var dt=fd[dsym];if(dsym>3){var b=fdeb[dsym];dt+=bits16(dat,pos)&(1<tbts){if(noSt)err(0);break}if(noBuf)cbuf(bt+131072);var end=bt+add;for(;bt>3&1)+(flg>>4&1);zs>0;zs-=!d[st++]);return st+(flg&2)};var gzl=function(d){var l=d.length;return(d[l-4]|d[l-3]<<8|d[l-2]<<16|d[l-1]<<24)>>>0};function gunzipSync(data,out){return inflt(data.subarray(gzs(data),-8),out||new u8(gzl(data)))}var td=typeof TextDecoder!="undefined"&&new TextDecoder();var tds=0;try{td.decode(et,{stream:true});tds=1}catch(e){}var gz_default=gunzipSync;var calculate_excerpt_region=(word_positions,excerpt_length)=>{if(word_positions.length===0){return 0}let words=[];for(const word of word_positions){words[word.location]=words[word.location]||0;words[word.location]+=word.balanced_score}if(words.length<=excerpt_length){return 0}let densest=words.slice(0,excerpt_length).reduce((partialSum,a)=>partialSum+a,0);let working_sum=densest;let densest_at=[0];for(let i2=0;i2densest){densest=working_sum;densest_at=[i2]}else if(working_sum===densest&&densest_at[densest_at.length-1]===i2-1){densest_at.push(i2)}}let midpoint=densest_at[Math.floor(densest_at.length/2)];return midpoint};var build_excerpt=(content,start,length,locations,not_before,not_from)=>{let is_zws_delimited=content.includes("\u200B");let fragment_words=[];if(is_zws_delimited){fragment_words=content.split("\u200B")}else{fragment_words=content.split(/[\r\n\s]+/g)}for(let word of locations){if(fragment_words[word]?.startsWith(``)){continue}fragment_words[word]=`${fragment_words[word]}`}let endcap=not_from??fragment_words.length;let startcap=not_before??0;if(endcap-startcapendcap){start=endcap-length}if(start{const anchors=fragment.anchors.filter((a)=>/h\d/i.test(a.element)&&a.text?.length&&/\S/.test(a.text)).sort((a,b)=>a.location-b.location);const results=[];let current_anchor_position=0;let current_anchor={title:fragment.meta["title"],url:fragment.url,weighted_locations:[],locations:[],excerpt:""};const add_result=(end_range)=>{if(current_anchor.locations.length){const relative_weighted_locations=current_anchor.weighted_locations.map((l)=>{return{weight:l.weight,balanced_score:l.balanced_score,location:l.location-current_anchor_position}});const excerpt_start=calculate_excerpt_region(relative_weighted_locations,desired_excerpt_length)+current_anchor_position;const excerpt_length=end_range?Math.min(end_range-excerpt_start,desired_excerpt_length):desired_excerpt_length;current_anchor.excerpt=build_excerpt(fragment.raw_content??"",excerpt_start,excerpt_length,current_anchor.locations,current_anchor_position,end_range);results.push(current_anchor)}};for(let word of fragment.weighted_locations){if(!anchors.length||word.location=anchors[0].location){next_anchor=anchors.shift()}let anchored_url=fragment.url;try{const url_is_fq=/^((https?:)?\/\/)/.test(anchored_url);if(url_is_fq){let fq_url=new URL(anchored_url);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString()}else{if(!/^\//.test(anchored_url)){anchored_url=`/${anchored_url}`}let fq_url=new URL(`https://example.com${anchored_url}`);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString().replace(/^https:\/\/example.com/,"")}}catch(e){console.error(`Pagefind: Couldn't process ${anchored_url} for a search result`)}current_anchor_position=next_anchor.location;current_anchor={title:next_anchor.text,url:anchored_url,anchor:next_anchor,weighted_locations:[word],locations:[word.location],excerpt:""}}}add_result(anchors[0]?.location);return results};var asyncSleep=async(ms=100)=>{return new Promise((r)=>setTimeout(r,ms))};var PagefindInstance=class{constructor(opts={}){this.version=pagefind_version;this.backend=wasm_bindgen;this.decoder=new TextDecoder("utf-8");this.wasm=null;this.basePath=opts.basePath||"/pagefind/";this.primary=opts.primary||false;if(this.primary&&!opts.basePath){this.initPrimary()}if(/[^\/]$/.test(this.basePath)){this.basePath=`${this.basePath}/`}if(window?.location?.origin&&this.basePath.startsWith(window.location.origin)){this.basePath=this.basePath.replace(window.location.origin,"")}this.baseUrl=opts.baseUrl||this.defaultBaseUrl();if(!/^(\/|https?:\/\/)/.test(this.baseUrl)){this.baseUrl=`/${this.baseUrl}`}this.indexWeight=opts.indexWeight??1;this.excerptLength=opts.excerptLength??30;this.mergeFilter=opts.mergeFilter??{};this.highlightParam=opts.highlightParam??null;this.loaded_chunks={};this.loaded_filters={};this.loaded_fragments={};this.raw_ptr=null;this.searchMeta=null;this.languages=null}initPrimary(){let derivedBasePath=import.meta.url.match(/^(.*\/)pagefind.js.*$/)?.[1];if(derivedBasePath){this.basePath=derivedBasePath}else{console.warn(["Pagefind couldn't determine the base of the bundle from the import path. Falling back to the default.","Set a basePath option when initialising Pagefind to ignore this message."].join("\n"))}}defaultBaseUrl(){let default_base=this.basePath.match(/^(.*\/)_?pagefind/)?.[1];return default_base||"/"}async options(options2){const opts=["basePath","baseUrl","indexWeight","excerptLength","mergeFilter","highlightParam"];for(const[k,v]of Object.entries(options2)){if(k==="mergeFilter"){let filters2=this.stringifyFilters(v);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}else if(opts.includes(k)){if(k==="basePath"&&typeof v==="string")this.basePath=v;if(k==="baseUrl"&&typeof v==="string")this.baseUrl=v;if(k==="indexWeight"&&typeof v==="number")this.indexWeight=v;if(k==="excerptLength"&&typeof v==="number")this.excerptLength=v;if(k==="mergeFilter"&&typeof v==="object")this.mergeFilter=v;if(k==="highlightParam"&&typeof v==="string")this.highlightParam=v}else{console.warn(`Unknown Pagefind option ${k}. Allowed options: [${opts.join(", ")}]`)}}}decompress(data,file="unknown file"){if(this.decoder.decode(data.slice(0,12))==="pagefind_dcd"){return data.slice(12)}data=gz_default(data);if(this.decoder.decode(data.slice(0,12))!=="pagefind_dcd"){console.error(`Decompressing ${file} appears to have failed: Missing signature`);return data}return data.slice(12)}async init(language,opts){await this.loadEntry();let index=this.findIndex(language);let lang_wasm=index.wasm?index.wasm:"unknown";let resources=[this.loadMeta(index.hash)];if(opts.load_wasm===true){resources.push(this.loadWasm(lang_wasm))}await Promise.all(resources);this.raw_ptr=this.backend.init_pagefind(new Uint8Array(this.searchMeta));if(Object.keys(this.mergeFilter)?.length){let filters2=this.stringifyFilters(this.mergeFilter);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}}async loadEntry(){try{let entry_response=await fetch(`${this.basePath}pagefind-entry.json?ts=${Date.now()}`);let entry_json=await entry_response.json();this.languages=entry_json.languages;if(entry_json.version!==this.version){if(this.primary){console.warn(["Pagefind JS version doesn't match the version in your search index.",`Pagefind JS: ${this.version}. Pagefind index: ${entry_json.version}`,"If you upgraded Pagefind recently, you likely have a cached pagefind.js file.","If you encounter any search errors, try clearing your cache."].join("\n"))}else{console.warn(["Merging a Pagefind index from a different version than the main Pagefind instance.",`Main Pagefind JS: ${this.version}. Merged index (${this.basePath}): ${entry_json.version}`,"If you encounter any search errors, make sure that both sites are running the same version of Pagefind."].join("\n"))}}}catch(e){console.error(`Failed to load Pagefind metadata: -${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index: -${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM: -${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM: -${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}: -${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(//g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}parseFilters(str){let output={};if(!str)return output;for(const block of str.split("__PF_FILTER_DELIM__")){let[filter,values]=block.split(/:(.*)$/);output[filter]={};if(values){for(const valueBlock of values.split("__PF_VALUE_DELIM__")){if(valueBlock){let extract=valueBlock.match(/^(.*):(\d+)$/);if(extract){let[,value,count]=extract;output[filter][value]=parseInt(count)??count}}}}}return output}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_chunks=filters2.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks]);ptr=await this.getPtr();let results=this.backend.filters(ptr);return this.parseFilters(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}term=term.toLowerCase().trim().replace(/[\.`~!@#\$%\^&\*\(\)\{\}\[\]\\\|:;'",<>\/\?\-]/g,"").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let chunks=index_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...chunks,...filter_chunks]);log(`Loaded necessary chunks to run search`);if(options2.preload){log(`Preload \u2014 bailing out of search operation now.`);return null}ptr=await this.getPtr();let searchStart=Date.now();let result=this.backend.search(ptr,term,filter_list,sort_list,exact_search);log(`Got the raw search result: ${result}`);let[unfilteredResultCount,all_results,filters2,totalFilters]=result.split(/:([^:]*):(.*)__PF_UNFILTERED_DELIM__(.*)$/);let filterObj=this.parseFilters(filters2);let totalFilterObj=this.parseFilters(totalFilters);log(`Remaining filters: ${JSON.stringify(result)}`);let results=all_results.length?all_results.split(" "):[];let resultsInterface=results.map((result2)=>{let[hash,score,all_locations]=result2.split("@");log(`Processing result: - hash:${hash} - score:${score} - locations:${all_locations}`);let weighted_locations=all_locations.length?all_locations.split(",").map((l)=>{let[weight,balanced_score,location]=l.split(">");return{weight:parseInt(weight)/24,balanced_score:parseFloat(balanced_score),location:parseInt(location)}}):[];let locations=weighted_locations.map((l)=>l.location);return{id:hash,score:parseFloat(score)*this.indexWeight,words:locations,data:async()=>await this.loadFragment(hash,weighted_locations,term)}});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);return{results:resultsInterface,unfilteredResultCount:parseInt(unfilteredResultCount),filters:filterObj,totalFilters:totalFilterObj,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}}}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async init(overrideLanguage){if(document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);return{results,unfilteredResultCount,filters:filters2,totalFilters,timings}}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search} \ No newline at end of file diff --git a/docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta b/docs/go/_/pagefind/pagefind.unknown_4bda9216e98df89.pf_meta deleted file mode 100644 index f927785aa80766b3c8855a38c0608923a74540fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 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 - - - - - - - - - - -elastic - - - -

    package elastic

    -
    import "backend/app/internal/elastic"
    -

    Index

    -

    Functions

    -

    func Connect

    -
    func Connect(config structs.ElasticConfig) *elasticsearch.Client
    -

    Connect - used to connect to the elasticsearch database. It will return an elasticsearch client that can be used to -perform queries on the database. -

    func DeleteDocument

    -
    func DeleteDocument(client *elasticsearch.Client, id string, index string)
    -

    DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to -be passed to the function. -

    func ParseEmbedding

    -
    func ParseEmbedding(document *structs.SyncDocument, embeddings *structs.EmbeddingResponse) *structs.EsDocument
    -

    ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the -Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the -function. -

    func SearchDocument

    -
    func SearchDocument(client *elasticsearch.Client, query string, index string) *structs.EsDocument
    -

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need -to be passed to the function. -

    func SendDocument

    -
    func SendDocument(client *elasticsearch.Client, document *structs.EsDocument, index string)
    -

    SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need -to be passed to the function. -

    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/embedding/index.html b/docs/go/embedding/index.html deleted file mode 100644 index 1d02b8a9..00000000 --- a/docs/go/embedding/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - -embedding - - - -

    package embedding

    -
    import "backend/app/internal/embedding"
    -

    Index

    -

    Functions

    -

    func ExtractTags

    -
    func ExtractTags(fragments []string) []string
    -

    ExtractTags - extract the NL tags from a fragment (JSON document documenting a REST API), and return an array of -strings, one for each fragment. An array of fragments needs to be passed to the function. -

    func PreprocessFragment

    -
    func PreprocessFragment(fragments []string, isQuery bool) []string
    -

    PreprocessFragment - fragments are preprocessed by running a standard NLP pipeline, composed of string cleaning, -stop-word removal, and stemming. An array of fragments (string), and a boolean indicating is the fragments are -queries or not need to be passed to the function. -

    func Stemming

    -
    func Stemming(fragments []string) []string
    -

    Stemming - stem all the words contained in the given strings. An array of strings needs to be passed to the -function. -

    func StopWordRemoval

    -
    func StopWordRemoval(fragments []string) []string
    -

    StopWordRemoval - remove all stopwords from the given strings. An array of strings needs to be passed to the -function. -

    Types

    -

    type Embeddings

    -
    type Embeddings = structs.EmbeddingResponse
    -

    func Embed

    -
    func Embed(fragments []string) *Embeddings
    -

    Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of -embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. -

    func PerformPipeline

    -
    func PerformPipeline(fragments []string, isQuery bool) *Embeddings
    -

    PerformPipeline - fragments are preprocessed and embeddings are generated and returned. An array of fragments -(string) and a boolean indicating if the fragments are queries or not need to be passed to the function. -

    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/helpers/index.html b/docs/go/helpers/index.html deleted file mode 100644 index c545dc14..00000000 --- a/docs/go/helpers/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - -helpers - - - -

    package helpers

    -
    import "backend/app/internal/helpers"
    -

    Index

    -

    Functions

    -

    func GetCertificate

    -
    func GetCertificate() []byte
    -

    GetCertificate - retrieve the elasticsearch cluster certificate. -

    Types

    -

    type Config

    -
    type Config = structs.Config
    -

    func LoadConfigs

    -
    func LoadConfigs() Config
    -

    LoadConfigs - parse and store in a struct all the config values needed by the backend. -

    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/index.html b/docs/go/index.html deleted file mode 100644 index 4b39340d..00000000 --- a/docs/go/index.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - -backend/app/internal - - - -

    Directories

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    elastic
    embedding
    helpers
    mongodb
    routes
    structs
    -
    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/mongodb/index.html b/docs/go/mongodb/index.html deleted file mode 100644 index 75ec306e..00000000 --- a/docs/go/mongodb/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - -mongodb - - - -

    package mongodb

    -
    import "backend/app/internal/mongodb"
    -

    Index

    -

    Functions

    -

    func Connect

    -
    func Connect(config structs.MongoConfig) *mongo.Client
    -

    Connect - used to connect to the mongodb database. It will return a mongodb client that can be used to perform -queries on the database. -

    func DeleteDocuments

    -
    func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    -

    DeleteDocuments - every time a documents is deleted from the database, it will be searched in the elasticsearch -index (based on the mongodb ObjectId) and deleted from the elasticsearch database. -

    func InsertDocuments

    -
    func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    -

    InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and -saved in the respective elasticsearch index. -

    func SearchDocument

    -
    func SearchDocument(database *mongo.Database, query bson.M, collection string) string
    -

    SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection -need to be passed to the function. -

    func WatchDatabase

    -
    func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string)
    -

    WatchDatabase - watch for a certain type of events in the mongodb `apis` database. The supported events are -document insertion and document deletion. -

    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/routes/index.html b/docs/go/routes/index.html deleted file mode 100644 index 1389b53f..00000000 --- a/docs/go/routes/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - -routes - - - -

    package routes

    -
    import "backend/app/internal/routes"
    -

    Index

    -

    Functions

    -

    func InitRetrieverRoutes

    -
    func InitRetrieverRoutes(router *gin.Engine)
    -

    func InitRoutes

    -
    func InitRoutes(router *gin.Engine)
    - -
    func Search(c *gin.Context)
    -

    Types

    -

    type EmbeddingRequest

    -
    type EmbeddingRequest = structs.EmbeddingRequest
    -
    -
    -
    - - Generated with doc2go - -
    - - diff --git a/docs/go/structs/index.html b/docs/go/structs/index.html deleted file mode 100644 index 541a28b0..00000000 --- a/docs/go/structs/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - -structs - - - -

    package structs

    -
    import "backend/app/internal/structs"
    -

    Index

    -

    Types

    -

    type BackendConfig

    -
    type BackendConfig struct {
    -	Port int `yaml:"port"`
    -}
    -

    BackendConfig - all backend-related configurations. -

    type Config

    -
    type Config struct {
    -	Backend BackendConfig `yaml:"backend"`
    -	Mongo   MongoConfig   `yaml:"mongodb"`
    -	Elastic ElasticConfig `yaml:"elastic"`
    -}
    -

    Config - used to store all configurations needed by the backend. -

    type ElasticConfig

    -
    type ElasticConfig struct {
    -	Protocol string `yaml:"protocol"`
    -	Host     string `yaml:"host"`
    -	Port     int    `yaml:"port"`
    -	User     string `yaml:"user"`
    -	Password string `yaml:"password"`
    -}
    -

    ElasticConfig - all elasticsearch-related configurations. -

    type EmbeddingRequest

    -
    type EmbeddingRequest struct {
    -	Fragment string `json:"fragment"`
    -}
    -

    EmbeddingRequest - structure of the request to be sent to the embedding server. -

    type EmbeddingResponse

    -
    type EmbeddingResponse struct {
    -	Predictions [][]float32
    -}
    -

    EmbeddingResponse - structure of the response sent back by the embedding server. -

    type EsDocument

    -
    type EsDocument struct {
    -	MongoId    primitive.ObjectID `json:"mongo_id"`
    -	Collection string             `json:"mongo_collection"`
    -	Embedding  []float32          `json:"embedding"`
    -}
    -

    EsDocument - structure of an elasticsearch document returned by the elasticsearch client. -

    type MongoConfig

    -
    type MongoConfig struct {
    -	Protocol string `yaml:"protocol"`
    -	Host     string `yaml:"host"`
    -	Port     int    `yaml:"port"`
    -	User     string `yaml:"user"`
    -	Password string `yaml:"password"`
    -}
    -

    MongoConfig - all mongodb-related configurations. -

    type SyncDocument

    -
    type SyncDocument struct {
    -	Id         string `bson:"_id"`
    -	Collection string `bson:"coll"`
    -	Api        string
    -}
    -

    SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. -

    -
    -
    - - Generated with doc2go - -
    - - diff --git a/go.mod b/go.mod index ae4465ff..612b6400 100644 --- a/go.mod +++ b/go.mod @@ -9,12 +9,17 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/goccy/go-json v0.10.2 github.com/kelseyhightower/envconfig v1.4.0 + github.com/santosh/gingo v0.0.0-20221207111602-0ef9ded9b180 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 github.com/writeas/go-strip-markdown v2.0.1+incompatible go.mongodb.org/mongo-driver v1.14.0 gopkg.in/yaml.v2 v2.4.0 ) require ( + github.com/KyleBanks/depth v1.2.1 // indirect github.com/bytedance/sonic v1.11.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect @@ -23,15 +28,24 @@ require ( github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.14 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.7.1 // indirect @@ -45,12 +59,18 @@ require ( go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.22.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.19.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/sqlite v1.3.6 // indirect + gorm.io/gorm v1.23.8 // indirect ) diff --git a/go.sum b/go.sum index 33b1bf84..d2b17f42 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/bbalet/stopwords v1.0.0 h1:0TnGycCtY0zZi4ltKoOGRFIlZHv0WqpoIGUsObjztfo= github.com/bbalet/stopwords v1.0.0/go.mod h1:sAWrQoDMfqARGIn4s6dp7OW7ISrshUD8IP2q3KoqPjc= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -12,6 +14,7 @@ github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLI github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/stemmer v0.0.0-20161207102402-66719a20c4b5 h1:Y8zPZQaUm5jRBMBbvSoPbQa8HCCORmJ6tkkyvvgNucM= github.com/dchest/stemmer v0.0.0-20161207102402-66719a20c4b5/go.mod h1:19PoDJeUsXOb2qtHJB7Az1NI0hlRe5wQM77Vo7rbUY8= @@ -21,6 +24,8 @@ github.com/elastic/go-elasticsearch/v8 v8.12.1 h1:QcuFK5LaZS0pSIj/eAEsxmJWmMo7tU github.com/elastic/go-elasticsearch/v8 v8.12.1/go.mod h1:wSzJYrrKPZQ8qPuqAqc6KMR4HrBfHnZORvyL+FMFqq0= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= @@ -30,6 +35,16 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -38,39 +53,56 @@ github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +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/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/santosh/gingo v0.0.0-20221207111602-0ef9ded9b180 h1:houhKtoTI0PBSiaSVCkIyavSo4sxf3FHo3HzQZAhJuc= +github.com/santosh/gingo v0.0.0-20221207111602-0ef9ded9b180/go.mod h1:vcljLtYRV+geYpIbqcw+yxDF8WgUNBg8queTd6Bm5mo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -80,6 +112,14 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= @@ -92,11 +132,8 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= -github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= @@ -104,16 +141,23 @@ go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -123,14 +167,11 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -141,16 +182,16 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -159,15 +200,21 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/sqlite v1.3.6 h1:Fi8xNYCUplOqWiPa3/GuCeowRNBRGTf62DEmhMDHeQQ= +gorm.io/driver/sqlite v1.3.6/go.mod h1:Sg1/pvnKtbQ7jLXxfZa+jSHvoX8hoZA8cn4xllOMTgE= +gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/scripts/hooks/generate-swagger-docs.sh b/scripts/hooks/generate-swagger-docs.sh new file mode 100755 index 00000000..3834ceae --- /dev/null +++ b/scripts/hooks/generate-swagger-docs.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cd ./app || exit +swag init \ No newline at end of file From 9269fb7bacf7ceada46efc4ecaca7226fcd8a976 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 02:37:56 +0100 Subject: [PATCH 07/60] added swaggerhub documentation --- app/docs/docs.go | 72 ++ app/docs/swagger.json | 47 + app/docs/swagger.yaml | 31 + docs/_/css/main.css | 161 +++ docs/_/icons/apple-touch-icon.png | Bin 0 -> 20698 bytes docs/_/icons/favicon-16x16.png | Bin 0 -> 1302 bytes docs/_/icons/favicon-32x32.png | Bin 0 -> 2441 bytes docs/_/icons/favicon.ico | Bin 0 -> 15086 bytes docs/_/js/permalink.js | 44 + .../pagefind/filter/unknown_9115dcc.pf_filter | Bin 0 -> 65 bytes .../fragment/unknown_184582f.pf_fragment | Bin 0 -> 1025 bytes .../fragment/unknown_33b6ab7.pf_fragment | Bin 0 -> 812 bytes .../fragment/unknown_5627a9c.pf_fragment | Bin 0 -> 483 bytes .../fragment/unknown_8927352.pf_fragment | Bin 0 -> 684 bytes .../fragment/unknown_9764785.pf_fragment | Bin 0 -> 391 bytes .../fragment/unknown_d42fa13.pf_fragment | Bin 0 -> 734 bytes .../_/pagefind/index/unknown_d18b557.pf_index | Bin 0 -> 4171 bytes docs/_/pagefind/pagefind-entry.json | 1 + docs/_/pagefind/pagefind-highlight.js | 1069 +++++++++++++++++ docs/_/pagefind/pagefind-modular-ui.css | 214 ++++ docs/_/pagefind/pagefind-modular-ui.js | 8 + docs/_/pagefind/pagefind-ui.css | 1 + docs/_/pagefind/pagefind-ui.js | 2 + docs/_/pagefind/pagefind.js | 9 + .../pagefind.unknown_9d42de2383af4a6.pf_meta | Bin 0 -> 153 bytes docs/_/pagefind/wasm.unknown.pagefind | Bin 0 -> 55176 bytes docs/controller/index.html | 69 ++ docs/elastic/index.html | 72 ++ docs/embedding/index.html | 85 ++ docs/helpers/index.html | 62 + docs/index.html | 69 ++ docs/models/index.html | 124 ++ docs/mongodb/index.html | 71 ++ 33 files changed, 2211 insertions(+) create mode 100644 app/docs/docs.go create mode 100644 app/docs/swagger.json create mode 100644 app/docs/swagger.yaml create mode 100644 docs/_/css/main.css create mode 100644 docs/_/icons/apple-touch-icon.png create mode 100644 docs/_/icons/favicon-16x16.png create mode 100644 docs/_/icons/favicon-32x32.png create mode 100644 docs/_/icons/favicon.ico create mode 100644 docs/_/js/permalink.js create mode 100644 docs/_/pagefind/filter/unknown_9115dcc.pf_filter create mode 100644 docs/_/pagefind/fragment/unknown_184582f.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_33b6ab7.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_5627a9c.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_8927352.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_9764785.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_d42fa13.pf_fragment create mode 100644 docs/_/pagefind/index/unknown_d18b557.pf_index create mode 100644 docs/_/pagefind/pagefind-entry.json create mode 100644 docs/_/pagefind/pagefind-highlight.js create mode 100644 docs/_/pagefind/pagefind-modular-ui.css create mode 100644 docs/_/pagefind/pagefind-modular-ui.js create mode 100644 docs/_/pagefind/pagefind-ui.css create mode 100644 docs/_/pagefind/pagefind-ui.js create mode 100644 docs/_/pagefind/pagefind.js create mode 100644 docs/_/pagefind/pagefind.unknown_9d42de2383af4a6.pf_meta create mode 100644 docs/_/pagefind/wasm.unknown.pagefind create mode 100644 docs/controller/index.html create mode 100644 docs/elastic/index.html create mode 100644 docs/embedding/index.html create mode 100644 docs/helpers/index.html create mode 100644 docs/index.html create mode 100644 docs/models/index.html create mode 100644 docs/mongodb/index.html diff --git a/app/docs/docs.go b/app/docs/docs.go new file mode 100644 index 00000000..6a275708 --- /dev/null +++ b/app/docs/docs.go @@ -0,0 +1,72 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/search": { + "post": { + "description": "retrieve OpenAPI specifications matching the given query", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search OpenAPI specifications", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "", + BasePath: "/api/v1", + Schemes: []string{}, + Title: "API Scout", + Description: "This is the backend for the API Scout platform.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/app/docs/swagger.json b/app/docs/swagger.json new file mode 100644 index 00000000..e3d30008 --- /dev/null +++ b/app/docs/swagger.json @@ -0,0 +1,47 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is the backend for the API Scout platform.", + "title": "API Scout", + "contact": {}, + "version": "1.0" + }, + "basePath": "/api/v1", + "paths": { + "/search": { + "post": { + "description": "retrieve OpenAPI specifications matching the given query", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "summary": "Search OpenAPI specifications", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/app/docs/swagger.yaml b/app/docs/swagger.yaml new file mode 100644 index 00000000..ce819442 --- /dev/null +++ b/app/docs/swagger.yaml @@ -0,0 +1,31 @@ +basePath: /api/v1 +info: + contact: {} + description: This is the backend for the API Scout platform. + title: API Scout + version: "1.0" +paths: + /search: + post: + consumes: + - application/json + description: retrieve OpenAPI specifications matching the given query + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "400": + description: Bad Request + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + summary: Search OpenAPI specifications + tags: + - search +swagger: "2.0" diff --git a/docs/_/css/main.css b/docs/_/css/main.css new file mode 100644 index 00000000..aad59947 --- /dev/null +++ b/docs/_/css/main.css @@ -0,0 +1,161 @@ +body { + margin: 1em 2em; + font-family: Helvetica, sans-serif; + background-color: #f8f8f8; + font-size: 1em; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0.3em; + margin-bottom: 0.3em; +} +h1, h2, h3, h4 { font-weight: 500; } +h2 { font-size: 1.75em } +h3 { font-size: 1.5em } +h4 { font-size: 1.33em } +h5 { font-size: 1em } + +a { + text-decoration: none; + color: #0366a5; +} +a:hover { + text-decoration: underline; +} + +a.permalink { display: none; } +a.permalink:hover { + text-decoration: none; +} +*:hover > a.permalink { display: inline; } + +nav { + padding: 1em; + background-color: #eee; + border-radius: 0.5em; + display: flex; + flex-wrap: wrap; +} + +nav .navbar-right { + margin-left: auto; +} + +/* Remove first level of nesting for a package's index section. */ +#pkg-index + ul, #pkg-examples + ul { + list-style-type: none; + padding: 0; +} + +code, kbd, pre { + font-family: Consolas, monospace; +} + +pre { + color: #222; + overflow-x: auto; + border: 1px solid #ccc; + border-radius: 0.5em; + background-color: #eee; + padding: 0.75em; + font-size: 0.9em; +} + +details.example > summary { + color: #0366a5; + cursor: pointer; +} + +details.deprecated > summary { + list-style: none; +} + +span.deprecated-tag { + color: #eee; + background-color: #999; + padding: 0.125rem 0.3rem; + border-radius: 0.3rem; + font-size: 0.7rem; + vertical-align: middle; + cursor: pointer; +} + +#search { margin: 0.3em 0; } + +#generated-by-footer { font-size: x-small; } + +/* Background */ .bg { background-color: #ffffff; } +/* PreWrapper */ .chroma { background-color: #ffffff; } +/* Error */ .chroma .err { color: #a61717; background-color: #e3d2d2 } +/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #e5e5e5 } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #000000; font-weight: bold } +/* KeywordConstant */ .chroma .kc { color: #000000; font-weight: bold } +/* KeywordDeclaration */ .chroma .kd { color: #000000; font-weight: bold } +/* KeywordNamespace */ .chroma .kn { color: #000000; font-weight: bold } +/* KeywordPseudo */ .chroma .kp { color: #000000; font-weight: bold } +/* KeywordReserved */ .chroma .kr { color: #000000; font-weight: bold } +/* KeywordType */ .chroma .kt { color: #445588; font-weight: bold } +/* NameAttribute */ .chroma .na { color: #008080 } +/* NameBuiltin */ .chroma .nb { color: #0086b3 } +/* NameBuiltinPseudo */ .chroma .bp { color: #999999 } +/* NameClass */ .chroma .nc { color: #445588; font-weight: bold } +/* NameConstant */ .chroma .no { color: #008080 } +/* NameDecorator */ .chroma .nd { color: #3c5d5d; font-weight: bold } +/* NameEntity */ .chroma .ni { color: #800080 } +/* NameException */ .chroma .ne { color: #990000; font-weight: bold } +/* NameFunction */ .chroma .nf { color: #990000; font-weight: bold } +/* NameLabel */ .chroma .nl { color: #990000; font-weight: bold } +/* NameNamespace */ .chroma .nn { color: #555555 } +/* NameTag */ .chroma .nt { color: #000080 } +/* NameVariable */ .chroma .nv { color: #008080 } +/* NameVariableClass */ .chroma .vc { color: #008080 } +/* NameVariableGlobal */ .chroma .vg { color: #008080 } +/* NameVariableInstance */ .chroma .vi { color: #008080 } +/* LiteralString */ .chroma .s { color: #dd1144 } +/* LiteralStringAffix */ .chroma .sa { color: #dd1144 } +/* LiteralStringBacktick */ .chroma .sb { color: #dd1144 } +/* LiteralStringChar */ .chroma .sc { color: #dd1144 } +/* LiteralStringDelimiter */ .chroma .dl { color: #dd1144 } +/* LiteralStringDoc */ .chroma .sd { color: #dd1144 } +/* LiteralStringDouble */ .chroma .s2 { color: #dd1144 } +/* LiteralStringEscape */ .chroma .se { color: #dd1144 } +/* LiteralStringHeredoc */ .chroma .sh { color: #dd1144 } +/* LiteralStringInterpol */ .chroma .si { color: #dd1144 } +/* LiteralStringOther */ .chroma .sx { color: #dd1144 } +/* LiteralStringRegex */ .chroma .sr { color: #009926 } +/* LiteralStringSingle */ .chroma .s1 { color: #dd1144 } +/* LiteralStringSymbol */ .chroma .ss { color: #990073 } +/* LiteralNumber */ .chroma .m { color: #009999 } +/* LiteralNumberBin */ .chroma .mb { color: #009999 } +/* LiteralNumberFloat */ .chroma .mf { color: #009999 } +/* LiteralNumberHex */ .chroma .mh { color: #009999 } +/* LiteralNumberInteger */ .chroma .mi { color: #009999 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #009999 } +/* LiteralNumberOct */ .chroma .mo { color: #009999 } +/* Operator */ .chroma .o { color: #000000; font-weight: bold } +/* OperatorWord */ .chroma .ow { color: #000000; font-weight: bold } +/* Comment */ .chroma .c { color: #999988; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #999988; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #999988; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #999988; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #999999; font-weight: bold; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #999999; font-weight: bold; font-style: italic } +/* CommentPreprocFile */ .chroma .cpf { color: #999999; font-weight: bold; font-style: italic } +/* GenericDeleted */ .chroma .gd { color: #000000; background-color: #ffdddd } +/* GenericEmph */ .chroma .ge { color: #000000; font-style: italic } +/* GenericError */ .chroma .gr { color: #aa0000 } +/* GenericHeading */ .chroma .gh { color: #999999 } +/* GenericInserted */ .chroma .gi { color: #000000; background-color: #ddffdd } +/* GenericOutput */ .chroma .go { color: #888888 } +/* GenericPrompt */ .chroma .gp { color: #555555 } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #aaaaaa } +/* GenericTraceback */ .chroma .gt { color: #aa0000 } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { color: #bbbbbb } diff --git a/docs/_/icons/apple-touch-icon.png b/docs/_/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8b84711223432bf683e20daff7014583594786e2 GIT binary patch literal 20698 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 YtO;;q_YmsY;1&?$Yv%ej2Ph=~T6sckb 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 literal 0 HcmV?d00001 diff --git a/docs/_/js/permalink.js b/docs/_/js/permalink.js new file mode 100644 index 00000000..062ccf3f --- /dev/null +++ b/docs/_/js/permalink.js @@ -0,0 +1,44 @@ +// If the page was opened with an anchor (e.g. #foo), +// and the destination is a
    element, open it. +function openDetailsAnchor() { + let hash = window.location.hash + if (!hash) { + return + } + let el = document.getElementById(hash.slice(1)) // remove leading '#' + if (!el) { + return + } + + let details = el.closest("details") + while (details) { + details.open = true + details = details.parentElement.closest("details") + } + + // New elements may have appeared. + // Set hash again to scroll to the right place. + window.location.hash = hash; + return false; +} + +window.addEventListener('hashchange', openDetailsAnchor) + +window.addEventListener('load', () => { + document.querySelectorAll("h2, h3, h4, h5, h6").forEach((el) => { + if (!el.id) { + return + } + el.innerHTML += ' ' + }) + + document.querySelectorAll("details.example > summary").forEach((el) => { + let id = el.parentElement.id; + if (!id) { + return + } + el.innerHTML += ' ' + }) + + openDetailsAnchor() +}) diff --git a/docs/_/pagefind/filter/unknown_9115dcc.pf_filter b/docs/_/pagefind/filter/unknown_9115dcc.pf_filter new file mode 100644 index 0000000000000000000000000000000000000000..4282e114ecd74b621b1c727b541b5dadc009df93 GIT binary patch literal 65 zcmb2|=3oE;rvHpu3|IdbB&MgPW#*;CrzEE|WrbxHXC`IlWR_GmHf4C`m82HsCFZm- RFfuW-upW8X&ZPy^2mrxc6)XS% literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/fragment/unknown_184582f.pf_fragment b/docs/_/pagefind/fragment/unknown_184582f.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..b92174c935b320c3062f790328d7c8e01f237fc9 GIT binary patch literal 1025 zcmV+c1pfOUiwFP!00002|J9aFbK5o$hW`qNXInP)Y3tS|=~RbKJMFX=+mk>9Bq0F- z7J!^+Jo@ihkRb6PQDTm{B-ZZo!MoT678Tyo4HM)eDac#4S3Fy0ccmnh>$~hGE2J<~ z7%*12_yV!0@r@8GE2#{6&eq_dg52S%x?>Qn1m=$LoFQ|lDEhStc_+n&ZAWKpNE@{; z40=OXl zcC<~|r4uc5&K7K~l13JiTMH9jRpsnf*6&iA)V~9p_4StKUrkl|5hSJRkFeHXr6MPb zI(xGhvErt*ZnHGSs@PpF@P~3u2?6}y^#488rpN5J;x~o2CG>Tt>a&&tRBfEysY<`U zb%Z_CNp9+DDCdIuttrx$34dA-ZNCPqdZp@Al&&BJ+Gh_7M+qyMUU+(Wdf9M^&14)a zbRV6S*aEFO+dge8^-0w4WwE#WaANSH>VvQ%s8XzChP~3!pX<-GFst|7Zr11GBdcrt zPI6A`9MU~+qKeL6AEQo~&$f;4M7tt+ZAtD}#65&a8>lG62!EvFu!1w6dT`!PEkDKC z3iUQ8%iUL(&(uE$Q6y~;ntbXjzy7+ZP=Co?fGxI-_@!d4>lo9|v~h3sTsnv-=t2c$ zC(V`0MD5nVg)Wr^)p`UY&F&1e+ulyK@%{8B+b|AOOJ~cs>_4X2nsH_h+43n{xoMWY z9B;Cc8f-&W&D^W7*}+u2F#KRC!wjbo~r?WT0O=Fy{us91G*@pF0_setgUR`Ge zol%lM_DgXZoFdQi2G1GKu5#)V;wkOVfbnpZ;U<`;c!TFm^1fY(24J!|sV}J3ykA%R zFlg_mpk&_SfwS>YpuNmI%>4>Lv%$(PH`453D9GNF9^`&`&^#Zk$X%a-DsKsZ)81kx z?}oIVr*2POOfJYwpE>O_#xD?90_NiYrOg|mUux&~+{gJKt?ro7)Nv1*EI-5`WPBuhaNhh!_Z|-w;kG|P;5F8 zDodUuw+o8=_ffXvS02luH;JS^k{?Af<#UXMik_k{dSjW9Y|Mt3%rJ_Cnh#mPLaiJs zNAi@1&twjjdH^CxwQ=ykW~4(E4SAXl1wAl|%Npl_L7b@&uKqg1LwCpLcCaDo#fHxl za%JKE(K!Sd;iol@DjG`lOWB3wu4254CfK~{xHh?@_ROkb^Y}nS3E5yix(=bCwxwRPiix1PM z>x5Qi;uC|Z(IHy5NF&Qq@}aAD2! zGzb#tD~gckMH05)trh$qN?M==s)y1pr~44Lr&Tzu>;5mdwju_7I>4pOv3<4{d|z&CYm0{9Gxj!@b`CA&qNYGtvU2wpsBoVTX=p@EnmAtL}E%1=d!7)u#X(NC_BysMC0 zn!<4&vf;{7PZyc*`JPl;GH;Frto`=Rjz|4S&<|5e3nZ9 literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/fragment/unknown_5627a9c.pf_fragment b/docs/_/pagefind/fragment/unknown_5627a9c.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..8e0b7302f094172c675897a0c8f6279892617986 GIT binary patch literal 483 zcmV<90UZ7xiwFP!00002|Ams#Z`v>r#{ZR*pW2Bfh!t%@nv`y15>Knjv=@phV;_l! zV|%tki%|aeU79e$3hGOwyYKw_;`8Ttj%#J)qZD$_DzDjurNWx%t=8yMHegMKCX(Q| z*w8#2^#oMutdH=(RwSa4DR(Yabiy01d!z>j>&gh2Bln_6`o)!q&+sl+Ci&V}J;&=# zfZR$eAe&cZ$^Guo{o&Bu-pwF56l$#mkII?=**6TrE7w%uF?xktyfj?$C<-R#pPLYF?2R0*r=3*avbmc@1_0*>|pVZB z!WS;#9?2raG3$0lxAa@|F!kPg$nI@LeMq}MS~wfx^02*FxfeYouR2%0J@~TM zsi7}kL)PPuCZ4R9kHS_>EXJP(Y^^kz1vc5UUn;1T z(kkxQWWf%%V#|8KN{qZ2nYEd5JQkFyH-bZMQALe3*=rJw8&TNCbFpWrv1~J1jOc)p zOR&)W=J# ZGcVEs&pzb|bv&w<^kPMq)F2jajBa5cr)*LJkI$7=Ss^LDdYz$Y|5r=j45|si7`uf(Os2t zQyNdeR5*vip#*P0L<{}(%cj373nce^#vP8}-or|zDOmJ{)xdQx zQdIbU$vp`2&akPFqn#U@!M_5nLI*~dm0IkQ)Gemy@z#hUBcMU!Nh~r*EdeFLd8_n- z{%VQu@$0mQLfmC(01mRYsghEa7MhZwOXVGbj^O7o*`!R7^efwBjTLF)pK})#2y_D< zuZ)h&esSyYE}Nm0)Z?J>r0MP~9`VCki<(9PSO>Z$pvnD>E;riYY3p*00NpaA2hG46 zT4Ea--7XT3n^?@&r86^nVOstUR!Bp^tIVy2`gwn}q6&_u@POe;2!uN=s54uQZ#Xg% ziezm2B;jMdMu;eNQ|QxjKa>a8o35_$$aID2UGEvN0gb!Zq;VXbV>8FALWhPfw(_O1 zBlYEu3a#mg20H`U67EZ~jastT)kSgqZQ$Z{nU+Wg6zGh@XZh1MUKuN2gek&8p8U8@ z*j%NwZylR{u)oTwnM##kv*{zdk9(LsZxWWF=ON_2+SobwOIqlM);87h%BM(SwS{oF z7E2SVJ${fGv+7}3ey3<9!xQnkI5%`l-W09^0=^GC9OOui;DHjGe%mA+sEZmZuK5;a z``ze3T<(MDF3ld&jv;=cb=WRrI3BII7?*PxR3Km^1y7OU-_n>Wi&c!c9rs}+BqKp)E z$_Uz9$Q%*^dC>BiYQvzNJ4|ZYAJ^K|n871jv@qWuYTeQb+3_YM`(;AitaQFTnX0#LxoWl_s1>qqEN^WLQFA3J{g;KbVq%A4J1WA_-c+IKHr*+7 zxN6g`M&c&hP{goY^0%H;=Fm!V3z$FK!2RiKm7?7<^qGC&~ zBqwB;{CiijoJ3C2o;W4mUA^6X+PA9t45w0w7g2~0)|irw*{ITLrbRwt87s7Ms2o{q zUc6B-MCTA>RcqtmiRI)$B}TliN0P#g;$?^N#9-Q}0&cZZSh!*GH6Zk1QEAaDiq8PF6@gij6~B5Fu8;)aWYdBLf-9q2AlF zC``7^Ce@Nr;5!WbDbdl<5&1p;O*b$RC%~21&z1u9IGiYp#`QVuSwD%xUY27VdJ1I- z-I8;VLC0zQ+rA?;8DN#85Gb<1jpd6ihCy2sZ*p;v>&V1IFm*K^G!Bk+n1%UWL2k7g z-e)A0vh)e*`iL;8NL}r350Hq6mF$w>rL%*unFQWu8N#-T38uadVTg zsVr%?S~mV*Kc$tqETvnq@gtkWoy(rr8LQB7A2MmTbIskHmiNC_H05&Al}KTog>bkk z=Gtd_{9sg7)jk6AFBC0>e-7SeXPRWQkht^+_oLe=etU?0-wxo_ Q_4;}J7dqz+q5cN|02O>_5C8xG literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/index/unknown_d18b557.pf_index b/docs/_/pagefind/index/unknown_d18b557.pf_index new file mode 100644 index 0000000000000000000000000000000000000000..451921e95805b1658ea34c766d68cf607c7565a6 GIT binary patch literal 4171 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 VG0fHk<}2FE{|7_(bI_|E0041cBclKS literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/pagefind-entry.json b/docs/_/pagefind/pagefind-entry.json new file mode 100644 index 00000000..f25b4ffe --- /dev/null +++ b/docs/_/pagefind/pagefind-entry.json @@ -0,0 +1 @@ +{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_9d42de2383af4a6","wasm":null,"page_count":6}}} \ No newline at end of file diff --git a/docs/_/pagefind/pagefind-highlight.js b/docs/_/pagefind/pagefind-highlight.js new file mode 100644 index 00000000..c823fbfe --- /dev/null +++ b/docs/_/pagefind/pagefind-highlight.js @@ -0,0 +1,1069 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/mark.js/dist/mark.js +var require_mark = __commonJS({ + "node_modules/mark.js/dist/mark.js"(exports, module) { + (function(global, factory) { + typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.Mark = factory(); + })(exports, function() { + "use strict"; + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + var classCallCheck = function(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + var createClass = function() { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function(Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + var _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + var DOMIterator = function() { + function DOMIterator2(ctx) { + var iframes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; + var exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; + var iframesTimeout = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 5e3; + classCallCheck(this, DOMIterator2); + this.ctx = ctx; + this.iframes = iframes; + this.exclude = exclude; + this.iframesTimeout = iframesTimeout; + } + createClass(DOMIterator2, [{ + key: "getContexts", + value: function getContexts() { + var ctx = void 0, filteredCtx = []; + if (typeof this.ctx === "undefined" || !this.ctx) { + ctx = []; + } else if (NodeList.prototype.isPrototypeOf(this.ctx)) { + ctx = Array.prototype.slice.call(this.ctx); + } else if (Array.isArray(this.ctx)) { + ctx = this.ctx; + } else if (typeof this.ctx === "string") { + ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx)); + } else { + ctx = [this.ctx]; + } + ctx.forEach(function(ctx2) { + var isDescendant = filteredCtx.filter(function(contexts) { + return contexts.contains(ctx2); + }).length > 0; + if (filteredCtx.indexOf(ctx2) === -1 && !isDescendant) { + filteredCtx.push(ctx2); + } + }); + return filteredCtx; + } + }, { + key: "getIframeContents", + value: function getIframeContents(ifr, successFn) { + var errorFn = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() { + }; + var doc = void 0; + try { + var ifrWin = ifr.contentWindow; + doc = ifrWin.document; + if (!ifrWin || !doc) { + throw new Error("iframe inaccessible"); + } + } catch (e) { + errorFn(); + } + if (doc) { + successFn(doc); + } + } + }, { + key: "isIframeBlank", + value: function isIframeBlank(ifr) { + var bl = "about:blank", src = ifr.getAttribute("src").trim(), href = ifr.contentWindow.location.href; + return href === bl && src !== bl && src; + } + }, { + key: "observeIframeLoad", + value: function observeIframeLoad(ifr, successFn, errorFn) { + var _this = this; + var called = false, tout = null; + var listener = function listener2() { + if (called) { + return; + } + called = true; + clearTimeout(tout); + try { + if (!_this.isIframeBlank(ifr)) { + ifr.removeEventListener("load", listener2); + _this.getIframeContents(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + }; + ifr.addEventListener("load", listener); + tout = setTimeout(listener, this.iframesTimeout); + } + }, { + key: "onIframeReady", + value: function onIframeReady(ifr, successFn, errorFn) { + try { + if (ifr.contentWindow.document.readyState === "complete") { + if (this.isIframeBlank(ifr)) { + this.observeIframeLoad(ifr, successFn, errorFn); + } else { + this.getIframeContents(ifr, successFn, errorFn); + } + } else { + this.observeIframeLoad(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + } + }, { + key: "waitForIframes", + value: function waitForIframes(ctx, done) { + var _this2 = this; + var eachCalled = 0; + this.forEachIframe(ctx, function() { + return true; + }, function(ifr) { + eachCalled++; + _this2.waitForIframes(ifr.querySelector("html"), function() { + if (!--eachCalled) { + done(); + } + }); + }, function(handled) { + if (!handled) { + done(); + } + }); + } + }, { + key: "forEachIframe", + value: function forEachIframe(ctx, filter, each) { + var _this3 = this; + var end = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var ifr = ctx.querySelectorAll("iframe"), open = ifr.length, handled = 0; + ifr = Array.prototype.slice.call(ifr); + var checkEnd = function checkEnd2() { + if (--open <= 0) { + end(handled); + } + }; + if (!open) { + checkEnd(); + } + ifr.forEach(function(ifr2) { + if (DOMIterator2.matches(ifr2, _this3.exclude)) { + checkEnd(); + } else { + _this3.onIframeReady(ifr2, function(con) { + if (filter(ifr2)) { + handled++; + each(con); + } + checkEnd(); + }, checkEnd); + } + }); + } + }, { + key: "createIterator", + value: function createIterator(ctx, whatToShow, filter) { + return document.createNodeIterator(ctx, whatToShow, filter, false); + } + }, { + key: "createInstanceOnIframe", + value: function createInstanceOnIframe(contents) { + return new DOMIterator2(contents.querySelector("html"), this.iframes); + } + }, { + key: "compareNodeIframe", + value: function compareNodeIframe(node, prevNode, ifr) { + var compCurr = node.compareDocumentPosition(ifr), prev = Node.DOCUMENT_POSITION_PRECEDING; + if (compCurr & prev) { + if (prevNode !== null) { + var compPrev = prevNode.compareDocumentPosition(ifr), after = Node.DOCUMENT_POSITION_FOLLOWING; + if (compPrev & after) { + return true; + } + } else { + return true; + } + } + return false; + } + }, { + key: "getIteratorNode", + value: function getIteratorNode(itr) { + var prevNode = itr.previousNode(); + var node = void 0; + if (prevNode === null) { + node = itr.nextNode(); + } else { + node = itr.nextNode() && itr.nextNode(); + } + return { + prevNode, + node + }; + } + }, { + key: "checkIframeFilter", + value: function checkIframeFilter(node, prevNode, currIfr, ifr) { + var key = false, handled = false; + ifr.forEach(function(ifrDict, i) { + if (ifrDict.val === currIfr) { + key = i; + handled = ifrDict.handled; + } + }); + if (this.compareNodeIframe(node, prevNode, currIfr)) { + if (key === false && !handled) { + ifr.push({ + val: currIfr, + handled: true + }); + } else if (key !== false && !handled) { + ifr[key].handled = true; + } + return true; + } + if (key === false) { + ifr.push({ + val: currIfr, + handled: false + }); + } + return false; + } + }, { + key: "handleOpenIframes", + value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) { + var _this4 = this; + ifr.forEach(function(ifrDict) { + if (!ifrDict.handled) { + _this4.getIframeContents(ifrDict.val, function(con) { + _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb); + }); + } + }); + } + }, { + key: "iterateThroughNodes", + value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) { + var _this5 = this; + var itr = this.createIterator(ctx, whatToShow, filterCb); + var ifr = [], elements = [], node = void 0, prevNode = void 0, retrieveNodes = function retrieveNodes2() { + var _getIteratorNode = _this5.getIteratorNode(itr); + prevNode = _getIteratorNode.prevNode; + node = _getIteratorNode.node; + return node; + }; + while (retrieveNodes()) { + if (this.iframes) { + this.forEachIframe(ctx, function(currIfr) { + return _this5.checkIframeFilter(node, prevNode, currIfr, ifr); + }, function(con) { + _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function(ifrNode) { + return elements.push(ifrNode); + }, filterCb); + }); + } + elements.push(node); + } + elements.forEach(function(node2) { + eachCb(node2); + }); + if (this.iframes) { + this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb); + } + doneCb(); + } + }, { + key: "forEachNode", + value: function forEachNode(whatToShow, each, filter) { + var _this6 = this; + var done = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var contexts = this.getContexts(); + var open = contexts.length; + if (!open) { + done(); + } + contexts.forEach(function(ctx) { + var ready = function ready2() { + _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function() { + if (--open <= 0) { + done(); + } + }); + }; + if (_this6.iframes) { + _this6.waitForIframes(ctx, ready); + } else { + ready(); + } + }); + } + }], [{ + key: "matches", + value: function matches(element, selector) { + var selectors = typeof selector === "string" ? [selector] : selector, fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector; + if (fn) { + var match = false; + selectors.every(function(sel) { + if (fn.call(element, sel)) { + match = true; + return false; + } + return true; + }); + return match; + } else { + return false; + } + } + }]); + return DOMIterator2; + }(); + var Mark$1 = function() { + function Mark3(ctx) { + classCallCheck(this, Mark3); + this.ctx = ctx; + this.ie = false; + var ua = window.navigator.userAgent; + if (ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1) { + this.ie = true; + } + } + createClass(Mark3, [{ + key: "log", + value: function log(msg) { + var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "debug"; + var log2 = this.opt.log; + if (!this.opt.debug) { + return; + } + if ((typeof log2 === "undefined" ? "undefined" : _typeof(log2)) === "object" && typeof log2[level] === "function") { + log2[level]("mark.js: " + msg); + } + } + }, { + key: "escapeStr", + value: function escapeStr(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + }, { + key: "createRegExp", + value: function createRegExp(str) { + if (this.opt.wildcards !== "disabled") { + str = this.setupWildcardsRegExp(str); + } + str = this.escapeStr(str); + if (Object.keys(this.opt.synonyms).length) { + str = this.createSynonymsRegExp(str); + } + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + if (this.opt.diacritics) { + str = this.createDiacriticsRegExp(str); + } + str = this.createMergedBlanksRegExp(str); + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.createJoinersRegExp(str); + } + if (this.opt.wildcards !== "disabled") { + str = this.createWildcardsRegExp(str); + } + str = this.createAccuracyRegExp(str); + return str; + } + }, { + key: "createSynonymsRegExp", + value: function createSynonymsRegExp(str) { + var syn = this.opt.synonyms, sens = this.opt.caseSensitive ? "" : "i", joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : ""; + for (var index in syn) { + if (syn.hasOwnProperty(index)) { + var value = syn[index], k1 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(index) : this.escapeStr(index), k2 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(value) : this.escapeStr(value); + if (k1 !== "" && k2 !== "") { + str = str.replace(new RegExp("(" + this.escapeStr(k1) + "|" + this.escapeStr(k2) + ")", "gm" + sens), joinerPlaceholder + ("(" + this.processSynomyms(k1) + "|") + (this.processSynomyms(k2) + ")") + joinerPlaceholder); + } + } + } + return str; + } + }, { + key: "processSynomyms", + value: function processSynomyms(str) { + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + return str; + } + }, { + key: "setupWildcardsRegExp", + value: function setupWildcardsRegExp(str) { + str = str.replace(/(?:\\)*\?/g, function(val) { + return val.charAt(0) === "\\" ? "?" : ""; + }); + return str.replace(/(?:\\)*\*/g, function(val) { + return val.charAt(0) === "\\" ? "*" : ""; + }); + } + }, { + key: "createWildcardsRegExp", + value: function createWildcardsRegExp(str) { + var spaces = this.opt.wildcards === "withSpaces"; + return str.replace(/\u0001/g, spaces ? "[\\S\\s]?" : "\\S?").replace(/\u0002/g, spaces ? "[\\S\\s]*?" : "\\S*"); + } + }, { + key: "setupIgnoreJoinersRegExp", + value: function setupIgnoreJoinersRegExp(str) { + return str.replace(/[^(|)\\]/g, function(val, indx, original) { + var nextChar = original.charAt(indx + 1); + if (/[(|)\\]/.test(nextChar) || nextChar === "") { + return val; + } else { + return val + "\0"; + } + }); + } + }, { + key: "createJoinersRegExp", + value: function createJoinersRegExp(str) { + var joiner = []; + var ignorePunctuation = this.opt.ignorePunctuation; + if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) { + joiner.push(this.escapeStr(ignorePunctuation.join(""))); + } + if (this.opt.ignoreJoiners) { + joiner.push("\\u00ad\\u200b\\u200c\\u200d"); + } + return joiner.length ? str.split(/\u0000+/).join("[" + joiner.join("") + "]*") : str; + } + }, { + key: "createDiacriticsRegExp", + value: function createDiacriticsRegExp(str) { + var sens = this.opt.caseSensitive ? "" : "i", dct = this.opt.caseSensitive ? ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105", "A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010D", "C\xC7\u0106\u010C", "d\u0111\u010F", "D\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119", "E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B", "I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142", "L\u0141", "n\xF1\u0148\u0144", "N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D", "O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159", "R\u0158", "s\u0161\u015B\u0219\u015F", "S\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163", "T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B", "U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF", "Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017A", "Z\u017D\u017B\u0179"] : ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010DC\xC7\u0106\u010C", "d\u0111\u010FD\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142L\u0141", "n\xF1\u0148\u0144N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159R\u0158", "s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017AZ\u017D\u017B\u0179"]; + var handled = []; + str.split("").forEach(function(ch) { + dct.every(function(dct2) { + if (dct2.indexOf(ch) !== -1) { + if (handled.indexOf(dct2) > -1) { + return false; + } + str = str.replace(new RegExp("[" + dct2 + "]", "gm" + sens), "[" + dct2 + "]"); + handled.push(dct2); + } + return true; + }); + }); + return str; + } + }, { + key: "createMergedBlanksRegExp", + value: function createMergedBlanksRegExp(str) { + return str.replace(/[\s]+/gmi, "[\\s]+"); + } + }, { + key: "createAccuracyRegExp", + value: function createAccuracyRegExp(str) { + var _this = this; + var chars = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF"; + var acc = this.opt.accuracy, val = typeof acc === "string" ? acc : acc.value, ls = typeof acc === "string" ? [] : acc.limiters, lsJoin = ""; + ls.forEach(function(limiter) { + lsJoin += "|" + _this.escapeStr(limiter); + }); + switch (val) { + case "partially": + default: + return "()(" + str + ")"; + case "complementary": + lsJoin = "\\s" + (lsJoin ? lsJoin : this.escapeStr(chars)); + return "()([^" + lsJoin + "]*" + str + "[^" + lsJoin + "]*)"; + case "exactly": + return "(^|\\s" + lsJoin + ")(" + str + ")(?=$|\\s" + lsJoin + ")"; + } + } + }, { + key: "getSeparatedKeywords", + value: function getSeparatedKeywords(sv) { + var _this2 = this; + var stack = []; + sv.forEach(function(kw) { + if (!_this2.opt.separateWordSearch) { + if (kw.trim() && stack.indexOf(kw) === -1) { + stack.push(kw); + } + } else { + kw.split(" ").forEach(function(kwSplitted) { + if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) { + stack.push(kwSplitted); + } + }); + } + }); + return { + "keywords": stack.sort(function(a, b) { + return b.length - a.length; + }), + "length": stack.length + }; + } + }, { + key: "isNumeric", + value: function isNumeric(value) { + return Number(parseFloat(value)) == value; + } + }, { + key: "checkRanges", + value: function checkRanges(array) { + var _this3 = this; + if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== "[object Object]") { + this.log("markRanges() will only accept an array of objects"); + this.opt.noMatch(array); + return []; + } + var stack = []; + var last = 0; + array.sort(function(a, b) { + return a.start - b.start; + }).forEach(function(item) { + var _callNoMatchOnInvalid = _this3.callNoMatchOnInvalidRanges(item, last), start = _callNoMatchOnInvalid.start, end = _callNoMatchOnInvalid.end, valid = _callNoMatchOnInvalid.valid; + if (valid) { + item.start = start; + item.length = end - start; + stack.push(item); + last = end; + } + }); + return stack; + } + }, { + key: "callNoMatchOnInvalidRanges", + value: function callNoMatchOnInvalidRanges(range, last) { + var start = void 0, end = void 0, valid = false; + if (range && typeof range.start !== "undefined") { + start = parseInt(range.start, 10); + end = start + parseInt(range.length, 10); + if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) { + valid = true; + } else { + this.log("Ignoring invalid or overlapping range: " + ("" + JSON.stringify(range))); + this.opt.noMatch(range); + } + } else { + this.log("Ignoring invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "checkWhitespaceRanges", + value: function checkWhitespaceRanges(range, originalLength, string) { + var end = void 0, valid = true, max = string.length, offset = originalLength - max, start = parseInt(range.start, 10) - offset; + start = start > max ? max : start; + end = start + parseInt(range.length, 10); + if (end > max) { + end = max; + this.log("End range automatically set to the max value of " + max); + } + if (start < 0 || end - start < 0 || start > max || end > max) { + valid = false; + this.log("Invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } else if (string.substring(start, end).replace(/\s+/g, "") === "") { + valid = false; + this.log("Skipping whitespace only range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "getTextNodes", + value: function getTextNodes(cb) { + var _this4 = this; + var val = "", nodes = []; + this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function(node) { + nodes.push({ + start: val.length, + end: (val += node.textContent).length, + node + }); + }, function(node) { + if (_this4.matchesExclude(node.parentNode)) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, function() { + cb({ + value: val, + nodes + }); + }); + } + }, { + key: "matchesExclude", + value: function matchesExclude(el) { + return DOMIterator.matches(el, this.opt.exclude.concat(["script", "style", "title", "head", "html"])); + } + }, { + key: "wrapRangeInTextNode", + value: function wrapRangeInTextNode(node, start, end) { + var hEl = !this.opt.element ? "mark" : this.opt.element, startNode = node.splitText(start), ret = startNode.splitText(end - start); + var repl = document.createElement(hEl); + repl.setAttribute("data-markjs", "true"); + if (this.opt.className) { + repl.setAttribute("class", this.opt.className); + } + repl.textContent = startNode.textContent; + startNode.parentNode.replaceChild(repl, startNode); + return ret; + } + }, { + key: "wrapRangeInMappedTextNode", + value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { + var _this5 = this; + dict.nodes.every(function(n, i) { + var sibl = dict.nodes[i + 1]; + if (typeof sibl === "undefined" || sibl.start > start) { + if (!filterCb(n.node)) { + return false; + } + var s = start - n.start, e = (end > n.end ? n.end : end) - n.start, startStr = dict.value.substr(0, n.start), endStr = dict.value.substr(e + n.start); + n.node = _this5.wrapRangeInTextNode(n.node, s, e); + dict.value = startStr + endStr; + dict.nodes.forEach(function(k, j) { + if (j >= i) { + if (dict.nodes[j].start > 0 && j !== i) { + dict.nodes[j].start -= e; + } + dict.nodes[j].end -= e; + } + }); + end -= e; + eachCb(n.node.previousSibling, n.start); + if (end > n.end) { + start = n.end; + } else { + return false; + } + } + return true; + }); + } + }, { + key: "wrapMatches", + value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this6 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + dict.nodes.forEach(function(node) { + node = node.node; + var match = void 0; + while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== "") { + if (!filterCb(match[matchIdx], node)) { + continue; + } + var pos = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + pos += match[i].length; + } + } + node = _this6.wrapRangeInTextNode(node, pos, pos + match[matchIdx].length); + eachCb(node.previousSibling); + regex.lastIndex = 0; + } + }); + endCb(); + }); + } + }, { + key: "wrapMatchesAcrossElements", + value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this7 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + var match = void 0; + while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== "") { + var start = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + start += match[i].length; + } + } + var end = start + match[matchIdx].length; + _this7.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(match[matchIdx], node); + }, function(node, lastIndex) { + regex.lastIndex = lastIndex; + eachCb(node); + }); + } + endCb(); + }); + } + }, { + key: "wrapRangeFromIndex", + value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) { + var _this8 = this; + this.getTextNodes(function(dict) { + var originalLength = dict.value.length; + ranges.forEach(function(range, counter) { + var _checkWhitespaceRange = _this8.checkWhitespaceRanges(range, originalLength, dict.value), start = _checkWhitespaceRange.start, end = _checkWhitespaceRange.end, valid = _checkWhitespaceRange.valid; + if (valid) { + _this8.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(node, range, dict.value.substring(start, end), counter); + }, function(node) { + eachCb(node, range); + }); + } + }); + endCb(); + }); + } + }, { + key: "unwrapMatches", + value: function unwrapMatches(node) { + var parent = node.parentNode; + var docFrag = document.createDocumentFragment(); + while (node.firstChild) { + docFrag.appendChild(node.removeChild(node.firstChild)); + } + parent.replaceChild(docFrag, node); + if (!this.ie) { + parent.normalize(); + } else { + this.normalizeTextNode(parent); + } + } + }, { + key: "normalizeTextNode", + value: function normalizeTextNode(node) { + if (!node) { + return; + } + if (node.nodeType === 3) { + while (node.nextSibling && node.nextSibling.nodeType === 3) { + node.nodeValue += node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } else { + this.normalizeTextNode(node.firstChild); + } + this.normalizeTextNode(node.nextSibling); + } + }, { + key: "markRegExp", + value: function markRegExp(regexp, opt) { + var _this9 = this; + this.opt = opt; + this.log('Searching with expression "' + regexp + '"'); + var totalMatches = 0, fn = "wrapMatches"; + var eachCb = function eachCb2(element) { + totalMatches++; + _this9.opt.each(element); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + this[fn](regexp, this.opt.ignoreGroups, function(match, node) { + return _this9.opt.filter(node, match, totalMatches); + }, eachCb, function() { + if (totalMatches === 0) { + _this9.opt.noMatch(regexp); + } + _this9.opt.done(totalMatches); + }); + } + }, { + key: "mark", + value: function mark(sv, opt) { + var _this10 = this; + this.opt = opt; + var totalMatches = 0, fn = "wrapMatches"; + var _getSeparatedKeywords = this.getSeparatedKeywords(typeof sv === "string" ? [sv] : sv), kwArr = _getSeparatedKeywords.keywords, kwArrLen = _getSeparatedKeywords.length, sens = this.opt.caseSensitive ? "" : "i", handler = function handler2(kw) { + var regex = new RegExp(_this10.createRegExp(kw), "gm" + sens), matches = 0; + _this10.log('Searching with expression "' + regex + '"'); + _this10[fn](regex, 1, function(term, node) { + return _this10.opt.filter(node, kw, totalMatches, matches); + }, function(element) { + matches++; + totalMatches++; + _this10.opt.each(element); + }, function() { + if (matches === 0) { + _this10.opt.noMatch(kw); + } + if (kwArr[kwArrLen - 1] === kw) { + _this10.opt.done(totalMatches); + } else { + handler2(kwArr[kwArr.indexOf(kw) + 1]); + } + }); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + if (kwArrLen === 0) { + this.opt.done(totalMatches); + } else { + handler(kwArr[0]); + } + } + }, { + key: "markRanges", + value: function markRanges(rawRanges, opt) { + var _this11 = this; + this.opt = opt; + var totalMatches = 0, ranges = this.checkRanges(rawRanges); + if (ranges && ranges.length) { + this.log("Starting to mark with the following ranges: " + JSON.stringify(ranges)); + this.wrapRangeFromIndex(ranges, function(node, range, match, counter) { + return _this11.opt.filter(node, range, match, counter); + }, function(element, range) { + totalMatches++; + _this11.opt.each(element, range); + }, function() { + _this11.opt.done(totalMatches); + }); + } else { + this.opt.done(totalMatches); + } + } + }, { + key: "unmark", + value: function unmark(opt) { + var _this12 = this; + this.opt = opt; + var sel = this.opt.element ? this.opt.element : "*"; + sel += "[data-markjs]"; + if (this.opt.className) { + sel += "." + this.opt.className; + } + this.log('Removal selector "' + sel + '"'); + this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function(node) { + _this12.unwrapMatches(node); + }, function(node) { + var matchesSel = DOMIterator.matches(node, sel), matchesExclude = _this12.matchesExclude(node); + if (!matchesSel || matchesExclude) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, this.opt.done); + } + }, { + key: "opt", + set: function set$$1(val) { + this._opt = _extends({}, { + "element": "", + "className": "", + "exclude": [], + "iframes": false, + "iframesTimeout": 5e3, + "separateWordSearch": true, + "diacritics": true, + "synonyms": {}, + "accuracy": "partially", + "acrossElements": false, + "caseSensitive": false, + "ignoreJoiners": false, + "ignoreGroups": 0, + "ignorePunctuation": [], + "wildcards": "disabled", + "each": function each() { + }, + "noMatch": function noMatch() { + }, + "filter": function filter() { + return true; + }, + "done": function done() { + }, + "debug": false, + "log": window.console + }, val); + }, + get: function get$$1() { + return this._opt; + } + }, { + key: "iterator", + get: function get$$1() { + return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout); + } + }]); + return Mark3; + }(); + function Mark2(ctx) { + var _this = this; + var instance = new Mark$1(ctx); + this.mark = function(sv, opt) { + instance.mark(sv, opt); + return _this; + }; + this.markRegExp = function(sv, opt) { + instance.markRegExp(sv, opt); + return _this; + }; + this.markRanges = function(sv, opt) { + instance.markRanges(sv, opt); + return _this; + }; + this.unmark = function(opt) { + instance.unmark(opt); + return _this; + }; + return this; + } + return Mark2; + }); + } +}); + +// lib/highlight.ts +var import_mark = __toESM(require_mark(), 1); +var PagefindHighlight = class { + constructor(options = { + markContext: null, + highlightParam: "pagefind-highlight", + markOptions: { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }, + addStyles: true + }) { + var _a, _b; + const { highlightParam, markContext, markOptions, addStyles } = options; + this.highlightParam = highlightParam ?? "pagefind-highlight"; + this.addStyles = addStyles ?? true; + this.markContext = markContext !== void 0 ? markContext : null; + this.markOptions = markOptions !== void 0 ? markOptions : { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }; + (_a = this.markOptions).className ?? (_a.className = "pagefind__highlight"); + (_b = this.markOptions).exclude ?? (_b.exclude = [ + "[data-pagefind-ignore]", + "[data-pagefind-ignore] *" + ]); + this.markOptions.separateWordSearch = false; + this.highlight(); + } + getHighlightParams(paramName) { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.getAll(paramName); + } + // Inline styles might be too hard to override + addHighlightStyles(className) { + if (!className) + return; + const styleElement = document.createElement("style"); + styleElement.innerText = `:where(.${className}) { background-color: yellow; color: black; }`; + document.head.appendChild(styleElement); + } + createMarkInstance() { + if (this.markContext) { + return new import_mark.default(this.markContext); + } + const pagefindBody = document.querySelectorAll("[data-pagefind-body]"); + if (pagefindBody.length !== 0) { + return new import_mark.default(pagefindBody); + } else { + return new import_mark.default(document.body); + } + } + markText(instance, text) { + instance.mark(text, this.markOptions); + } + highlight() { + const params = this.getHighlightParams(this.highlightParam); + if (!params || params.length === 0) + return; + this.addStyles && this.addHighlightStyles(this.markOptions.className); + const markInstance = this.createMarkInstance(); + this.markText(markInstance, params); + } +}; +window.PagefindHighlight = PagefindHighlight; +export { + PagefindHighlight as default +}; +/*! Bundled license information: + +mark.js/dist/mark.js: + (*!*************************************************** + * mark.js v8.11.1 + * https://markjs.io/ + * Copyright (c) 2014–2018, Julian Kühnel + * Released under the MIT license https://git.io/vwTVl + *****************************************************) +*/ diff --git a/docs/_/pagefind/pagefind-modular-ui.css b/docs/_/pagefind/pagefind-modular-ui.css new file mode 100644 index 00000000..9c6793ed --- /dev/null +++ b/docs/_/pagefind/pagefind-modular-ui.css @@ -0,0 +1,214 @@ +:root { + --pagefind-ui-scale: 0.8; + --pagefind-ui-primary: #034AD8; + --pagefind-ui-fade: #707070; + --pagefind-ui-text: #393939; + --pagefind-ui-background: #ffffff; + --pagefind-ui-border: #eeeeee; + --pagefind-ui-tag: #eeeeee; + --pagefind-ui-border-width: 2px; + --pagefind-ui-border-radius: 8px; + --pagefind-ui-image-border-radius: 8px; + --pagefind-ui-image-box-ratio: 3 / 2; + --pagefind-ui-font: system, -apple-system, ".SFNSText-Regular", + "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", + "Lucida Grande", sans-serif; +} + +[data-pfmod-hidden] { + display: none !important; +} + +[data-pfmod-suppressed] { + opacity: 0 !important; + pointer-events: none !important; +} + +[data-pfmod-sr-hidden] { + -webkit-clip: rect(0 0 0 0) !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(100%) !important; + clip-path: inset(100%) !important; + height: 1px !important; + overflow: hidden !important; + overflow: clip !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +[data-pfmod-loading] { + color: var(--pagefind-ui-text); + background-color: var(--pagefind-ui-text); + border-radius: var(--pagefind-ui-border-radius); + opacity: 0.1; + pointer-events: none; +} + +/* Input */ + +.pagefind-modular-input-wrapper { + position: relative; +} + +.pagefind-modular-input-wrapper::before { + background-color: var(--pagefind-ui-text); + width: calc(18px * var(--pagefind-ui-scale)); + height: calc(18px * var(--pagefind-ui-scale)); + top: calc(23px * var(--pagefind-ui-scale)); + left: calc(20px * var(--pagefind-ui-scale)); + content: ""; + position: absolute; + display: block; + opacity: 0.7; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + -webkit-mask-size: 100%; + mask-size: 100%; + z-index: 9; + pointer-events: none; +} + +.pagefind-modular-input { + height: calc(64px * var(--pagefind-ui-scale)); + padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: var(--pagefind-ui-border-radius); + font-size: calc(21px * var(--pagefind-ui-scale)); + position: relative; + appearance: none; + -webkit-appearance: none; + display: flex; + width: 100%; + box-sizing: border-box; + font-weight: 700; +} + +.pagefind-modular-input::placeholder { + opacity: 0.2; +} + +.pagefind-modular-input-clear { + position: absolute; + top: calc(2px * var(--pagefind-ui-scale)); + right: calc(2px * var(--pagefind-ui-scale)); + height: calc(60px * var(--pagefind-ui-scale)); + border-radius: var(--pagefind-ui-border-radius); + padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale)); + color: var(--pagefind-ui-text); + font-size: calc(14px * var(--pagefind-ui-scale)); + cursor: pointer; + background-color: var(--pagefind-ui-background); + border: none; + appearance: none; +} + +/* ResultList */ + +.pagefind-modular-list-result { + list-style-type: none; + display: flex; + align-items: flex-start; + gap: min(calc(40px * var(--pagefind-ui-scale)), 3%); + padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale)); + border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-result:last-of-type { + border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-thumb { + width: min(30%, + calc((30% - (100px * var(--pagefind-ui-scale))) * 100000)); + max-width: calc(120px * var(--pagefind-ui-scale)); + margin-top: calc(10px * var(--pagefind-ui-scale)); + aspect-ratio: var(--pagefind-ui-image-box-ratio); + position: relative; +} + +.pagefind-modular-list-image { + display: block; + position: absolute; + left: 50%; + transform: translateX(-50%); + font-size: 0; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + border-radius: var(--pagefind-ui-image-border-radius); +} + +.pagefind-modular-list-inner { + flex: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: calc(10px * var(--pagefind-ui-scale)); +} + +.pagefind-modular-list-title { + display: inline-block; + font-weight: 700; + font-size: calc(21px * var(--pagefind-ui-scale)); + margin-top: 0; + margin-bottom: 0; +} + +.pagefind-modular-list-link { + color: var(--pagefind-ui-text); + text-decoration: none; +} + +.pagefind-modular-list-link:hover { + text-decoration: underline; +} + +.pagefind-modular-list-excerpt { + display: inline-block; + font-weight: 400; + font-size: calc(16px * var(--pagefind-ui-scale)); + margin-top: calc(4px * var(--pagefind-ui-scale)); + margin-bottom: 0; + min-width: calc(250px * var(--pagefind-ui-scale)); +} + +/* FilterPills */ + +.pagefind-modular-filter-pills-wrapper { + overflow-x: scroll; + padding: 15px 0; +} + +.pagefind-modular-filter-pills { + display: flex; + gap: 6px; +} + +.pagefind-modular-filter-pill { + display: flex; + justify-content: center; + align-items: center; + border: none; + appearance: none; + padding: 0 calc(24px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + color: var(--pagefind-ui-fade); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: calc(25px * var(--pagefind-ui-scale)); + font-size: calc(18px * var(--pagefind-ui-scale)); + height: calc(50px * var(--pagefind-ui-scale)); + cursor: pointer; + white-space: nowrap; +} + +.pagefind-modular-filter-pill:hover { + border-color: var(--pagefind-ui-primary); +} + +.pagefind-modular-filter-pill[aria-pressed="true"] { + border-color: var(--pagefind-ui-primary); + color: var(--pagefind-ui-primary); +} \ No newline at end of file diff --git a/docs/_/pagefind/pagefind-modular-ui.js b/docs/_/pagefind/pagefind-modular-ui.js new file mode 100644 index 00000000..93019091 --- /dev/null +++ b/docs/_/pagefind/pagefind-modular-ui.js @@ -0,0 +1,8 @@ +(()=>{var b=Object.defineProperty;var w=(i,e)=>{for(var t in e)b(i,t,{get:e[t],enumerable:!0})};var f={};w(f,{FilterPills:()=>h,Input:()=>l,Instance:()=>p,ResultList:()=>a,Summary:()=>o});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),l=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`
  • +
    +
    +

    ${i(30)}

    +

    ${i(40)}

    +
    +
  • `},y=i=>{let e=new r("li").class("pagefind-modular-list-result"),t=new r("div").class("pagefind-modular-list-thumb").addTo(e);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(t);let s=new r("div").class("pagefind-modular-list-inner").addTo(e),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),e.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},a=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var o=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var h=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`${e} (${t})`:`${e}`}renderNew(){this.available.forEach(([e,t])=>{new r("button").class("pagefind-modular-filter-pill").html(this.pillInner(e,t)).attrs({"aria-pressed":this.selected.includes(e),type:"button"}).handle("click",()=>{e==="All"?this.selected=["All"]:this.selected.includes(e)?this.selected=this.selected.filter(s=>s!==e):this.selectMultiple?this.selected.push(e):this.selected=[e],this.selected?.length?this.selected?.length>1&&(this.selected=this.selected.filter(s=>s!=="All")):this.selected=["All"],this.update(),this.pushFilters()}).addTo(this.pillContainer)})}updateExisting(){let e=[...this.pillContainer.childNodes];this.available.forEach(([t,s],n)=>{e[n].innerHTML=this.pillInner(t,s),e[n].setAttribute("aria-pressed",this.selected.includes(t))})}register(e){this.instance=e,this.instance.on("filters",t=>{if(!this.pillContainer)return;this.selectMultiple?t=t.available:t=t.total;let s=t[this.filter];if(!s){console.warn(`[Pagefind FilterPills component]: No possible values found for the ${this.filter} filter`);return}this.available=Object.entries(s),Array.isArray(this.ordering)?this.available.sort((n,c)=>{let m=this.ordering.indexOf(n[0]),_=this.ordering.indexOf(c[0]);return(m===-1?1/0:m)-(_===-1?1/0:_)}):this.available.sort((n,c)=>n[0].localeCompare(c[0])),this.available.unshift(["All",this.total]),this.update()}),e.on("results",t=>{this.pillContainer&&(this.total=t?.unfilteredResultCount||0,this.available?.[0]?.[0]==="All"&&(this.available[0][1]=this.total),this.total||this.alwaysShow?this.wrapper.removeAttribute("data-pfmod-hidden"):this.wrapper.setAttribute("data-pfmod-hidden","true"),this.update())})}};var F=async(i=50)=>await new Promise(e=>setTimeout(e,i)),u;try{u=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?modular-ui.js.*$/)[1]}catch{u="/pagefind/"}var p=class{constructor(e={}){this.__pagefind__=null,this.__initializing__=null,this.__searchID__=0,this.__hooks__={search:[],filters:[],loading:[],results:[]},this.components=[],this.searchTerm="",this.searchFilters={},this.searchResult={},this.availableFilters=null,this.totalFilters=null,this.options={bundlePath:e.bundlePath??u,mergeIndex:e.mergeIndex??[]},delete e.bundlePath,delete e.resetStyles,delete e.processResult,delete e.processTerm,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,this.pagefindOptions=e}add(e){e?.register?.(this),this.components.push(e)}on(e,t){if(!this.__hooks__[e]){let s=Object.keys(this.__hooks__).join(", ");console.error(`[Pagefind Composable]: Unknown event type ${e}. Supported events: [${s}]`);return}if(typeof t!="function"){console.error(`[Pagefind Composable]: Expected callback to be a function, received ${typeof t}`);return}this.__hooks__[e].push(t)}triggerLoad(){this.__load__()}triggerSearch(e){this.searchTerm=e,this.__dispatch__("search",e,this.searchFilters),this.__search__(e,this.searchFilters)}triggerSearchWithFilters(e,t){this.searchTerm=e,this.searchFilters=t,this.__dispatch__("search",e,t),this.__search__(e,t)}triggerFilters(e){this.searchFilters=e,this.__dispatch__("search",this.searchTerm,e),this.__search__(this.searchTerm,e)}triggerFilter(e,t){this.searchFilters=this.searchFilters||{},this.searchFilters[e]=t,this.__dispatch__("search",this.searchTerm,this.searchFilters),this.__search__(this.searchTerm,this.searchFilters)}__dispatch__(e,...t){this.__hooks__[e]?.forEach(s=>s?.(...t))}async __clear__(){this.__dispatch__("results",{results:[],unfilteredTotalCount:0}),this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}async __search__(e,t){this.__dispatch__("loading"),await this.__load__();let s=++this.__searchID__;if(!e||!e.length)return this.__clear__();let n=await this.__pagefind__.search(e,{filters:t});n&&this.__searchID__===s&&(n.filters&&Object.keys(n.filters)?.length&&(this.availableFilters=n.filters,this.totalFilters=n.totalFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})),this.searchResult=n,this.__dispatch__("results",this.searchResult))}async __load__(){if(this.__initializing__){for(;!this.__pagefind__;)await F(50);return}if(this.__initializing__=!0,!this.__pagefind__){let e;try{e=await import(`${this.options.bundlePath}pagefind.js`)}catch(t){console.error(t),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindComposable Instance",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` +`))}await e.options(this.pagefindOptions||{});for(let t of this.options.mergeIndex){if(!t.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let s=t.bundlePath;delete t.bundlePath,await e.mergeIndex(s,t)}this.__pagefind__=e}this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}};window.PagefindModularUI=f;})(); diff --git a/docs/_/pagefind/pagefind-ui.css b/docs/_/pagefind/pagefind-ui.css new file mode 100644 index 00000000..d7984a98 --- /dev/null +++ b/docs/_/pagefind/pagefind-ui.css @@ -0,0 +1 @@ +.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"\2937 ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;appearance:revert}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable="true"]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)} diff --git a/docs/_/pagefind/pagefind-ui.js b/docs/_/pagefind/pagefind-ui.js new file mode 100644 index 00000000..e964ecaf --- /dev/null +++ b/docs/_/pagefind/pagefind-ui.js @@ -0,0 +1,2 @@ +(()=>{var is=Object.defineProperty;var v=(n,e)=>{for(var t in e)is(n,t,{get:e[t],enumerable:!0})};function j(){}function lt(n){return n()}function Qt(){return Object.create(null)}function V(n){n.forEach(lt)}function Ye(n){return typeof n=="function"}function G(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var Ke;function le(n,e){return Ke||(Ke=document.createElement("a")),Ke.href=e,n===Ke.href}function xt(n){return Object.keys(n).length===0}var $t=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,fe=class{constructor(e){this.options=e,this._listeners="WeakMap"in $t?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var s;for(let r of t)fe.entries.set(r.target,r),(s=this._listeners.get(r.target))===null||s===void 0||s(r)})}};fe.entries="WeakMap"in $t?new WeakMap:void 0;var en=!1;function as(){en=!0}function os(){en=!1}function b(n,e){n.appendChild(e)}function y(n,e,t){n.insertBefore(e,t||null)}function C(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;tn.removeEventListener(e,t,s)}function p(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function cs(n){return Array.from(n.childNodes)}function N(n,e){e=""+e,n.data!==e&&(n.data=e)}function it(n,e){n.value=e??""}function W(n,e,t){n.classList[t?"add":"remove"](e)}var Xe=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,s=null){this.e||(this.is_svg?this.e=us(t.nodeName):this.e=k(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(s)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;tn.indexOf(s)===-1?e.push(s):t.push(s)),t.forEach(s=>s()),se=e}var Je=new Set,ee;function ie(){ee={r:0,c:[],p:ee}}function ae(){ee.r||V(ee.c),ee=ee.p}function z(n,e){n&&n.i&&(Je.delete(n),n.i(e))}function I(n,e,t,s){if(n&&n.o){if(Je.has(n))return;Je.add(n),ee.c.push(()=>{Je.delete(n),s&&(t&&n.d(1),s())}),n.o(e)}else s&&s()}function rn(n,e){I(n,1,1,()=>{e.delete(n.key)})}function ln(n,e,t,s,r,l,i,a,o,h,_,f){let c=n.length,E=l.length,u=c,m={};for(;u--;)m[n[u].key]=u;let d=[],R=new Map,T=new Map,S=[];for(u=E;u--;){let F=f(r,l,u),U=t(F),P=i.get(U);P?s&&S.push(()=>P.p(F,e)):(P=h(U,F),P.c()),R.set(U,d[u]=P),U in m&&T.set(U,Math.abs(u-m[U]))}let w=new Set,B=new Set;function X(F){z(F,1),F.m(a,_),i.set(F.key,F),_=F.first,E--}for(;c&&E;){let F=d[E-1],U=n[c-1],P=F.key,Z=U.key;F===U?(_=F.first,c--,E--):R.has(Z)?!i.has(P)||w.has(P)?X(F):B.has(Z)?c--:T.get(P)>T.get(Z)?(B.add(P),X(F)):(w.add(Z),c--):(o(U,i),c--)}for(;c--;){let F=n[c];R.has(F.key)||o(F,i)}for(;E;)X(d[E-1]);return V(S),d}var ms=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Fi=new Set([...ms]);function an(n,e,t){let s=n.$$.props[e];s!==void 0&&(n.$$.bound[s]=t,t(n.$$.ctx[s]))}function Ze(n){n&&n.c()}function he(n,e,t,s){let{fragment:r,after_update:l}=n.$$;r&&r.m(e,t),s||rt(()=>{let i=n.$$.on_mount.map(lt).filter(Ye);n.$$.on_destroy?n.$$.on_destroy.push(...i):V(i),n.$$.on_mount=[]}),l.forEach(rt)}function oe(n,e){let t=n.$$;t.fragment!==null&&(hs(t.after_update),V(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function ps(n,e){n.$$.dirty[0]===-1&&(ne.push(n),fs(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{let u=E.length?E[0]:c;return h.ctx&&r(h.ctx[f],h.ctx[f]=u)&&(!h.skip_bound&&h.bound[f]&&h.bound[f](u),_&&ps(n,f)),c}):[],h.update(),_=!0,V(h.before_update),h.fragment=s?s(h.ctx):!1,e.target){if(e.hydrate){as();let f=cs(e.target);h.fragment&&h.fragment.l(f),f.forEach(C)}else h.fragment&&h.fragment.c();e.intro&&z(n.$$.fragment),he(n,e.target,e.anchor,e.customElement),os(),sn()}_e(o)}var gs;typeof HTMLElement=="function"&&(gs=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:n}=this.$$;this.$$.on_disconnect=n.map(lt).filter(Ye);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(n,e,t){this[n]=t}disconnectedCallback(){V(this.$$.on_disconnect)}$destroy(){oe(this,1),this.$destroy=j}$on(n,e){if(!Ye(e))return j;let t=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return t.push(e),()=>{let s=t.indexOf(e);s!==-1&&t.splice(s,1)}}$set(n){this.$$set&&!xt(n)&&(this.$$.skip_bound=!0,this.$$set(n),this.$$.skip_bound=!1)}});var q=class{$destroy(){oe(this,1),this.$destroy=j}$on(e,t){if(!Ye(t))return j;let s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(t),()=>{let r=s.indexOf(t);r!==-1&&s.splice(r,1)}}$set(e){this.$$set&&!xt(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function D(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=97&&e<=122||e>=65&&e<=90}function $(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=48&&e<=57}function Y(n){return D(n)||$(n)}var on=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"];var ut={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"};var Es={}.hasOwnProperty;function Qe(n,e={}){let t=un(),s=String(n),r=s.toLowerCase(),l=0;if(n==null)throw new Error("Expected string, got `"+n+"`");if(Es.call(ut,r)){let a=ut[r];return(e.normalize===void 0||e.normalize===null||e.normalize)&&typeof a=="string"?Qe(a):(t[on.includes(r)?"regular":"irregular"]=s,t)}for(;D(r.charCodeAt(l))&&l<9;)l++;if(l>1&&l<9){if(t.language=s.slice(0,l),l<4){let a=0;for(;r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&!D(r.charCodeAt(l+4));){if(a>2)return i(l,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(s.slice(l+1,l+4)),l+=4,a++}}for(r.charCodeAt(l)===45&&D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&D(r.charCodeAt(l+3))&&D(r.charCodeAt(l+4))&&!D(r.charCodeAt(l+5))&&(t.script=s.slice(l+1,l+5),l+=5),r.charCodeAt(l)===45&&(D(r.charCodeAt(l+1))&&D(r.charCodeAt(l+2))&&!D(r.charCodeAt(l+3))?(t.region=s.slice(l+1,l+3),l+=3):$(r.charCodeAt(l+1))&&$(r.charCodeAt(l+2))&&$(r.charCodeAt(l+3))&&!$(r.charCodeAt(l+4))&&(t.region=s.slice(l+1,l+4),l+=4));r.charCodeAt(l)===45;){let a=l+1,o=a;for(;Y(r.charCodeAt(o));){if(o-a>7)return i(o,1,"Too long variant, expected at most 8 characters");o++}if(o-a>4||o-a>3&&$(r.charCodeAt(a)))t.variants.push(s.slice(a,o)),l=o;else break}for(;r.charCodeAt(l)===45&&!(r.charCodeAt(l+1)===120||!Y(r.charCodeAt(l+1))||r.charCodeAt(l+2)!==45||!Y(r.charCodeAt(l+3)));){let a=l+2,o=0;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1))&&Y(r.charCodeAt(a+2));){let h=a+1;for(a=h+2,o++;Y(r.charCodeAt(a));){if(a-h>7)return i(a,2,"Too long extension, expected at most 8 characters");a++}}if(!o)return i(a,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:s.charAt(l+1),extensions:s.slice(l+3,a).split("-")}),l=a}}else l=0;if(l===0&&r.charCodeAt(l)===120||r.charCodeAt(l)===45&&r.charCodeAt(l+1)===120){l=l?l+2:1;let a=l;for(;r.charCodeAt(a)===45&&Y(r.charCodeAt(a+1));){let o=l+1;for(a=o;Y(r.charCodeAt(a));){if(a-o>7)return i(a,5,"Too long private-use area, expected at most 8 characters");a++}t.privateuse.push(s.slice(l+1,a)),l=a}}if(l!==s.length)return i(l,6,"Found superfluous content after tag");return t;function i(a,o,h){return e.warning&&e.warning(h,o,a),e.forgiving?t:un()}}function un(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function cn(n,e,t){let s=n.slice();return s[8]=e[t][0],s[9]=e[t][1],s}function bs(n){let e,t,s,r,l,i=n[0]&&_n(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[3](30)}`,r=M(),l=k("p"),l.textContent=`${n[3](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=_n(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function Rs(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_=n[1].excerpt+"",f,c=n[0]&&fn(n),E=n[2].length&&hn(n);return{c(){c&&c.c(),e=M(),t=k("div"),s=k("p"),r=k("a"),i=A(l),o=M(),h=k("p"),f=M(),E&&E.c(),p(r,"class","pagefind-ui__result-link svelte-j9e30"),p(r,"href",a=n[1].meta?.url||n[1].url),p(s,"class","pagefind-ui__result-title svelte-j9e30"),p(h,"class","pagefind-ui__result-excerpt svelte-j9e30"),p(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(u,m){c&&c.m(u,m),y(u,e,m),y(u,t,m),b(t,s),b(s,r),b(r,i),b(t,o),b(t,h),h.innerHTML=_,b(t,f),E&&E.m(t,null)},p(u,m){u[0]?c?c.p(u,m):(c=fn(u),c.c(),c.m(e.parentNode,e)):c&&(c.d(1),c=null),m&2&&l!==(l=u[1].meta?.title+"")&&N(i,l),m&2&&a!==(a=u[1].meta?.url||u[1].url)&&p(r,"href",a),m&2&&_!==(_=u[1].excerpt+"")&&(h.innerHTML=_),u[2].length?E?E.p(u,m):(E=hn(u),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(u){c&&c.d(u),u&&C(e),u&&C(t),E&&E.d()}}}function _n(n){let e;return{c(){e=k("div"),p(e,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,s){y(t,e,s)},d(t){t&&C(e)}}}function fn(n){let e,t=n[1].meta.image&&dn(n);return{c(){e=k("div"),t&&t.c(),p(e,"class","pagefind-ui__result-thumb svelte-j9e30")},m(s,r){y(s,e,r),t&&t.m(e,null)},p(s,r){s[1].meta.image?t?t.p(s,r):(t=dn(s),t.c(),t.m(e,null)):t&&(t.d(1),t=null)},d(s){s&&C(e),t&&t.d()}}}function dn(n){let e,t,s;return{c(){e=k("img"),p(e,"class","pagefind-ui__result-image svelte-j9e30"),le(e.src,t=n[1].meta?.image)||p(e,"src",t),p(e,"alt",s=n[1].meta?.image_alt||n[1].meta?.title)},m(r,l){y(r,e,l)},p(r,l){l&2&&!le(e.src,t=r[1].meta?.image)&&p(e,"src",t),l&2&&s!==(s=r[1].meta?.image_alt||r[1].meta?.title)&&p(e,"alt",s)},d(r){r&&C(e)}}}function hn(n){let e,t=n[2],s=[];for(let r=0;rn.toLocaleUpperCase();function ks(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=async f=>{t(1,a=await f.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([c])=>!i.includes(c)))},_=(f=30)=>". ".repeat(Math.floor(10+Math.random()*f));return n.$$set=f=>{"show_images"in f&&t(0,s=f.show_images),"process_result"in f&&t(4,r=f.process_result),"result"in f&&t(5,l=f.result)},n.$$.update=()=>{if(n.$$.dirty&32)e:h(l)},[s,a,o,_,r,l]}var ct=class extends q{constructor(e){super(),J(this,e,ks,Ts,G,{show_images:0,process_result:4,result:5})}},gn=ct;function En(n,e,t){let s=n.slice();return s[11]=e[t][0],s[12]=e[t][1],s}function bn(n,e,t){let s=n.slice();return s[15]=e[t],s}function Cs(n){let e,t,s,r,l,i=n[0]&&Rn(n);return{c(){i&&i.c(),e=M(),t=k("div"),s=k("p"),s.textContent=`${n[5](30)}`,r=M(),l=k("p"),l.textContent=`${n[5](40)}`,p(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),p(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),p(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(a,o){i&&i.m(a,o),y(a,e,o),y(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=Rn(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&C(e),a&&C(t)}}}function ys(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,_,f=n[0]&&Tn(n),c=n[4]&&Cn(n),E=n[3],u=[];for(let d=0;dn.toLocaleUpperCase();function vs(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=[],_=!1,f=(u,m)=>{if(u.length<=m)return u;let d=[...u].sort((R,T)=>T.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return u.filter(R=>d.includes(R.url))},c=async u=>{t(1,a=await u.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([m])=>!i.includes(m))),Array.isArray(a.sub_results)&&(t(4,_=a.sub_results?.[0]?.url===(a.meta?.url||a.url)),_?t(3,h=f(a.sub_results.slice(1),3)):t(3,h=f([...a.sub_results],3)))},E=(u=30)=>". ".repeat(Math.floor(10+Math.random()*u));return n.$$set=u=>{"show_images"in u&&t(0,s=u.show_images),"process_result"in u&&t(6,r=u.process_result),"result"in u&&t(7,l=u.result)},n.$$.update=()=>{if(n.$$.dirty&128)e:c(l)},[s,a,o,h,_,E,r,l]}var _t=class extends q{constructor(e){super(),J(this,e,vs,Ss,G,{show_images:0,process_result:6,result:7})}},An=_t;function wn(n,e,t){let s=n.slice();return s[9]=e[t][0],s[10]=e[t][1],s[11]=e,s[12]=t,s}function Fn(n,e,t){let s=n.slice();return s[13]=e[t][0],s[14]=e[t][1],s[15]=e,s[16]=t,s}function Hn(n){let e,t,s=n[3]("filters_label",n[4],n[5])+"",r,l,i=Object.entries(n[1]),a=[];for(let o=0;on.toLocaleUpperCase();function As(n,e,t){let{available_filters:s=null}=e,{show_empty_filters:r=!0}=e,{translate:l=()=>""}=e,{automatic_translations:i={}}=e,{translations:a={}}=e,o={},h=!1,_=!1;function f(c,E){o[`${c}:${E}`]=this.checked,t(0,o)}return n.$$set=c=>{"available_filters"in c&&t(1,s=c.available_filters),"show_empty_filters"in c&&t(2,r=c.show_empty_filters),"translate"in c&&t(3,l=c.translate),"automatic_translations"in c&&t(4,i=c.automatic_translations),"translations"in c&&t(5,a=c.translations)},n.$$.update=()=>{if(n.$$.dirty&130){e:if(s&&!h){t(7,h=!0);let c=Object.entries(s||{});c.length===1&&Object.entries(c[0][1])?.length<=6&&t(6,_=!0)}}},[o,s,r,l,i,a,_,h,f]}var ft=class extends q{constructor(e){super(),J(this,e,As,Ms,G,{available_filters:1,show_empty_filters:2,translate:3,automatic_translations:4,translations:5,selected_filters:0})}get selected_filters(){return this.$$.ctx[0]}},Dn=ft;var dt={};v(dt,{comments:()=>Fs,default:()=>Os,direction:()=>Hs,strings:()=>Ns,thanks_to:()=>ws});var ws="Jan Claasen ",Fs="",Hs="ltr",Ns={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},Os={thanks_to:ws,comments:Fs,direction:Hs,strings:Ns};var ht={};v(ht,{comments:()=>zs,default:()=>Is,direction:()=>Ds,strings:()=>Us,thanks_to:()=>js});var js="Maruf Alom ",zs="",Ds="ltr",Us={placeholder:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",clear_search:"\u09AE\u09C1\u099B\u09C7 \u09AB\u09C7\u09B2\u09C1\u09A8",load_more:"\u0986\u09B0\u09CB \u09AB\u09B2\u09BE\u09AB\u09B2 \u09A6\u09C7\u0996\u09C1\u09A8",search_label:"\u098F\u0987 \u0993\u09DF\u09C7\u09AC\u09B8\u09BE\u0987\u099F\u09C7 \u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",filters_label:"\u09AB\u09BF\u09B2\u09CD\u099F\u09BE\u09B0",zero_results:"[SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF",many_results:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",one_result:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",alt_search:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF. \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09C7 [DIFFERENT_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u09A6\u09C7\u0996\u09BE\u09A8\u09CB \u09B9\u099A\u09CD\u099B\u09C7",search_suggestion:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u09AC\u09BF\u09B7\u09DF\u09C7. \u09A8\u09BF\u09A8\u09CD\u09AE\u09C7\u09B0 \u09AC\u09BF\u09B7\u09DF\u09AC\u09B8\u09CD\u09A4\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09A6\u09C7\u0996\u09C1\u09A8:",searching:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u099A\u09B2\u099B\u09C7 [SEARCH_TERM]..."},Is={thanks_to:js,comments:zs,direction:Ds,strings:Us};var mt={};v(mt,{comments:()=>Ls,default:()=>Ws,direction:()=>qs,strings:()=>Bs,thanks_to:()=>Ps});var Ps="Pablo Villaverde ",Ls="",qs="ltr",Bs={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure m\xE9es resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques seg\xFCents:",searching:"Cercant [SEARCH_TERM]..."},Ws={thanks_to:Ps,comments:Ls,direction:qs,strings:Bs};var pt={};v(pt,{comments:()=>Gs,default:()=>Ys,direction:()=>Ks,strings:()=>Js,thanks_to:()=>Vs});var Vs="Jonas Smedegaard ",Gs="",Ks="ltr",Js={placeholder:"S\xF8g",clear_search:"Nulstil",load_more:"Indl\xE6s flere resultater",search_label:"S\xF8g p\xE5 dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v et af disse s\xF8geord i stedet:",searching:"S\xF8ger efter [SEARCH_TERM]..."},Ys={thanks_to:Vs,comments:Gs,direction:Ks,strings:Js};var gt={};v(gt,{comments:()=>Zs,default:()=>$s,direction:()=>Qs,strings:()=>xs,thanks_to:()=>Xs});var Xs="Jan Claasen ",Zs="",Qs="ltr",xs={placeholder:"Suche",clear_search:"L\xF6schen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse f\xFCr [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse f\xFCr [SEARCH_TERM]",one_result:"[COUNT] Ergebnis f\xFCr [SEARCH_TERM]",alt_search:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Stattdessen werden Ergebnisse f\xFCr [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche f\xFCr [SEARCH_TERM]"},$s={thanks_to:Xs,comments:Zs,direction:Qs,strings:xs};var Et={};v(Et,{comments:()=>tr,default:()=>rr,direction:()=>nr,strings:()=>sr,thanks_to:()=>er});var er="Liam Bigelow ",tr="",nr="ltr",sr={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},rr={thanks_to:er,comments:tr,direction:nr,strings:sr};var bt={};v(bt,{comments:()=>ir,default:()=>ur,direction:()=>ar,strings:()=>or,thanks_to:()=>lr});var lr="Pablo Villaverde ",ir="",ar="ltr",or={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver m\xE1s resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes b\xFAsquedas:",searching:"Buscando [SEARCH_TERM]..."},ur={thanks_to:lr,comments:ir,direction:ar,strings:or};var Rt={};v(Rt,{comments:()=>_r,default:()=>hr,direction:()=>fr,strings:()=>dr,thanks_to:()=>cr});var cr="Valtteri Laitinen ",_r="",fr="ltr",dr={placeholder:"Haku",clear_search:"Tyhjenn\xE4",load_more:"Lataa lis\xE4\xE4 tuloksia",search_label:"Hae t\xE4lt\xE4 sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. N\xE4ytet\xE4\xE4n tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},hr={thanks_to:cr,comments:_r,direction:fr,strings:dr};var Tt={};v(Tt,{comments:()=>pr,default:()=>br,direction:()=>gr,strings:()=>Er,thanks_to:()=>mr});var mr="Nicolas Friedli ",pr="",gr="ltr",Er={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de r\xE9sultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de r\xE9sultat pour [SEARCH_TERM]",many_results:"[COUNT] r\xE9sultats pour [SEARCH_TERM]",one_result:"[COUNT] r\xE9sultat pour [SEARCH_TERM]",alt_search:"Pas de r\xE9sultat pour [SEARCH_TERM]. Montre les r\xE9sultats pour [DIFFERENT_TERM] \xE0 la place",search_suggestion:"Pas de r\xE9sultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},br={thanks_to:mr,comments:pr,direction:gr,strings:Er};var kt={};v(kt,{comments:()=>Tr,default:()=>yr,direction:()=>kr,strings:()=>Cr,thanks_to:()=>Rr});var Rr="Pablo Villaverde ",Tr="",kr="ltr",Cr={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver m\xE1is resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},yr={thanks_to:Rr,comments:Tr,direction:kr,strings:Cr};var Ct={};v(Ct,{comments:()=>vr,default:()=>wr,direction:()=>Mr,strings:()=>Ar,thanks_to:()=>Sr});var Sr="Amit Yadav ",vr="",Mr="ltr",Ar={placeholder:"\u0916\u094B\u091C\u0947\u0902",clear_search:"\u0938\u093E\u092B \u0915\u0930\u0947\u0902",load_more:"\u0914\u0930 \u0905\u0927\u093F\u0915 \u092A\u0930\u093F\u0923\u093E\u092E \u0932\u094B\u0921 \u0915\u0930\u0947\u0902",search_label:"\u0907\u0938 \u0938\u093E\u0907\u091F \u092E\u0947\u0902 \u0916\u094B\u091C\u0947\u0902",filters_label:"\u092B\u093C\u093F\u0932\u094D\u091F\u0930",zero_results:"\u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",many_results:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u0947",one_result:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u093E",alt_search:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0907\u0938\u0915\u0947 \u092C\u091C\u093E\u092F [DIFFERENT_TERM] \u0915\u0947 \u0932\u093F\u090F \u092A\u0930\u093F\u0923\u093E\u092E \u0926\u093F\u0916\u093E \u0930\u0939\u093E \u0939\u0948",search_suggestion:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0928\u093F\u092E\u094D\u0928\u0932\u093F\u0916\u093F\u0924 \u0916\u094B\u091C\u094B\u0902 \u092E\u0947\u0902 \u0938\u0947 \u0915\u094B\u0908 \u090F\u0915 \u0906\u091C\u093C\u092E\u093E\u090F\u0902:",searching:"[SEARCH_TERM] \u0915\u0940 \u0916\u094B\u091C \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948..."},wr={thanks_to:Sr,comments:vr,direction:Mr,strings:Ar};var yt={};v(yt,{comments:()=>Hr,default:()=>jr,direction:()=>Nr,strings:()=>Or,thanks_to:()=>Fr});var Fr="Diomed ",Hr="",Nr="ltr",Or={placeholder:"Tra\u017Ei",clear_search:"O\u010Disti",load_more:"U\u010Ditaj vi\u0161e rezultata",search_label:"Pretra\u017Ei ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Poku\u0161aj s jednom od ovih pretraga:",searching:"Pretra\u017Eujem [SEARCH_TERM]..."},jr={thanks_to:Fr,comments:Hr,direction:Nr,strings:Or};var St={};v(St,{comments:()=>Dr,default:()=>Pr,direction:()=>Ur,strings:()=>Ir,thanks_to:()=>zr});var zr="Adam Laki ",Dr="",Ur="ltr",Ir={placeholder:"Keres\xE9s",clear_search:"T\xF6rl\xE9s",load_more:"Tov\xE1bbi tal\xE1latok bet\xF6lt\xE9se",search_label:"Keres\xE9s az oldalon",filters_label:"Sz\u0171r\xE9s",zero_results:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",many_results:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",one_result:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",alt_search:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Tal\xE1latok mutat\xE1sa ink\xE1bb a(z) [DIFFERENT_TERM] kifejez\xE9sre",search_suggestion:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Pr\xF3b\xE1ld meg a k\xF6vetkez\u0151 keres\xE9sek egyik\xE9t:",searching:"Keres\xE9s a(z) [SEARCH_TERM] kifejez\xE9sre..."},Pr={thanks_to:zr,comments:Dr,direction:Ur,strings:Ir};var vt={};v(vt,{comments:()=>qr,default:()=>Vr,direction:()=>Br,strings:()=>Wr,thanks_to:()=>Lr});var Lr="Nixentric",qr="",Br="ltr",Wr={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},Vr={thanks_to:Lr,comments:qr,direction:Br,strings:Wr};var Mt={};v(Mt,{comments:()=>Kr,default:()=>Xr,direction:()=>Jr,strings:()=>Yr,thanks_to:()=>Gr});var Gr="Cosette Bruhns Alonso, Andrew Janco ",Kr="",Jr="ltr",Yr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra pi\xF9 risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},Xr={thanks_to:Gr,comments:Kr,direction:Jr,strings:Yr};var At={};v(At,{comments:()=>Qr,default:()=>el,direction:()=>xr,strings:()=>$r,thanks_to:()=>Zr});var Zr="Tate",Qr="",xr="ltr",$r={placeholder:"\u691C\u7D22",clear_search:"\u6D88\u3059",load_more:"\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080",search_label:"\u3053\u306E\u30B5\u30A4\u30C8\u3092\u691C\u7D22",filters_label:"\u30D5\u30A3\u30EB\u30BF",zero_results:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F",many_results:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",one_result:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",alt_search:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002[DIFFERENT_TERM]\u306E\u691C\u7D22\u7D50\u679C\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059",search_suggestion:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u4EF6\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u691C\u7D22\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044",searching:"[SEARCH_TERM]\u3092\u691C\u7D22\u3057\u3066\u3044\u307E\u3059"},el={thanks_to:Zr,comments:Qr,direction:xr,strings:$r};var wt={};v(wt,{comments:()=>nl,default:()=>ll,direction:()=>sl,strings:()=>rl,thanks_to:()=>tl});var tl="",nl="",sl="ltr",rl={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta \u0113tahi otinga k\u0113",search_label:"Rapu",filters_label:"T\u0101tari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga k\u0113 ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakam\u0101tau ki ng\u0101 mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},ll={thanks_to:tl,comments:nl,direction:sl,strings:rl};var Ft={};v(Ft,{comments:()=>al,default:()=>cl,direction:()=>ol,strings:()=>ul,thanks_to:()=>il});var il="Paul van Brouwershaven",al="",ol="ltr",ul={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},cl={thanks_to:il,comments:al,direction:ol,strings:ul};var Ht={};v(Ht,{comments:()=>fl,default:()=>ml,direction:()=>dl,strings:()=>hl,thanks_to:()=>_l});var _l="Christopher Wingate",fl="",dl="ltr",hl={placeholder:"S\xF8k",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"S\xF8k p\xE5 denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v en av disse s\xF8keordene i stedet:",searching:"S\xF8ker etter [SEARCH_TERM]"},ml={thanks_to:_l,comments:fl,direction:dl,strings:hl};var Nt={};v(Nt,{comments:()=>gl,default:()=>Rl,direction:()=>El,strings:()=>bl,thanks_to:()=>pl});var pl="",gl="",El="ltr",bl={placeholder:"Szukaj",clear_search:"Wyczy\u015B\u0107",load_more:"Za\u0142aduj wi\u0119cej",search_label:"Przeszukaj t\u0119 stron\u0119",filters_label:"Filtry",zero_results:"Brak wynik\xF3w dla [SEARCH_TERM]",many_results:"[COUNT] wynik\xF3w dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wynik\xF3w dla [SEARCH_TERM]. Wy\u015Bwietlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wynik\xF3w dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Rl={thanks_to:pl,comments:gl,direction:El,strings:bl};var Ot={};v(Ot,{comments:()=>kl,default:()=>Sl,direction:()=>Cl,strings:()=>yl,thanks_to:()=>Tl});var Tl="Jonatah",kl="",Cl="ltr",yl={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},Sl={thanks_to:Tl,comments:kl,direction:Cl,strings:yl};var jt={};v(jt,{comments:()=>Ml,default:()=>Fl,direction:()=>Al,strings:()=>wl,thanks_to:()=>vl});var vl="Aleksandr Gordeev",Ml="",Al="ltr",wl={placeholder:"\u041F\u043E\u0438\u0441\u043A",clear_search:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u043B\u0435",load_more:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0435\u0449\u0435",search_label:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0441\u0430\u0439\u0442\u0443",filters_label:"\u0424\u0438\u043B\u044C\u0442\u0440\u044B",zero_results:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",alt_search:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u044B \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [DIFFERENT_TERM]",search_suggestion:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0438\u0437 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",searching:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]"},Fl={thanks_to:vl,comments:Ml,direction:Al,strings:wl};var zt={};v(zt,{comments:()=>Nl,default:()=>zl,direction:()=>Ol,strings:()=>jl,thanks_to:()=>Hl});var Hl="Andrija Sagicc",Nl="",Ol="ltr",jl={placeholder:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430",clear_search:"\u0411\u0440\u0438\u0441\u0430\u045A\u0435",load_more:"\u041F\u0440\u0438\u043A\u0430\u0437 \u0432\u0438\u0448\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430",search_label:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0430\u0458\u0442\u0430",filters_label:"\u0424\u0438\u043B\u0442\u0435\u0440\u0438",zero_results:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",alt_search:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u0440\u0438\u043A\u0430\u0437 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043A \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [DIFFERENT_TERM]",search_suggestion:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0441\u0430 \u043D\u0435\u043A\u043E\u043C \u043E\u0434 \u0441\u043B\u0435\u0434\u0435\u045B\u0438\u0445 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430:",searching:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0442\u0435\u0440\u043C\u0438\u043D\u0430 [SEARCH_TERM]..."},zl={thanks_to:Hl,comments:Nl,direction:Ol,strings:jl};var Dt={};v(Dt,{comments:()=>Ul,default:()=>Ll,direction:()=>Il,strings:()=>Pl,thanks_to:()=>Dl});var Dl="Montazar Al-Jaber ",Ul="",Il="ltr",Pl={placeholder:"S\xF6k",clear_search:"Rensa",load_more:"Visa fler tr\xE4ffar",search_label:"S\xF6k p\xE5 denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga tr\xE4ffar",many_results:"[SEARCH_TERM] gav [COUNT] tr\xE4ffar",one_result:"[SEARCH_TERM] gav [COUNT] tr\xE4ff",alt_search:"[SEARCH_TERM] gav inga tr\xE4ffar. Visar resultat f\xF6r [DIFFERENT_TERM] ist\xE4llet",search_suggestion:"[SEARCH_TERM] gav inga tr\xE4ffar. F\xF6rs\xF6k igen med en av f\xF6ljande s\xF6kord:",searching:"S\xF6ker efter [SEARCH_TERM]..."},Ll={thanks_to:Dl,comments:Ul,direction:Il,strings:Pl};var Ut={};v(Ut,{comments:()=>Bl,default:()=>Gl,direction:()=>Wl,strings:()=>Vl,thanks_to:()=>ql});var ql="",Bl="",Wl="ltr",Vl={placeholder:"\u0BA4\u0BC7\u0B9F\u0BC1\u0B95",clear_search:"\u0B85\u0BB4\u0BBF\u0B95\u0BCD\u0B95\u0BC1\u0B95",load_more:"\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95",search_label:"\u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BB3\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B95",filters_label:"\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",zero_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8",many_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 [COUNT] \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD",one_result:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1",alt_search:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD\u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8, \u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B92\u0BA4\u0BCD\u0BA4 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8.\u0B87\u0BA4\u0BB1\u0BCD\u0B95\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC0\u0B9F\u0BBE\u0BA9 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC8 \u0BA4\u0BC7\u0B9F\u0BC1\u0B95:",searching:"[SEARCH_TERM] \u0BA4\u0BC7\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1"},Gl={thanks_to:ql,comments:Bl,direction:Wl,strings:Vl};var It={};v(It,{comments:()=>Jl,default:()=>Zl,direction:()=>Yl,strings:()=>Xl,thanks_to:()=>Kl});var Kl="Taylan \xD6zg\xFCr Bildik",Jl="",Yl="ltr",Xl={placeholder:"Ara\u015Ft\u0131r",clear_search:"Temizle",load_more:"Daha fazla sonu\xE7",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] i\xE7in sonu\xE7 yok",many_results:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",one_result:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",alt_search:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Bunun yerine [DIFFERENT_TERM] i\xE7in sonu\xE7lar g\xF6steriliyor",search_suggestion:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Alternatif olarak a\u015Fa\u011F\u0131daki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] ara\u015Ft\u0131r\u0131l\u0131yor..."},Zl={thanks_to:Kl,comments:Jl,direction:Yl,strings:Xl};var Pt={};v(Pt,{comments:()=>xl,default:()=>ti,direction:()=>$l,strings:()=>ei,thanks_to:()=>Ql});var Ql="Long Nhat Nguyen",xl="",$l="ltr",ei={placeholder:"T\xECm ki\u1EBFm",clear_search:"X\xF3a",load_more:"Nhi\u1EC1u k\u1EBFt qu\u1EA3 h\u01A1n",search_label:"T\xECm ki\u1EBFm trong trang n\xE0y",filters_label:"B\u1ED9 l\u1ECDc",zero_results:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",many_results:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",one_result:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",alt_search:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Ki\u1EC3m th\u1ECB k\u1EBFt qu\u1EA3 thay th\u1EBF v\u1EDBi [DIFFERENT_TERM]",search_suggestion:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Th\u1EED m\u1ED9t trong c\xE1c t\xECm ki\u1EBFm:",searching:"\u0110ang t\xECm ki\u1EBFm cho [SEARCH_TERM]..."},ti={thanks_to:Ql,comments:xl,direction:$l,strings:ei};var Lt={};v(Lt,{comments:()=>si,default:()=>ii,direction:()=>ri,strings:()=>li,thanks_to:()=>ni});var ni="Amber Song",si="",ri="ltr",li={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},ii={thanks_to:ni,comments:si,direction:ri,strings:li};var qt={};v(qt,{comments:()=>oi,default:()=>_i,direction:()=>ui,strings:()=>ci,thanks_to:()=>ai});var ai="Amber Song",oi="",ui="ltr",ci={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F09\u66F4\u591A\u7D50\u679C",search_label:"\u7AD9\u5167\u641C\u7D22",filters_label:"\u7BE9\u9078",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",many_results:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",one_result:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u6539\u70BA\u986F\u793A [DIFFERENT_TERM] \u7684\u76F8\u95DC\u7D50\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u8ACB\u5617\u8A66\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},_i={thanks_to:ai,comments:oi,direction:ui,strings:ci};var Bt={};v(Bt,{comments:()=>di,default:()=>pi,direction:()=>hi,strings:()=>mi,thanks_to:()=>fi});var fi="Amber Song",di="",hi="ltr",mi={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},pi={thanks_to:fi,comments:di,direction:hi,strings:mi};var gi=[dt,ht,mt,pt,gt,Et,bt,Rt,Tt,kt,Ct,yt,St,vt,Mt,At,wt,Ft,Ht,Nt,Ot,jt,zt,Dt,Ut,It,Pt,Lt,qt,Bt],Un=gi,In=["../../translations/af.json","../../translations/bn.json","../../translations/ca.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/ta.json","../../translations/tr.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function Pn(n,e,t){let s=n.slice();return s[48]=e[t],s}function Ln(n){let e,t,s;function r(i){n[34](i)}let l={show_empty_filters:n[4],available_filters:n[16],translate:n[18],automatic_translations:n[17],translations:n[5]};return n[7]!==void 0&&(l.selected_filters=n[7]),e=new Dn({props:l}),re.push(()=>an(e,"selected_filters",r)),{c(){Ze(e.$$.fragment)},m(i,a){he(e,i,a),s=!0},p(i,a){let o={};a[0]&16&&(o.show_empty_filters=i[4]),a[0]&65536&&(o.available_filters=i[16]),a[0]&131072&&(o.automatic_translations=i[17]),a[0]&32&&(o.translations=i[5]),!t&&a[0]&128&&(t=!0,o.selected_filters=i[7],nn(()=>t=!1)),e.$set(o)},i(i){s||(z(e.$$.fragment,i),s=!0)},o(i){I(e.$$.fragment,i),s=!1},d(i){oe(e,i)}}}function qn(n){let e,t,s,r,l=[Ri,bi],i=[];function a(o,h){return o[12]?0:1}return t=a(n,[-1,-1]),s=i[t]=l[t](n),{c(){e=k("div"),s.c(),p(e,"class","pagefind-ui__results-area svelte-e9gkc3")},m(o,h){y(o,e,h),i[t].m(e,null),r=!0},p(o,h){let _=t;t=a(o,h),t===_?i[t].p(o,h):(ie(),I(i[_],1,1,()=>{i[_]=null}),ae(),s=i[t],s?s.p(o,h):(s=i[t]=l[t](o),s.c()),z(s,1),s.m(e,null))},i(o){r||(z(s),r=!0)},o(o){I(s),r=!1},d(o){o&&C(e),i[t].d()}}}function bi(n){let e,t,s,r=[],l=new Map,i,a,o;function h(m,d){return m[11].results.length===0?Ci:m[11].results.length===1?ki:Ti}let _=h(n,[-1,-1]),f=_(n),c=n[11].results.slice(0,n[15]),E=m=>m[48].id;for(let m=0;mn[15]&&Wn(n);return{c(){e=k("p"),f.c(),t=M(),s=k("ol");for(let m=0;mm[15]?u?u.p(m,d):(u=Wn(m),u.c(),u.m(a.parentNode,a)):u&&(u.d(1),u=null)},i(m){if(!o){for(let d=0;d{o[c]=null}),ae(),r=o[s],r?r.p(e,f):(r=o[s]=a[s](e),r.c()),z(r,1),r.m(l.parentNode,l))},i(_){i||(z(r),i=!0)},o(_){I(r),i=!1},d(_){_&&C(t),o[s].d(_),_&&C(l)}}}function Wn(n){let e,t=n[18]("load_more",n[17],n[5])+"",s,r,l;return{c(){e=k("button"),s=A(t),p(e,"type","button"),p(e,"class","pagefind-ui__button svelte-e9gkc3")},m(i,a){y(i,e,a),b(e,s),r||(l=K(e,"click",n[20]),r=!0)},p(i,a){a[0]&131104&&t!==(t=i[18]("load_more",i[17],i[5])+"")&&N(s,t)},d(i){i&&C(e),r=!1,l()}}}function Vn(n){let e,t=n[18]("searching",n[17],n[5]).replace(/\[SEARCH_TERM\]/,n[14])+"",s;return{c(){e=k("p"),s=A(t),p(e,"class","pagefind-ui__message svelte-e9gkc3")},m(r,l){y(r,e,l),b(e,s)},p(r,l){l[0]&147488&&t!==(t=r[18]("searching",r[17],r[5]).replace(/\[SEARCH_TERM\]/,r[14])+"")&&N(s,t)},d(r){r&&C(e)}}}function vi(n){let e,t,s,r,l,i,a=n[18]("clear_search",n[17],n[5])+"",o,h,_,f,c,E,u,m,d=n[10]&&Ln(n),R=n[13]&&qn(n);return{c(){e=k("div"),t=k("form"),s=k("input"),l=M(),i=k("button"),o=A(a),h=M(),_=k("div"),d&&d.c(),f=M(),R&&R.c(),p(s,"class","pagefind-ui__search-input svelte-e9gkc3"),p(s,"type","text"),p(s,"placeholder",r=n[18]("placeholder",n[17],n[5])),p(s,"autocapitalize","none"),p(s,"enterkeyhint","search"),p(i,"class","pagefind-ui__search-clear svelte-e9gkc3"),W(i,"pagefind-ui__suppressed",!n[6]),p(_,"class","pagefind-ui__drawer svelte-e9gkc3"),W(_,"pagefind-ui__hidden",!n[13]),p(t,"class","pagefind-ui__form svelte-e9gkc3"),p(t,"role","search"),p(t,"aria-label",c=n[18]("search_label",n[17],n[5])),p(t,"action","javascript:void(0);"),p(e,"class","pagefind-ui svelte-e9gkc3"),W(e,"pagefind-ui--reset",n[0])},m(T,S){y(T,e,S),b(e,t),b(t,s),it(s,n[6]),n[31](s),b(t,l),b(t,i),b(i,o),n[32](i),b(t,h),b(t,_),d&&d.m(_,null),b(_,f),R&&R.m(_,null),E=!0,u||(m=[K(s,"focus",n[19]),K(s,"keydown",n[29]),K(s,"input",n[30]),K(i,"click",n[33]),K(t,"submit",Mi)],u=!0)},p(T,S){(!E||S[0]&131104&&r!==(r=T[18]("placeholder",T[17],T[5])))&&p(s,"placeholder",r),S[0]&64&&s.value!==T[6]&&it(s,T[6]),(!E||S[0]&131104)&&a!==(a=T[18]("clear_search",T[17],T[5])+"")&&N(o,a),(!E||S[0]&64)&&W(i,"pagefind-ui__suppressed",!T[6]),T[10]?d?(d.p(T,S),S[0]&1024&&z(d,1)):(d=Ln(T),d.c(),z(d,1),d.m(_,f)):d&&(ie(),I(d,1,1,()=>{d=null}),ae()),T[13]?R?(R.p(T,S),S[0]&8192&&z(R,1)):(R=qn(T),R.c(),z(R,1),R.m(_,null)):R&&(ie(),I(R,1,1,()=>{R=null}),ae()),(!E||S[0]&8192)&&W(_,"pagefind-ui__hidden",!T[13]),(!E||S[0]&131104&&c!==(c=T[18]("search_label",T[17],T[5])))&&p(t,"aria-label",c),(!E||S[0]&1)&&W(e,"pagefind-ui--reset",T[0])},i(T){E||(z(d),z(R),E=!0)},o(T){I(d),I(R),E=!1},d(T){T&&C(e),n[31](null),n[32](null),d&&d.d(),R&&R.d(),u=!1,V(m)}}}var Mi=n=>n.preventDefault();function Ai(n,e,t){let s={},r=In.map(g=>g.match(/([^\/]+)\.json$/)[1]);for(let g=0;gO[g]??H[g]??"";at(()=>{let g=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Qe(g.toLocaleLowerCase());t(17,Yt=s[`${H.language}-${H.script}-${H.region}`]||s[`${H.language}-${H.region}`]||s[`${H.language}`]||s.en)}),ot(()=>{w?.destroy?.(),w=null});let Xt=async()=>{if(!U&&(t(10,U=!0),!w)){let g;try{g=await import(`${l}pagefind.js`)}catch(O){console.error(O),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI",`[DEBUG: Loaded from ${document?.currentScript?.src??"no known script location"}]`].join(` +`))}_||t(22,_=h?12:30);let H={...m||{},excerptLength:_};await g.options(H);for(let O of d){if(!O.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=O.bundlePath;delete O.bundlePath,await g.mergeIndex(L,O)}w=g,Jn()}},Jn=async()=>{w&&(Jt=await w.filters(),(!ue||!Object.keys(ue).length)&&t(16,ue=Jt))},Yn=g=>{let H={};return Object.entries(g).filter(([,O])=>O).forEach(([O])=>{let[L,ls]=O.split(/:(.*)$/);H[L]=H[L]||[],H[L].push(ls)}),H},ce,Xn=async(g,H)=>{if(!g){t(13,$e=!1),ce&&clearTimeout(ce);return}let O=Yn(H),L=()=>Zn(g,O);u>0&&g?(ce&&clearTimeout(ce),ce=setTimeout(L,u),await Zt(),w.preload(g,{filters:O})):L(),Qn()},Zt=async()=>{for(;!w;)Xt(),await new Promise(g=>setTimeout(g,50))},Zn=async(g,H)=>{t(14,Kt=g||""),typeof c=="function"&&(g=c(g)),t(12,Z=!0),t(13,$e=!0),await Zt();let O=++Gt,L=await w.search(g,{filters:H});Gt===O&&(L.filters&&Object.keys(L.filters)?.length&&t(16,ue=L.filters),t(11,P=L),t(12,Z=!1),t(15,et=i))},Qn=()=>{let g=X.offsetWidth;g!=F&&t(8,B.style.paddingRight=`${g+2}px`,B)},xn=g=>{g?.preventDefault(),t(15,et+=i)},$n=g=>{g.key==="Escape"&&(t(6,S=""),B.blur()),g.key==="Enter"&&g.preventDefault()};function es(){S=this.value,t(6,S),t(21,R)}function ts(g){re[g?"unshift":"push"](()=>{B=g,t(8,B)})}function ns(g){re[g?"unshift":"push"](()=>{X=g,t(9,X)})}let ss=()=>{t(6,S=""),B.blur()};function rs(g){Ge=g,t(7,Ge)}return n.$$set=g=>{"base_path"in g&&t(23,l=g.base_path),"page_size"in g&&t(24,i=g.page_size),"reset_styles"in g&&t(0,a=g.reset_styles),"show_images"in g&&t(1,o=g.show_images),"show_sub_results"in g&&t(2,h=g.show_sub_results),"excerpt_length"in g&&t(22,_=g.excerpt_length),"process_result"in g&&t(3,f=g.process_result),"process_term"in g&&t(25,c=g.process_term),"show_empty_filters"in g&&t(4,E=g.show_empty_filters),"debounce_timeout_ms"in g&&t(26,u=g.debounce_timeout_ms),"pagefind_options"in g&&t(27,m=g.pagefind_options),"merge_index"in g&&t(28,d=g.merge_index),"trigger_search_term"in g&&t(21,R=g.trigger_search_term),"translations"in g&&t(5,T=g.translations)},n.$$.update=()=>{if(n.$$.dirty[0]&2097152)e:R&&(t(6,S=R),t(21,R=""));if(n.$$.dirty[0]&192)e:Xn(S,Ge)},[a,o,h,f,E,T,S,Ge,B,X,U,P,Z,$e,Kt,et,ue,Yt,Kn,Xt,xn,R,_,l,i,c,u,m,d,$n,es,ts,ns,ss,rs]}var Wt=class extends q{constructor(e){super(),J(this,e,Ai,vi,G,{base_path:23,page_size:24,reset_styles:0,show_images:1,show_sub_results:2,excerpt_length:22,process_result:3,process_term:25,show_empty_filters:4,debounce_timeout_ms:26,pagefind_options:27,merge_index:28,trigger_search_term:21,translations:5},null,[-1,-1])}},Gn=Wt;var Vt;try{Vt=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1]}catch{Vt="/pagefind/"}var xe=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",s=e.bundlePath??Vt,r=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,h=e.processResult??null,_=e.processTerm??null,f=e.showEmptyFilters??!0,c=e.debounceTimeoutMs??300,E=e.mergeIndex??[],u=e.translations??[];delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations;let m=t instanceof HTMLElement?t:document.querySelector(t);m?this._pfs=new Gn({target:m,props:{base_path:s,page_size:r,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:h,process_term:_,show_empty_filters:f,debounce_timeout_ms:c,merge_index:E,translations:u,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}destroy(){this._pfs.$destroy()}};window.PagefindUI=xe;})(); diff --git a/docs/_/pagefind/pagefind.js b/docs/_/pagefind/pagefind.js new file mode 100644 index 00000000..94ab9237 --- /dev/null +++ b/docs/_/pagefind/pagefind.js @@ -0,0 +1,9 @@ +const pagefind_version="1.0.4";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document==='undefined'){script_src=location.href}else{script_src=new URL("UNHANDLED",location.href).toString()}let wasm;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}let WASM_VECTOR_LEN=0;function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1);getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret};const cachedTextEncoder=new TextEncoder('utf-8');const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length);getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len);const mem=getUint8Memory0();let offset=0;for(;offset0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3);const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written}WASM_VECTOR_LEN=offset;return ptr}__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=new TextDecoder('utf-8',{ignoreBOM:true,fatal:true});cachedTextDecoder.decode();function getStringFromWasm0(ptr,len){return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_indexes=function(ptr,query){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_filter_indexes=function(ptr,filters){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.request_all_filter_indexes=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.filters=function(ptr){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};__exports.search=function(ptr,query,filter,sort,exact){try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ptr1=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len1=WASM_VECTOR_LEN;const ptr2=passStringToWasm0(sort,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len2=WASM_VECTOR_LEN;wasm.search(retptr,ptr,ptr0,len0,ptr1,len1,ptr2,len2,exact);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(r0,r1)}};async function load(module,imports){if(typeof Response==='function'&&module instanceof Response){if(typeof WebAssembly.instantiateStreaming==='function'){try{return await WebAssembly.instantiateStreaming(module,imports)}catch(e){if(module.headers.get('Content-Type')!='application/wasm'){console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}else{throw e}}}const bytes=await module.arrayBuffer();return await WebAssembly.instantiate(bytes,imports)}else{const instance=await WebAssembly.instantiate(module,imports);if(instance instanceof WebAssembly.Instance){return{instance,module}}else{return instance}}}function getImports(){const imports={};imports.wbg={};return imports}function initMemory(imports,maybe_memory){}function finalizeInit(instance,module){wasm=instance.exports;init.__wbindgen_wasm_module=module;cachedInt32Memory0=null;cachedUint8Memory0=null;return wasm}function initSync(module){const imports=getImports();initMemory(imports);if(!(module instanceof WebAssembly.Module)){module=new WebAssembly.Module(module)}const instance=new WebAssembly.Instance(module,imports);return finalizeInit(instance,module)}async function init(input){if(typeof input==='undefined'){input=script_src.replace(/\.js$/,'_bg.wasm')}const imports=getImports();if(typeof input==='string'||(typeof Request==='function'&&input instanceof Request)||(typeof URL==='function'&&input instanceof URL)){input=fetch(input)}initMemory(imports);const{instance,module}=await load(await input,imports);return finalizeInit(instance,module)}wasm_bindgen=Object.assign(init,{initSync},__exports)})();var u8=Uint8Array;var u16=Uint16Array;var u32=Uint32Array;var fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]);var fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);var clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var freb=function(eb,start){var b=new u16(31);for(var i2=0;i2<31;++i2){b[i2]=start+=1<>>1|(i&21845)<<1;x=(x&52428)>>>2|(x&13107)<<2;x=(x&61680)>>>4|(x&3855)<<4;rev[i]=((x&65280)>>>8|(x&255)<<8)>>>1}var x;var i;var hMap=function(cd,mb,r){var s=cd.length;var i2=0;var l=new u16(mb);for(;i2>>rvb]=sv}}}}else{co=new u16(s);for(i2=0;i2>>15-cd[i2]}}}return co};var flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;var i;for(i=144;i<256;++i)flt[i]=9;var i;for(i=256;i<280;++i)flt[i]=7;var i;for(i=280;i<288;++i)flt[i]=8;var i;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var i;var flrm=hMap(flt,9,1);var fdrm=hMap(fdt,5,1);var max=function(a){var m=a[0];for(var i2=1;i2m)m=a[i2]}return m};var bits=function(d,p,m){var o=p/8|0;return(d[o]|d[o+1]<<8)>>(p&7)&m};var bits16=function(d,p){var o=p/8|0;return(d[o]|d[o+1]<<8|d[o+2]<<16)>>(p&7)};var shft=function(p){return(p+7)/8|0};var slc=function(v,s,e){if(s==null||s<0)s=0;if(e==null||e>v.length)e=v.length;var n=new(v.BYTES_PER_ELEMENT==2?u16:v.BYTES_PER_ELEMENT==4?u32:u8)(e-s);n.set(v.subarray(s,e));return n};var ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"];var err=function(ind,msg,nt){var e=new Error(msg||ec[ind]);e.code=ind;if(Error.captureStackTrace)Error.captureStackTrace(e,err);if(!nt)throw e;return e};var inflt=function(dat,buf,st){var sl=dat.length;if(!sl||st&&st.f&&!st.l)return buf||new u8(0);var noBuf=!buf||st;var noSt=!st||st.i;if(!st)st={};if(!buf)buf=new u8(sl*3);var cbuf=function(l2){var bl=buf.length;if(l2>bl){var nbuf=new u8(Math.max(bl*2,l2));nbuf.set(buf);buf=nbuf}};var final=st.f||0,pos=st.p||0,bt=st.b||0,lm=st.l,dm=st.d,lbt=st.m,dbt=st.n;var tbts=sl*8;do{if(!lm){final=bits(dat,pos,1);var type=bits(dat,pos+1,3);pos+=3;if(!type){var s=shft(pos)+4,l=dat[s-4]|dat[s-3]<<8,t=s+l;if(t>sl){if(noSt)err(0);break}if(noBuf)cbuf(bt+l);buf.set(dat.subarray(s,t),bt);st.b=bt+=l,st.p=pos=t*8,st.f=final;continue}else if(type==1)lm=flrm,dm=fdrm,lbt=9,dbt=5;else if(type==2){var hLit=bits(dat,pos,31)+257,hcLen=bits(dat,pos+10,15)+4;var tl=hLit+bits(dat,pos+5,31)+1;pos+=14;var ldt=new u8(tl);var clt=new u8(19);for(var i2=0;i2>>4;if(s<16){ldt[i2++]=s}else{var c=0,n=0;if(s==16)n=3+bits(dat,pos,3),pos+=2,c=ldt[i2-1];else if(s==17)n=3+bits(dat,pos,7),pos+=3;else if(s==18)n=11+bits(dat,pos,127),pos+=7;while(n--)ldt[i2++]=c}}var lt=ldt.subarray(0,hLit),dt=ldt.subarray(hLit);lbt=max(lt);dbt=max(dt);lm=hMap(lt,lbt,1);dm=hMap(dt,dbt,1)}else err(1);if(pos>tbts){if(noSt)err(0);break}}if(noBuf)cbuf(bt+131072);var lms=(1<>>4;pos+=c&15;if(pos>tbts){if(noSt)err(0);break}if(!c)err(2);if(sym<256)buf[bt++]=sym;else if(sym==256){lpos=pos,lm=null;break}else{var add=sym-254;if(sym>264){var i2=sym-257,b=fleb[i2];add=bits(dat,pos,(1<>>4;if(!d)err(3);pos+=d&15;var dt=fd[dsym];if(dsym>3){var b=fdeb[dsym];dt+=bits16(dat,pos)&(1<tbts){if(noSt)err(0);break}if(noBuf)cbuf(bt+131072);var end=bt+add;for(;bt>3&1)+(flg>>4&1);zs>0;zs-=!d[st++]);return st+(flg&2)};var gzl=function(d){var l=d.length;return(d[l-4]|d[l-3]<<8|d[l-2]<<16|d[l-1]<<24)>>>0};function gunzipSync(data,out){return inflt(data.subarray(gzs(data),-8),out||new u8(gzl(data)))}var td=typeof TextDecoder!="undefined"&&new TextDecoder();var tds=0;try{td.decode(et,{stream:true});tds=1}catch(e){}var gz_default=gunzipSync;var calculate_excerpt_region=(word_positions,excerpt_length)=>{if(word_positions.length===0){return 0}let words=[];for(const word of word_positions){words[word.location]=words[word.location]||0;words[word.location]+=word.balanced_score}if(words.length<=excerpt_length){return 0}let densest=words.slice(0,excerpt_length).reduce((partialSum,a)=>partialSum+a,0);let working_sum=densest;let densest_at=[0];for(let i2=0;i2densest){densest=working_sum;densest_at=[i2]}else if(working_sum===densest&&densest_at[densest_at.length-1]===i2-1){densest_at.push(i2)}}let midpoint=densest_at[Math.floor(densest_at.length/2)];return midpoint};var build_excerpt=(content,start,length,locations,not_before,not_from)=>{let is_zws_delimited=content.includes("\u200B");let fragment_words=[];if(is_zws_delimited){fragment_words=content.split("\u200B")}else{fragment_words=content.split(/[\r\n\s]+/g)}for(let word of locations){if(fragment_words[word]?.startsWith(``)){continue}fragment_words[word]=`${fragment_words[word]}`}let endcap=not_from??fragment_words.length;let startcap=not_before??0;if(endcap-startcapendcap){start=endcap-length}if(start{const anchors=fragment.anchors.filter((a)=>/h\d/i.test(a.element)&&a.text?.length&&/\S/.test(a.text)).sort((a,b)=>a.location-b.location);const results=[];let current_anchor_position=0;let current_anchor={title:fragment.meta["title"],url:fragment.url,weighted_locations:[],locations:[],excerpt:""};const add_result=(end_range)=>{if(current_anchor.locations.length){const relative_weighted_locations=current_anchor.weighted_locations.map((l)=>{return{weight:l.weight,balanced_score:l.balanced_score,location:l.location-current_anchor_position}});const excerpt_start=calculate_excerpt_region(relative_weighted_locations,desired_excerpt_length)+current_anchor_position;const excerpt_length=end_range?Math.min(end_range-excerpt_start,desired_excerpt_length):desired_excerpt_length;current_anchor.excerpt=build_excerpt(fragment.raw_content??"",excerpt_start,excerpt_length,current_anchor.locations,current_anchor_position,end_range);results.push(current_anchor)}};for(let word of fragment.weighted_locations){if(!anchors.length||word.location=anchors[0].location){next_anchor=anchors.shift()}let anchored_url=fragment.url;try{const url_is_fq=/^((https?:)?\/\/)/.test(anchored_url);if(url_is_fq){let fq_url=new URL(anchored_url);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString()}else{if(!/^\//.test(anchored_url)){anchored_url=`/${anchored_url}`}let fq_url=new URL(`https://example.com${anchored_url}`);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString().replace(/^https:\/\/example.com/,"")}}catch(e){console.error(`Pagefind: Couldn't process ${anchored_url} for a search result`)}current_anchor_position=next_anchor.location;current_anchor={title:next_anchor.text,url:anchored_url,anchor:next_anchor,weighted_locations:[word],locations:[word.location],excerpt:""}}}add_result(anchors[0]?.location);return results};var asyncSleep=async(ms=100)=>{return new Promise((r)=>setTimeout(r,ms))};var PagefindInstance=class{constructor(opts={}){this.version=pagefind_version;this.backend=wasm_bindgen;this.decoder=new TextDecoder("utf-8");this.wasm=null;this.basePath=opts.basePath||"/pagefind/";this.primary=opts.primary||false;if(this.primary&&!opts.basePath){this.initPrimary()}if(/[^\/]$/.test(this.basePath)){this.basePath=`${this.basePath}/`}if(window?.location?.origin&&this.basePath.startsWith(window.location.origin)){this.basePath=this.basePath.replace(window.location.origin,"")}this.baseUrl=opts.baseUrl||this.defaultBaseUrl();if(!/^(\/|https?:\/\/)/.test(this.baseUrl)){this.baseUrl=`/${this.baseUrl}`}this.indexWeight=opts.indexWeight??1;this.excerptLength=opts.excerptLength??30;this.mergeFilter=opts.mergeFilter??{};this.highlightParam=opts.highlightParam??null;this.loaded_chunks={};this.loaded_filters={};this.loaded_fragments={};this.raw_ptr=null;this.searchMeta=null;this.languages=null}initPrimary(){let derivedBasePath=import.meta.url.match(/^(.*\/)pagefind.js.*$/)?.[1];if(derivedBasePath){this.basePath=derivedBasePath}else{console.warn(["Pagefind couldn't determine the base of the bundle from the import path. Falling back to the default.","Set a basePath option when initialising Pagefind to ignore this message."].join("\n"))}}defaultBaseUrl(){let default_base=this.basePath.match(/^(.*\/)_?pagefind/)?.[1];return default_base||"/"}async options(options2){const opts=["basePath","baseUrl","indexWeight","excerptLength","mergeFilter","highlightParam"];for(const[k,v]of Object.entries(options2)){if(k==="mergeFilter"){let filters2=this.stringifyFilters(v);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}else if(opts.includes(k)){if(k==="basePath"&&typeof v==="string")this.basePath=v;if(k==="baseUrl"&&typeof v==="string")this.baseUrl=v;if(k==="indexWeight"&&typeof v==="number")this.indexWeight=v;if(k==="excerptLength"&&typeof v==="number")this.excerptLength=v;if(k==="mergeFilter"&&typeof v==="object")this.mergeFilter=v;if(k==="highlightParam"&&typeof v==="string")this.highlightParam=v}else{console.warn(`Unknown Pagefind option ${k}. Allowed options: [${opts.join(", ")}]`)}}}decompress(data,file="unknown file"){if(this.decoder.decode(data.slice(0,12))==="pagefind_dcd"){return data.slice(12)}data=gz_default(data);if(this.decoder.decode(data.slice(0,12))!=="pagefind_dcd"){console.error(`Decompressing ${file} appears to have failed: Missing signature`);return data}return data.slice(12)}async init(language,opts){await this.loadEntry();let index=this.findIndex(language);let lang_wasm=index.wasm?index.wasm:"unknown";let resources=[this.loadMeta(index.hash)];if(opts.load_wasm===true){resources.push(this.loadWasm(lang_wasm))}await Promise.all(resources);this.raw_ptr=this.backend.init_pagefind(new Uint8Array(this.searchMeta));if(Object.keys(this.mergeFilter)?.length){let filters2=this.stringifyFilters(this.mergeFilter);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}}async loadEntry(){try{let entry_response=await fetch(`${this.basePath}pagefind-entry.json?ts=${Date.now()}`);let entry_json=await entry_response.json();this.languages=entry_json.languages;if(entry_json.version!==this.version){if(this.primary){console.warn(["Pagefind JS version doesn't match the version in your search index.",`Pagefind JS: ${this.version}. Pagefind index: ${entry_json.version}`,"If you upgraded Pagefind recently, you likely have a cached pagefind.js file.","If you encounter any search errors, try clearing your cache."].join("\n"))}else{console.warn(["Merging a Pagefind index from a different version than the main Pagefind instance.",`Main Pagefind JS: ${this.version}. Merged index (${this.basePath}): ${entry_json.version}`,"If you encounter any search errors, make sure that both sites are running the same version of Pagefind."].join("\n"))}}}catch(e){console.error(`Failed to load Pagefind metadata: +${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index: +${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM: +${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM: +${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}: +${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(//g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}parseFilters(str){let output={};if(!str)return output;for(const block of str.split("__PF_FILTER_DELIM__")){let[filter,values]=block.split(/:(.*)$/);output[filter]={};if(values){for(const valueBlock of values.split("__PF_VALUE_DELIM__")){if(valueBlock){let extract=valueBlock.match(/^(.*):(\d+)$/);if(extract){let[,value,count]=extract;output[filter][value]=parseInt(count)??count}}}}}return output}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_chunks=filters2.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks]);ptr=await this.getPtr();let results=this.backend.filters(ptr);return this.parseFilters(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}term=term.toLowerCase().trim().replace(/[\.`~!@#\$%\^&\*\(\)\{\}\[\]\\\|:;'",<>\/\?\-]/g,"").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let chunks=index_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...chunks,...filter_chunks]);log(`Loaded necessary chunks to run search`);if(options2.preload){log(`Preload \u2014 bailing out of search operation now.`);return null}ptr=await this.getPtr();let searchStart=Date.now();let result=this.backend.search(ptr,term,filter_list,sort_list,exact_search);log(`Got the raw search result: ${result}`);let[unfilteredResultCount,all_results,filters2,totalFilters]=result.split(/:([^:]*):(.*)__PF_UNFILTERED_DELIM__(.*)$/);let filterObj=this.parseFilters(filters2);let totalFilterObj=this.parseFilters(totalFilters);log(`Remaining filters: ${JSON.stringify(result)}`);let results=all_results.length?all_results.split(" "):[];let resultsInterface=results.map((result2)=>{let[hash,score,all_locations]=result2.split("@");log(`Processing result: + hash:${hash} + score:${score} + locations:${all_locations}`);let weighted_locations=all_locations.length?all_locations.split(",").map((l)=>{let[weight,balanced_score,location]=l.split(">");return{weight:parseInt(weight)/24,balanced_score:parseFloat(balanced_score),location:parseInt(location)}}):[];let locations=weighted_locations.map((l)=>l.location);return{id:hash,score:parseFloat(score)*this.indexWeight,words:locations,data:async()=>await this.loadFragment(hash,weighted_locations,term)}});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);return{results:resultsInterface,unfilteredResultCount:parseInt(unfilteredResultCount),filters:filterObj,totalFilters:totalFilterObj,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}}}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async init(overrideLanguage){if(document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);return{results,unfilteredResultCount,filters:filters2,totalFilters,timings}}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search} \ No newline at end of file diff --git a/docs/_/pagefind/pagefind.unknown_9d42de2383af4a6.pf_meta b/docs/_/pagefind/pagefind.unknown_9d42de2383af4a6.pf_meta new file mode 100644 index 0000000000000000000000000000000000000000..c97783946c572756781d94bec390e0dcf1200dc8 GIT binary patch literal 153 zcmV;K0A~LmiwFP!00002|3%En4Z<)GK+!hb15)H|yif?&$SW9vg9s7IjRZkIoN0kp z=po0sKI#99+oxP=Y-5P8#2VVj_tKB`RQr2vjpbSZCtoBXymDTXKN2$%4A10;6eZ7& z3GzV##kI46Y>}*1QX3$f`58E+hsmA0aY$F(FyjIAyc~CBD86*%Het;e#1I}UgC|-e H!vFvP`&2^t literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/wasm.unknown.pagefind b/docs/_/pagefind/wasm.unknown.pagefind new file mode 100644 index 0000000000000000000000000000000000000000..d7495cc382c1dadd5f616257bfbcd8f3086b3b44 GIT binary patch literal 55176 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 + + + + + + + + + + +controller + + + +

    package controller

    +
    import "backend/app/internal/controller"
    +

    Index

    +

    Functions

    + +
    func Search(ctx *gin.Context)
    +

    Search godoc +

    @Summary		Search OpenAPI specifications
    +@Description	retrieve OpenAPI specifications matching the given query
    +@Tags			search
    +@Accept			json
    +@Produce		json
    +@Success		200	{string} ok
    +@Failure		400	{string} Bad Request
    +@Failure		500	{string} Internal Server Error
    +@Router			/search [post]
    +
    +

    func SetupRoutes

    +
    func SetupRoutes(router *gin.Engine)
    +

    Types

    +

    type EmbeddingRequest

    +
    type EmbeddingRequest = models.EmbeddingRequest
    +
    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/elastic/index.html b/docs/elastic/index.html new file mode 100644 index 00000000..df400a4c --- /dev/null +++ b/docs/elastic/index.html @@ -0,0 +1,72 @@ + + + + + + + + + + + +elastic + + + +

    package elastic

    +
    import "backend/app/internal/elastic"
    +

    Index

    +

    Functions

    +

    func Connect

    +
    func Connect(config models.ElasticConfig) *elasticsearch.Client
    +

    Connect - used to connect to the elasticsearch database. It will return an elasticsearch client that can be used to +perform queries on the database. +

    func DeleteDocument

    +
    func DeleteDocument(client *elasticsearch.Client, id string, index string)
    +

    DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to +be passed to the function. +

    func ParseEmbedding

    +
    func ParseEmbedding(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
    +

    ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the +Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the +function. +

    func SearchDocument

    +
    func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsDocument
    +

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need +to be passed to the function. +

    func SendDocument

    +
    func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
    +

    SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need +to be passed to the function. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/embedding/index.html b/docs/embedding/index.html new file mode 100644 index 00000000..d87549b3 --- /dev/null +++ b/docs/embedding/index.html @@ -0,0 +1,85 @@ + + + + + + + + + + + +embedding + + + +

    package embedding

    +
    import "backend/app/internal/embedding"
    +

    Index

    +

    Functions

    +

    func ExtractTags

    +
    func ExtractTags(fragments []string) []string
    +

    ExtractTags - extract the NL tags from a fragment (JSON document documenting a REST API), and return an array of +strings, one for each fragment. An array of fragments needs to be passed to the function. +

    func PreprocessFragment

    +
    func PreprocessFragment(fragments []string, isQuery bool) []string
    +

    PreprocessFragment - fragments are preprocessed by running a standard NLP pipeline, composed of string cleaning, +stop-word removal, and stemming. An array of fragments (string), and a boolean indicating is the fragments are +queries or not need to be passed to the function. +

    func Stemming

    +
    func Stemming(fragments []string) []string
    +

    Stemming - stem all the words contained in the given strings. An array of strings needs to be passed to the +function. +

    func StopWordRemoval

    +
    func StopWordRemoval(fragments []string) []string
    +

    StopWordRemoval - remove all stopwords from the given strings. An array of strings needs to be passed to the +function. +

    Types

    +

    type Embeddings

    +
    type Embeddings = models.EmbeddingResponse
    +

    func Embed

    +
    func Embed(fragments []string) *Embeddings
    +

    Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of +embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. +

    func PerformPipeline

    +
    func PerformPipeline(fragments []string, isQuery bool) *Embeddings
    +

    PerformPipeline - fragments are preprocessed and embeddings are generated and returned. An array of fragments +(string) and a boolean indicating if the fragments are queries or not need to be passed to the function. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/helpers/index.html b/docs/helpers/index.html new file mode 100644 index 00000000..a55bd630 --- /dev/null +++ b/docs/helpers/index.html @@ -0,0 +1,62 @@ + + + + + + + + + + + +helpers + + + +

    package helpers

    +
    import "backend/app/internal/helpers"
    +

    Index

    +

    Functions

    +

    func GetCertificate

    +
    func GetCertificate() []byte
    +

    GetCertificate - retrieve the elasticsearch cluster certificate. +

    Types

    +

    type Config

    +
    type Config = models.Config
    +

    func LoadConfigs

    +
    func LoadConfigs() Config
    +

    LoadConfigs - parse and store in a struct all the config values needed by the backend. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..c383a9a4 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,69 @@ + + + + + + + + + + + +backend/app/internal + + + +

    Directories

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    controller
    elastic
    embedding
    helpers
    models
    mongodb
    +
    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/models/index.html b/docs/models/index.html new file mode 100644 index 00000000..623da887 --- /dev/null +++ b/docs/models/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + +models + + + +

    package models

    +
    import "backend/app/internal/models"
    +

    Index

    +

    Types

    +

    type BackendConfig

    +
    type BackendConfig struct {
    +	Port int `yaml:"port"`
    +}
    +

    BackendConfig - all backend-related configurations. +

    type Config

    +
    type Config struct {
    +	Backend BackendConfig `yaml:"backend"`
    +	Mongo   MongoConfig   `yaml:"mongodb"`
    +	Elastic ElasticConfig `yaml:"elastic"`
    +}
    +

    Config - used to store all configurations needed by the backend. +

    type ElasticConfig

    +
    type ElasticConfig struct {
    +	Protocol string `yaml:"protocol"`
    +	Host     string `yaml:"host"`
    +	Port     int    `yaml:"port"`
    +	User     string `yaml:"user"`
    +	Password string `yaml:"password"`
    +}
    +

    ElasticConfig - all elasticsearch-related configurations. +

    type EmbeddingRequest

    +
    type EmbeddingRequest struct {
    +	Fragment string `json:"fragment"`
    +}
    +

    EmbeddingRequest - structure of the request to be sent to the embedding server. +

    type EmbeddingResponse

    +
    type EmbeddingResponse struct {
    +	Predictions [][]float32
    +}
    +

    EmbeddingResponse - structure of the response sent back by the embedding server. +

    type EsDocument

    +
    type EsDocument struct {
    +	MongoId    primitive.ObjectID `json:"mongo_id"`
    +	Collection string             `json:"mongo_collection"`
    +	Embedding  []float32          `json:"embedding"`
    +}
    +

    EsDocument - structure of an elasticsearch document returned by the elasticsearch client. +

    type MongoConfig

    +
    type MongoConfig struct {
    +	Protocol string `yaml:"protocol"`
    +	Host     string `yaml:"host"`
    +	Port     int    `yaml:"port"`
    +	User     string `yaml:"user"`
    +	Password string `yaml:"password"`
    +}
    +

    MongoConfig - all mongodb-related configurations. +

    type SyncDocument

    +
    type SyncDocument struct {
    +	Id         string `bson:"_id"`
    +	Collection string `bson:"coll"`
    +	Api        string
    +}
    +

    SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. +

    +
    +
    + + Generated with doc2go + +
    + + diff --git a/docs/mongodb/index.html b/docs/mongodb/index.html new file mode 100644 index 00000000..4726b0f7 --- /dev/null +++ b/docs/mongodb/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + +mongodb + + + +

    package mongodb

    +
    import "backend/app/internal/mongodb"
    +

    Index

    +

    Functions

    +

    func Connect

    +
    func Connect(config models.MongoConfig) *mongo.Client
    +

    Connect - used to connect to the mongodb database. It will return a mongodb client that can be used to perform +queries on the database. +

    func DeleteDocuments

    +
    func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    +

    DeleteDocuments - every time a documents is deleted from the database, it will be searched in the elasticsearch +index (based on the mongodb ObjectId) and deleted from the elasticsearch database. +

    func InsertDocuments

    +
    func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)
    +

    InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and +saved in the respective elasticsearch index. +

    func SearchDocument

    +
    func SearchDocument(database *mongo.Database, query bson.M, collection string) string
    +

    SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection +need to be passed to the function. +

    func WatchDatabase

    +
    func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string)
    +

    WatchDatabase - watch for a certain type of events in the mongodb `apis` database. The supported events are +document insertion and document deletion. +

    +
    +
    + + Generated with doc2go + +
    + + From 4e565e8007a4073931f9a7b7f32fb02d8633da3b Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 02:47:26 +0100 Subject: [PATCH 08/60] fixed ci pipeline --- .github/workflows/deploy-backend.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 0cc1f992..77d47d78 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -20,7 +20,7 @@ jobs: go get ./... - name: Build - run: go build -o . ./... + run: go build -o ./main ./app - name: Run Tests run: gotestsum --hide-summary=skipped ./app/tests/... > tests-result.txt From e816ae30f54f699147d2e089f0bfba6732a6519b Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 14:46:28 +0100 Subject: [PATCH 09/60] fixed docker files + almost finished sync module --- .pre-commit-config.yaml | 23 ++++++++++------- Dockerfile | 9 ++++--- app/internal/elastic/operations.go | 40 +++++++++++++++++++----------- app/internal/helpers/config.go | 3 ++- app/internal/models/document.go | 2 +- app/internal/models/elastic.go | 19 ++++++++++++++ app/internal/mongodb/sync.go | 9 +++++-- app/main.go | 5 ++-- docker-compose.yml | 17 +++++++++++-- 9 files changed, 90 insertions(+), 37 deletions(-) create mode 100644 app/internal/models/elastic.go diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 243e0710..baa7e1b0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,13 +5,18 @@ repos: - id: trailing-whitespace - id: check-yaml - id: check-added-large-files - - repo: local + - id: detect-private-key + - repo: https://github.com/dnephin/pre-commit-golang + rev: v0.5.0 hooks: - - id: generate-go-docs - name: generate-go-docs - entry: ./scripts/hooks/generate-go-docs.sh - language: system - - id: generate-swagger-docs - name: generate-swagger-docs - entry: ./scripts/hooks/generate-swagger-docs.sh - language: system + - id: go-unit-tests +# - repo: local +# hooks: +# - id: generate-go-docs +# name: generate-go-docs +# entry: ./scripts/hooks/generate-go-docs.sh +# language: system +# - id: generate-swagger-docs +# name: generate-swagger-docs +# entry: ./scripts/hooks/generate-swagger-docs.sh +# language: system diff --git a/Dockerfile b/Dockerfile index 95473789..77a36016 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,17 +6,18 @@ COPY go.* ./ RUN go mod download COPY . . -RUN go build -o /backend/build/app ./app +RUN go install github.com/swaggo/swag/cmd/swag@latest +RUN cd app && swag init +RUN go build -o /backend/build/app /backend/app FROM alpine:latest WORKDIR /backend -ENV GIN_MODE="release" -ENV MODELS_HOST="models" +ARG GIN_MODE +ARG MODELS_HOST COPY --from=builder /backend/build/app /backend/build/app -COPY --from=builder /backend/config /backend/config EXPOSE 8080 ENTRYPOINT [ "/backend/build/app" ] \ No newline at end of file diff --git a/app/internal/elastic/operations.go b/app/internal/elastic/operations.go index 8259f10f..c2d6d939 100644 --- a/app/internal/elastic/operations.go +++ b/app/internal/elastic/operations.go @@ -3,6 +3,7 @@ package elastic import ( "bytes" "context" + "io" "log" "os" "strings" @@ -10,7 +11,6 @@ import ( "backend/app/internal/models" "github.com/elastic/go-elasticsearch/v8" - "github.com/elastic/go-elasticsearch/v8/esapi" "github.com/goccy/go-json" ) @@ -23,38 +23,48 @@ func SendDocument(client *elasticsearch.Client, document *models.EsDocument, ind panic(err) } - response, err := client.Index(index, bytes.NewReader(jsonDocument)) + res, err := client.Index(index, bytes.NewReader(jsonDocument)) if err != nil { return } if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] %s", response.String()) + log.Printf("[ELASTIC-debug] Indexing: %s", res.Status()) } } // SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need // to be passed to the function. -func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsDocument { - var response models.EsDocument - request := esapi.SearchRequest{ - Index: []string{index}, - Body: strings.NewReader(query), - } +func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse { + var response models.EsSearchResponse - res, err := request.Do(context.TODO(), client) + res, err := client.Search( + client.Search.WithIndex(index), + client.Search.WithBody(strings.NewReader(query)), + client.Search.WithContext(context.TODO()), + ) if err != nil { panic(err) } if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] %s", res.Status()) + log.Printf("[ELASTIC-debug] Search: %s", res.Status()) + } + + // Read the body of the elasticsearch response + out := new(bytes.Buffer) + b1 := bytes.NewBuffer([]byte{}) + tr := io.TeeReader(res.Body, b1) + _, err = out.ReadFrom(tr) + + if err != nil { + panic(err) } - //bson.NewDecoder(res) - log.Print(response) + // Unmarshal the byte array into the response + err = json.Unmarshal([]byte(out.String()), &response) if err != nil { panic(err) @@ -66,13 +76,13 @@ func SearchDocument(client *elasticsearch.Client, query string, index string) *m // DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to // be passed to the function. func DeleteDocument(client *elasticsearch.Client, id string, index string) { - response, err := client.Delete(index, id) + res, err := client.Delete(index, id) if err != nil { return } if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] %s", response.String()) + log.Printf("[ELASTIC-debug] Delete: %s", res.Status()) } } diff --git a/app/internal/helpers/config.go b/app/internal/helpers/config.go index 92aa1441..b80dfaa4 100644 --- a/app/internal/helpers/config.go +++ b/app/internal/helpers/config.go @@ -1,6 +1,7 @@ package helpers import ( + "fmt" "log" "os" @@ -18,7 +19,7 @@ func LoadConfigs() Config { // Read config file pwd, err := os.Getwd() - file, err := os.Open(pwd + "/config/local.config.yml") + file, err := os.Open(pwd + fmt.Sprintf("/config/%s.config.yml", os.Getenv("GIN_MODE"))) // Handle errors defer func(file *os.File) { diff --git a/app/internal/models/document.go b/app/internal/models/document.go index 1763cbf2..91532867 100644 --- a/app/internal/models/document.go +++ b/app/internal/models/document.go @@ -11,7 +11,7 @@ type SyncDocument struct { Api string } -// EsDocument - structure of an elasticsearch document returned by the elasticsearch client. +// EsDocument - structure of an elasticsearch document to be sent to the elasticsearch client. type EsDocument struct { MongoId primitive.ObjectID `json:"mongo_id"` Collection string `json:"mongo_collection"` diff --git a/app/internal/models/elastic.go b/app/internal/models/elastic.go new file mode 100644 index 00000000..697d113b --- /dev/null +++ b/app/internal/models/elastic.go @@ -0,0 +1,19 @@ +package models + +// EsSearchResponse - structure of the response sent by the elasticsearch client +type EsSearchResponse struct { + Hits struct { + Hits []Hit `json:"hits"` + } `json:"hits"` +} + +// Hit - structure of an elasticsearch document +type Hit struct { + Id string `json:"_id"` + Index string `json:"_index"` + Document struct { + MongoId string `json:"mongo_id"` + MongoCollection string `json:"mongo_collection"` + Embedding []float32 `json:"embedding"` + } `json:"_source"` +} diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go index a768ece6..18d5ca62 100644 --- a/app/internal/mongodb/sync.go +++ b/app/internal/mongodb/sync.go @@ -64,6 +64,8 @@ func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, panic(err) } + // TODO: If dealing with the `github` collection, look for the `latest` tag + query := bson.M{"_id": docId} document.Api = SearchDocument(database, query, document.Collection) @@ -87,7 +89,10 @@ func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, specification.Id) // TODO: Change index name - elastic.SearchDocument(esClient, query, "test") - //elastic.DeleteDocument(esClient, esDocument.) + response := elastic.SearchDocument(esClient, query, "test") + + for _, document := range response.Hits.Hits { + elastic.DeleteDocument(esClient, document.Id, document.Index) + } } } diff --git a/app/main.go b/app/main.go index 7f5c0894..0c9f4872 100644 --- a/app/main.go +++ b/app/main.go @@ -17,17 +17,16 @@ import ( // @version 1.0 // @description This is the backend for the API Scout platform. -// @BasePath /api/v1 +// @BasePath /api/v1 func main() { cfg := helpers.LoadConfigs() mongoClient := mongodb.Connect(cfg.Mongo) elasticClient := elastic.Connect(cfg.Elastic) - // Run the sync pipeline on a different goroutine + // Run the sync pipelines on different goroutines go mongodb.WatchDatabase(mongoClient, elasticClient, "insert") go mongodb.WatchDatabase(mongoClient, elasticClient, "delete") - // Start the webserver router := gin.Default() controller.SetupRoutes(router) diff --git a/docker-compose.yml b/docker-compose.yml index 9d74a087..13e34ae7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,20 +3,33 @@ services: models: image: tensorflow/serving container_name: models + environment: + MODEL_NAME: "universal-encoder" networks: - be-network volumes: - ./models/universal-encoder:/models/universal-encoder - environment: - MODEL_NAME: "universal-encoder" backend: image: api-scout-backend:latest container_name: backend + environment: + GIN_MODE: "release" + MODELS_HOST: "models" networks: - be-network + - mongo-network + - elastic-network ports: - "8080:8080" + volumes: + - ./config:/backend/config networks: be-network: driver: bridge + mongo-network: + name: mongo_mongo-network + external: true + elastic-network: + name: elastic_es-network + external: true \ No newline at end of file From 49c3bd2ed4fa2e5aac19337dae7ee69f3ff0665f Mon Sep 17 00:00:00 2001 From: edoriggio Date: Sun, 10 Mar 2024 14:57:26 +0100 Subject: [PATCH 10/60] updated documentation --- .../fragment/unknown_5497eeb.pf_fragment | Bin 0 -> 688 bytes .../fragment/unknown_fe47cfb.pf_fragment | Bin 0 -> 1205 bytes .../_/pagefind/index/unknown_15593cd.pf_index | Bin 0 -> 4419 bytes docs/_/pagefind/pagefind-entry.json | 2 +- .../pagefind.unknown_9ff93eec4795497.pf_meta | Bin 0 -> 158 bytes docs/elastic/index.html | 4 +-- docs/models/index.html | 26 +++++++++++++++++- 7 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 docs/_/pagefind/fragment/unknown_5497eeb.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_fe47cfb.pf_fragment create mode 100644 docs/_/pagefind/index/unknown_15593cd.pf_index create mode 100644 docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta diff --git a/docs/_/pagefind/fragment/unknown_5497eeb.pf_fragment b/docs/_/pagefind/fragment/unknown_5497eeb.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..92c868536718451d4ae1a6a1bd3dfbd5840ce5a9 GIT binary patch literal 688 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 J)xt6$005UGn*aa+ literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/pagefind-entry.json b/docs/_/pagefind/pagefind-entry.json index f25b4ffe..48f677b0 100644 --- a/docs/_/pagefind/pagefind-entry.json +++ b/docs/_/pagefind/pagefind-entry.json @@ -1 +1 @@ -{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_9d42de2383af4a6","wasm":null,"page_count":6}}} \ No newline at end of file +{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_9ff93eec4795497","wasm":null,"page_count":6}}} \ No newline at end of file diff --git a/docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta b/docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta new file mode 100644 index 0000000000000000000000000000000000000000..c63e7c7f29ac4b2e9f900d322664e69f87e1a52d GIT binary patch literal 158 zcmV;P0Ac?hiwFP!00002|4q!h4Z<)Kg<;V$ftdj*^4pj}Xe0aj8Vtcfgb1Z0L9h=s zGqD35ru}rze{x%lDTg{hcp$52C7)B<=RIndex
  • func Connect(config models.ElasticConfig) *elasticsearch.Client
  • func DeleteDocument(client *elasticsearch.Client, id string, index string)
  • func ParseEmbedding(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
  • -
  • func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsDocument
  • +
  • func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
  • func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
  • Functions

    func Connect

    @@ -42,7 +42,7 @@

    func ParseEmbedding

    Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the function.

    func SearchDocument

    -
    func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsDocument
    +
    func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need to be passed to the function.

    func SendDocument

    diff --git a/docs/models/index.html b/docs/models/index.html index 623da887..3da7029b 100644 --- a/docs/models/index.html +++ b/docs/models/index.html @@ -40,6 +40,12 @@

    Index

  • type EsDocument
  • +
  • + type EsSearchResponse +
  • +
  • + type Hit +
  • type MongoConfig
  • @@ -84,7 +90,25 @@

    type EsDocument

    Collection string `json:"mongo_collection"` Embedding []float32 `json:"embedding"` } -

    EsDocument - structure of an elasticsearch document returned by the elasticsearch client. +

    EsDocument - structure of an elasticsearch document to be sent to the elasticsearch client. +

    type EsSearchResponse

    +
    type EsSearchResponse struct {
    +	Hits struct {
    +		Hits []Hit `json:"hits"`
    +	} `json:"hits"`
    +}
    +

    EsSearchResponse - structure of the response sent by the elasticsearch client +

    type Hit

    +
    type Hit struct {
    +	Id       string `json:"_id"`
    +	Index    string `json:"_index"`
    +	Document struct {
    +		MongoId         string    `json:"mongo_id"`
    +		MongoCollection string    `json:"mongo_collection"`
    +		Embedding       []float32 `json:"embedding"`
    +	} `json:"_source"`
    +}
    +

    Hit - structure of an elasticsearch document

    type MongoConfig

    type MongoConfig struct {
     	Protocol string `yaml:"protocol"`
    
    From ca233287d7a31e061362839f3399dbc4c9993912 Mon Sep 17 00:00:00 2001
    From: edoriggio 
    Date: Tue, 12 Mar 2024 14:26:17 +0100
    Subject: [PATCH 11/60] finished listeners for deletions and insertions
    
    ---
     README.md                                        |   5 ++---
     app/internal/doc2go.rc                           |   2 +-
     app/internal/elastic/parser.go                   |   4 ++--
     app/internal/mongodb/{mongo.go => mongodb.go}    |   0
     app/internal/mongodb/sync.go                     |   8 +++-----
     .../fragment/unknown_0f340d8.pf_fragment         | Bin 0 -> 686 bytes
     .../fragment/unknown_184582f.pf_fragment         | Bin 1025 -> 0 bytes
     .../fragment/unknown_5497eeb.pf_fragment         | Bin 688 -> 0 bytes
     .../fragment/unknown_8927352.pf_fragment         | Bin 684 -> 0 bytes
     docs/_/pagefind/index/unknown_15593cd.pf_index   | Bin 4419 -> 0 bytes
     docs/_/pagefind/index/unknown_7a71f54.pf_index   | Bin 0 -> 4418 bytes
     docs/_/pagefind/index/unknown_d18b557.pf_index   | Bin 4171 -> 0 bytes
     docs/_/pagefind/pagefind-entry.json              |   2 +-
     .../pagefind.unknown_12195f4b2ff197b.pf_meta     | Bin 0 -> 157 bytes
     .../pagefind.unknown_9d42de2383af4a6.pf_meta     | Bin 153 -> 0 bytes
     .../pagefind.unknown_9ff93eec4795497.pf_meta     | Bin 158 -> 0 bytes
     docs/elastic/index.html                          |   8 ++++----
     17 files changed, 13 insertions(+), 16 deletions(-)
     rename app/internal/mongodb/{mongo.go => mongodb.go} (100%)
     create mode 100644 docs/_/pagefind/fragment/unknown_0f340d8.pf_fragment
     delete mode 100644 docs/_/pagefind/fragment/unknown_184582f.pf_fragment
     delete mode 100644 docs/_/pagefind/fragment/unknown_5497eeb.pf_fragment
     delete mode 100644 docs/_/pagefind/fragment/unknown_8927352.pf_fragment
     delete mode 100644 docs/_/pagefind/index/unknown_15593cd.pf_index
     create mode 100644 docs/_/pagefind/index/unknown_7a71f54.pf_index
     delete mode 100644 docs/_/pagefind/index/unknown_d18b557.pf_index
     create mode 100644 docs/_/pagefind/pagefind.unknown_12195f4b2ff197b.pf_meta
     delete mode 100644 docs/_/pagefind/pagefind.unknown_9d42de2383af4a6.pf_meta
     delete mode 100644 docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta
    
    diff --git a/README.md b/README.md
    index 2d5a3374..b8080534 100644
    --- a/README.md
    +++ b/README.md
    @@ -56,8 +56,7 @@ npm install -g pagefind@latest
     Once all dependencies have been installed, run:
     
     ```shell
    -cd app/internal
    -doc2go -config ./doc2go.rc  ./...
    +doc2go -config ./app/internal/doc2go.rc ./app/internal/...
     ```
     
     ### Consult Documentation
    @@ -65,5 +64,5 @@ doc2go -config ./doc2go.rc  ./...
     To consult the documentation of the `app/internal` API, run the following command:
     
     ```shell
    -cd docs/go && python -m http.server 8000
    +cd docs && python -m http.server 8000
     ```
    diff --git a/app/internal/doc2go.rc b/app/internal/doc2go.rc
    index 92e6d379..0aa77bd8 100644
    --- a/app/internal/doc2go.rc
    +++ b/app/internal/doc2go.rc
    @@ -1,3 +1,3 @@
     pagefind
    -out ../../docs
    +out ./docs
     home backend/app/internal/
    diff --git a/app/internal/elastic/parser.go b/app/internal/elastic/parser.go
    index be8cae40..0107b90c 100644
    --- a/app/internal/elastic/parser.go
    +++ b/app/internal/elastic/parser.go
    @@ -5,10 +5,10 @@ import (
     	"go.mongodb.org/mongo-driver/bson/primitive"
     )
     
    -// ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the
    +// ParseDocument - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the
     // Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the
     // function.
    -func ParseEmbedding(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument {
    +func ParseDocument(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument {
     	var err error
     	var esDocument models.EsDocument
     
    diff --git a/app/internal/mongodb/mongo.go b/app/internal/mongodb/mongodb.go
    similarity index 100%
    rename from app/internal/mongodb/mongo.go
    rename to app/internal/mongodb/mongodb.go
    diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go
    index 18d5ca62..bb38ab25 100644
    --- a/app/internal/mongodb/sync.go
    +++ b/app/internal/mongodb/sync.go
    @@ -70,9 +70,8 @@ func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream,
     		document.Api = SearchDocument(database, query, document.Collection)
     
     		embeddings := embedding.PerformPipeline([]string{document.Api}, false)
    -		esDocument := elastic.ParseEmbedding(&document, embeddings)
    -		// TODO: Change index name
    -		elastic.SendDocument(esClient, esDocument, "test")
    +		esDocument := elastic.ParseDocument(&document, embeddings)
    +		elastic.SendDocument(esClient, esDocument, "embeddings")
     	}
     }
     
    @@ -88,8 +87,7 @@ func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream,
     		}
     
     		query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, specification.Id)
    -		// TODO: Change index name
    -		response := elastic.SearchDocument(esClient, query, "test")
    +		response := elastic.SearchDocument(esClient, query, "embeddings")
     
     		for _, document := range response.Hits.Hits {
     			elastic.DeleteDocument(esClient, document.Id, document.Index)
    diff --git a/docs/_/pagefind/fragment/unknown_0f340d8.pf_fragment b/docs/_/pagefind/fragment/unknown_0f340d8.pf_fragment
    new file mode 100644
    index 0000000000000000000000000000000000000000..d543505c31d7b3356312a2b68c027459eab41254
    GIT binary patch
    literal 686
    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
    J)xt6$005UGn*aa+
    
    diff --git a/docs/_/pagefind/index/unknown_7a71f54.pf_index b/docs/_/pagefind/index/unknown_7a71f54.pf_index
    new file mode 100644
    index 0000000000000000000000000000000000000000..19f4333b86a367dbbe0aaec28bbbf6b5a3cefeca
    GIT binary patch
    literal 4418
    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
    I#VsHJ0LkX4uK)l5
    
    literal 0
    HcmV?d00001
    
    diff --git a/docs/_/pagefind/index/unknown_d18b557.pf_index b/docs/_/pagefind/index/unknown_d18b557.pf_index
    deleted file mode 100644
    index 451921e95805b1658ea34c766d68cf607c7565a6..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 4171
    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
    VG0fHk<}2FE{|7_(bI_|E0041cBclKS
    
    diff --git a/docs/_/pagefind/pagefind-entry.json b/docs/_/pagefind/pagefind-entry.json
    index 48f677b0..88a9d249 100644
    --- a/docs/_/pagefind/pagefind-entry.json
    +++ b/docs/_/pagefind/pagefind-entry.json
    @@ -1 +1 @@
    -{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_9ff93eec4795497","wasm":null,"page_count":6}}}
    \ No newline at end of file
    +{"version":"1.0.4","languages":{"unknown":{"hash":"unknown_12195f4b2ff197b","wasm":null,"page_count":6}}}
    \ No newline at end of file
    diff --git a/docs/_/pagefind/pagefind.unknown_12195f4b2ff197b.pf_meta b/docs/_/pagefind/pagefind.unknown_12195f4b2ff197b.pf_meta
    new file mode 100644
    index 0000000000000000000000000000000000000000..37f066b4f6949b3dcfb46eb82d3c29f1210b899d
    GIT binary patch
    literal 157
    zcmV;O0Al|iiwFP!00002|3%BY4Z<)KKvB^$ftdj*vg6N77=$+R?|~sWh!CN4BnbAQ
    zW+rx^}*1QX3$f`58E+hsmA0aY$F(FyjIAyc~CBD86*%Het;e#1I}UgC|-e
    H!vFvP`&2^t
    
    diff --git a/docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta b/docs/_/pagefind/pagefind.unknown_9ff93eec4795497.pf_meta
    deleted file mode 100644
    index c63e7c7f29ac4b2e9f900d322664e69f87e1a52d..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 158
    zcmV;P0Ac?hiwFP!00002|4q!h4Z<)Kg<;V$ftdj*^4pj}Xe0aj8Vtcfgb1Z0L9h=s
    zGqD35ru}rze{x%lDTg{hcp$52C7)B<=RIndex
     

    Functions

    @@ -36,9 +36,9 @@

    func DeleteDocument

    func DeleteDocument(client *elasticsearch.Client, id string, index string)

    DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to be passed to the function. -

    func ParseEmbedding

    -
    func ParseEmbedding(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
    -

    ParseEmbedding - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the +

    func ParseDocument

    +
    func ParseDocument(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
    +

    ParseDocument - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the function.

    func SearchDocument

    From 3b92748f8f65f31fa18ed2745379b1c848168149 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Wed, 13 Mar 2024 10:40:31 +0100 Subject: [PATCH 12/60] testing ci docker image deployment --- .github/workflows/deploy-backend.yml | 46 ++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 77d47d78..1b633bab 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -6,29 +6,57 @@ jobs: test: runs-on: "ubuntu-latest" steps: - - name: 'Checkout github action' + - name: Checkout repo uses: actions/checkout@v4 - + - name: Setup golang uses: actions/setup-go@v5 with: go-version: '1.22' - + - name: Install dependencies run: | go install gotest.tools/gotestsum@latest go get ./... - + - name: Build run: go build -o ./main ./app - - - name: Run Tests + + - name: Run tests run: gotestsum --hide-summary=skipped ./app/tests/... > tests-result.txt - + - name: Upload tests result uses: actions/upload-artifact@v4 with: name: tests-result path: tests-result.txt - # deploy: - # if: github.ref == 'refs/heads/main' + + deploy-dev: + if: github.ref == 'refs/heads/dev' + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: edoriggio/api-scout + + - name: Build and push image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} +# deploy-prod: +# if: github.ref == 'refs/heads/main' From d49e7664fe79fbaafcd47fcd5324be337bf7cc41 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Wed, 13 Mar 2024 10:57:42 +0100 Subject: [PATCH 13/60] removed conditional in ci workflow file --- .github/workflows/deploy-backend.yml | 5 +---- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 1b633bab..f00fb211 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -31,8 +31,7 @@ jobs: name: tests-result path: tests-result.txt - deploy-dev: - if: github.ref == 'refs/heads/dev' + deploy: runs-on: ubuntu-latest steps: - name: Checkout repo @@ -58,5 +57,3 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} -# deploy-prod: -# if: github.ref == 'refs/heads/main' diff --git a/docker-compose.yml b/docker-compose.yml index 13e34ae7..4a65f922 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: - ./models/universal-encoder:/models/universal-encoder backend: - image: api-scout-backend:latest + image: edoriggio/api-scout:dev container_name: backend environment: GIN_MODE: "release" From 3e3554cf49e169eb2ac997cbb55658615917880d Mon Sep 17 00:00:00 2001 From: edoriggio Date: Wed, 13 Mar 2024 11:00:27 +0100 Subject: [PATCH 14/60] deploy job now needs test job to succeed --- .github/workflows/deploy-backend.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index f00fb211..5aaab3d3 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -33,6 +33,7 @@ jobs: deploy: runs-on: ubuntu-latest + needs: test steps: - name: Checkout repo uses: actions/checkout@v4 From 6e0efba0fc2391731ae6607f1f8f7e43fe845e3c Mon Sep 17 00:00:00 2001 From: edoriggio Date: Wed, 13 Mar 2024 11:10:29 +0100 Subject: [PATCH 15/60] added conditions to deploy job --- .github/workflows/deploy-backend.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 5aaab3d3..6ccae9e8 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -32,6 +32,10 @@ jobs: path: tests-result.txt deploy: + if: contains(' + refs/heads/dev + refs/heads/main + ', github.ref) runs-on: ubuntu-latest needs: test steps: From 9bafb9f30f41a5d3b6d387bd00c0683420de4b55 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Fri, 15 Mar 2024 07:56:16 +0100 Subject: [PATCH 16/60] added endpoint for retrieving specifications --- app/docs/docs.go | 124 +++++++++++++++++- app/docs/swagger.json | 124 +++++++++++++++++- app/docs/swagger.yaml | 89 ++++++++++++- app/internal/controller/controller.go | 24 +++- .../controller/{retrieve.go => search.go} | 11 +- app/internal/controller/specification.go | 76 +++++++++++ app/internal/models/document.go | 3 +- app/internal/models/error.go | 6 + app/internal/mongodb/mongodb.go | 2 +- app/internal/mongodb/operations.go | 9 +- app/internal/mongodb/sync.go | 8 +- app/main.go | 11 +- 12 files changed, 449 insertions(+), 38 deletions(-) rename app/internal/controller/{retrieve.go => search.go} (63%) create mode 100644 app/internal/controller/specification.go create mode 100644 app/internal/models/error.go diff --git a/app/docs/docs.go b/app/docs/docs.go index 6a275708..35398d08 100644 --- a/app/docs/docs.go +++ b/app/docs/docs.go @@ -17,7 +17,7 @@ const docTemplate = `{ "paths": { "/search": { "post": { - "description": "retrieve OpenAPI specifications matching the given query", + "description": "Retrieve OpenAPI specifications matching the given query", "consumes": [ "application/json" ], @@ -28,6 +28,17 @@ const docTemplate = `{ "search" ], "summary": "Search OpenAPI specifications", + "parameters": [ + { + "description": "Search query", + "name": "fragment", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.EmbeddingRequest" + } + } + ], "responses": { "200": { "description": "OK", @@ -38,18 +49,125 @@ const docTemplate = `{ "400": { "description": "Bad Request", "schema": { - "type": "string" + "$ref": "#/definitions/models.HTTPError" + } + } + } + } + }, + "/specifications/insert": { + "post": { + "description": "Insert new OpenAPI specifications in the database.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "specification" + ], + "summary": "Insert OpenAPI specifications", + "parameters": [ + { + "type": "string", + "description": "Specification ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal Server Error", "schema": { - "type": "string" + "$ref": "#/definitions/models.HTTPError" + } + } + } + } + }, + "/specifications/{id}": { + "get": { + "description": "Retrieve a specific OpenAPI specification's content given a valid ID", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "specification" + ], + "summary": "Get OpenAPI specification", + "parameters": [ + { + "type": "string", + "description": "Specification ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.HTTPError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/models.HTTPError" } } } } } + }, + "definitions": { + "models.EmbeddingRequest": { + "type": "object", + "properties": { + "fragment": { + "type": "string" + } + } + }, + "models.HTTPError": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 400 + }, + "message": { + "type": "string", + "example": "Bad Request" + } + } + } } }` diff --git a/app/docs/swagger.json b/app/docs/swagger.json index e3d30008..d9f3c4b4 100644 --- a/app/docs/swagger.json +++ b/app/docs/swagger.json @@ -10,7 +10,7 @@ "paths": { "/search": { "post": { - "description": "retrieve OpenAPI specifications matching the given query", + "description": "Retrieve OpenAPI specifications matching the given query", "consumes": [ "application/json" ], @@ -21,6 +21,17 @@ "search" ], "summary": "Search OpenAPI specifications", + "parameters": [ + { + "description": "Search query", + "name": "fragment", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.EmbeddingRequest" + } + } + ], "responses": { "200": { "description": "OK", @@ -31,17 +42,124 @@ "400": { "description": "Bad Request", "schema": { - "type": "string" + "$ref": "#/definitions/models.HTTPError" + } + } + } + } + }, + "/specifications/insert": { + "post": { + "description": "Insert new OpenAPI specifications in the database.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "specification" + ], + "summary": "Insert OpenAPI specifications", + "parameters": [ + { + "type": "string", + "description": "Specification ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.HTTPError" } }, "500": { "description": "Internal Server Error", "schema": { - "type": "string" + "$ref": "#/definitions/models.HTTPError" + } + } + } + } + }, + "/specifications/{id}": { + "get": { + "description": "Retrieve a specific OpenAPI specification's content given a valid ID", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "specification" + ], + "summary": "Get OpenAPI specification", + "parameters": [ + { + "type": "string", + "description": "Specification ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.HTTPError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/models.HTTPError" } } } } } + }, + "definitions": { + "models.EmbeddingRequest": { + "type": "object", + "properties": { + "fragment": { + "type": "string" + } + } + }, + "models.HTTPError": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 400 + }, + "message": { + "type": "string", + "example": "Bad Request" + } + } + } } } \ No newline at end of file diff --git a/app/docs/swagger.yaml b/app/docs/swagger.yaml index ce819442..09fb5b1c 100644 --- a/app/docs/swagger.yaml +++ b/app/docs/swagger.yaml @@ -1,4 +1,19 @@ basePath: /api/v1 +definitions: + models.EmbeddingRequest: + properties: + fragment: + type: string + type: object + models.HTTPError: + properties: + code: + example: 400 + type: integer + message: + example: Bad Request + type: string + type: object info: contact: {} description: This is the backend for the API Scout platform. @@ -9,7 +24,14 @@ paths: post: consumes: - application/json - description: retrieve OpenAPI specifications matching the given query + description: Retrieve OpenAPI specifications matching the given query + parameters: + - description: Search query + in: body + name: fragment + required: true + schema: + $ref: '#/definitions/models.EmbeddingRequest' produces: - application/json responses: @@ -20,12 +42,69 @@ paths: "400": description: Bad Request schema: - type: string + $ref: '#/definitions/models.HTTPError' + summary: Search OpenAPI specifications + tags: + - search + /specifications/{id}: + get: + consumes: + - application/json + description: Retrieve a specific OpenAPI specification's content given a valid + ID + parameters: + - description: Specification ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.HTTPError' "500": description: Internal Server Error schema: - type: string - summary: Search OpenAPI specifications + $ref: '#/definitions/models.HTTPError' + summary: Get OpenAPI specification tags: - - search + - specification + /specifications/insert: + post: + consumes: + - application/json + description: Insert new OpenAPI specifications in the database. + parameters: + - description: Specification ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.HTTPError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/models.HTTPError' + summary: Insert OpenAPI specifications + tags: + - specification swagger: "2.0" diff --git a/app/internal/controller/controller.go b/app/internal/controller/controller.go index 4b7feb45..3a5217ed 100644 --- a/app/internal/controller/controller.go +++ b/app/internal/controller/controller.go @@ -1,16 +1,38 @@ package controller import ( + "backend/app/internal/elastic" + "backend/app/internal/models" + "backend/app/internal/mongodb" + "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) -func SetupRoutes(router *gin.Engine) { +func SetupRoutes(router *gin.Engine, config *models.Config) { + mongoClient := mongodb.Connect(config.Mongo) + elasticClient := elastic.Connect(config.Elastic) + + // Create routes v1 := router.Group("/api/v1") { v1.POST("/search", Search) + spec := v1.Group("/specification") + { + spec.GET("/:id", GetSpecificationHandler(mongoClient)) + spec.POST("/insert", PostSpecificationHandler(mongoClient, elasticClient)) + } } router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) } + +func NewHTTPError(ctx *gin.Context, status int, message string) { + body := models.HTTPError{ + Code: status, + Message: message, + } + + ctx.JSON(status, body) +} diff --git a/app/internal/controller/retrieve.go b/app/internal/controller/search.go similarity index 63% rename from app/internal/controller/retrieve.go rename to app/internal/controller/search.go index 6e6218da..c0580ec1 100644 --- a/app/internal/controller/retrieve.go +++ b/app/internal/controller/search.go @@ -14,20 +14,21 @@ type EmbeddingRequest = models.EmbeddingRequest // Search godoc // @Summary Search OpenAPI specifications -// @Description retrieve OpenAPI specifications matching the given query +// @Description Retrieve OpenAPI specifications matching the given query // @Tags search // @Accept json // @Produce json -// @Success 200 {string} ok -// @Failure 400 {string} Bad Request -// @Failure 500 {string} Internal Server Error +// @Param fragment body models.EmbeddingRequest true "Search query" +// TODO: Change this +// @Success 200 {string} OK +// @Failure 400 {object} models.HTTPError // @Router /search [post] func Search(ctx *gin.Context) { var body EmbeddingRequest err := ctx.BindJSON(&body) if err != nil { - ctx.JSON(http.StatusBadRequest, "") + NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") } embeddings := embedding.PerformPipeline([]string{body.Fragment}, true) diff --git a/app/internal/controller/specification.go b/app/internal/controller/specification.go new file mode 100644 index 00000000..92ca7e60 --- /dev/null +++ b/app/internal/controller/specification.go @@ -0,0 +1,76 @@ +package controller + +import ( + "backend/app/internal/mongodb" + "github.com/elastic/go-elasticsearch/v8" + "github.com/goccy/go-json" + "go.mongodb.org/mongo-driver/bson" + "net/http" + + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" +) + +// GetSpecificationHandler godoc +// @Summary Get OpenAPI specification +// @Description Retrieve a specific OpenAPI specification's content given a valid ID +// @Tags specification +// @Accept json +// @Produce json +// @Param id path string true "Specification ID" +// @Success 200 {object} map[string]interface{} +// @Failure 400 {object} models.HTTPError +// @Failure 500 {object} models.HTTPError +// @Router /specifications/{id} [get] +func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { + fn := func(ctx *gin.Context) { + id := ctx.Param("id") + db := mongoClient.Database("apis") + objId, err := primitive.ObjectIDFromHex(id) + + if err != nil { + NewHTTPError(ctx, http.StatusBadRequest, "The id has not been correctly formatted") + } + + // Retrieve document based on its id + query := bson.M{"_id": objId} + specDoc, err := mongodb.SearchDocument(db, query, "specifications") + + if err != nil { + NewHTTPError(ctx, http.StatusNotFound, "The document with the given ID has not been found") + } + + // Unmarshal raw bson into json document + var jsonMap map[string]interface{} + err = json.Unmarshal([]byte(specDoc.String()), &jsonMap) + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + } + + // Return the JSON representation of the document + ctx.JSON(http.StatusOK, jsonMap) + } + + return fn +} + +// PostSpecificationHandler godoc +// @Summary Insert OpenAPI specifications +// @Description Insert new OpenAPI specifications in the database. +// @Tags specification +// @Accept json +// @Produce json +// @Param id path string true "Specification ID" +// @Success 200 {object} map[string]interface{} +// @Failure 400 {object} models.HTTPError +// @Failure 500 {object} models.HTTPError +// @Router /specifications/insert [post] +func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc { + fn := func(ctx *gin.Context) { + + } + + return fn +} diff --git a/app/internal/models/document.go b/app/internal/models/document.go index 91532867..01d43436 100644 --- a/app/internal/models/document.go +++ b/app/internal/models/document.go @@ -1,6 +1,7 @@ package models import ( + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -8,7 +9,7 @@ import ( type SyncDocument struct { Id string `bson:"_id"` Collection string `bson:"coll"` - Api string + Api bson.Raw } // EsDocument - structure of an elasticsearch document to be sent to the elasticsearch client. diff --git a/app/internal/models/error.go b/app/internal/models/error.go new file mode 100644 index 00000000..31dbeff0 --- /dev/null +++ b/app/internal/models/error.go @@ -0,0 +1,6 @@ +package models + +type HTTPError struct { + Code int `json:"code" example:"400"` + Message string `json:"message" example:"Bad Request"` +} diff --git a/app/internal/mongodb/mongodb.go b/app/internal/mongodb/mongodb.go index 2fc90f68..7dff2f57 100644 --- a/app/internal/mongodb/mongodb.go +++ b/app/internal/mongodb/mongodb.go @@ -16,7 +16,7 @@ import ( func Connect(config models.MongoConfig) *mongo.Client { ctx := context.TODO() uri := fmt.Sprintf( - "%s://%s:%s@%s:%d/?directConnection=true&authSource=apis", + "%s://%s:%s@%s:%d/?authSource=apis", config.Protocol, config.User, config.Password, config.Host, config.Port, ) opts := options.Client().ApplyURI(uri) diff --git a/app/internal/mongodb/operations.go b/app/internal/mongodb/operations.go index 85a90569..840e7d5f 100644 --- a/app/internal/mongodb/operations.go +++ b/app/internal/mongodb/operations.go @@ -2,20 +2,15 @@ package mongodb import ( "context" - "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) // SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection // need to be passed to the function. -func SearchDocument(database *mongo.Database, query bson.M, collection string) string { +func SearchDocument(database *mongo.Database, query bson.M, collection string) (bson.Raw, error) { coll := database.Collection(collection) res, err := coll.FindOne(context.Background(), query).Raw() - if err != nil { - panic(err) - } - - return string(res) + return res, err } diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go index bb38ab25..59456874 100644 --- a/app/internal/mongodb/sync.go +++ b/app/internal/mongodb/sync.go @@ -67,9 +67,13 @@ func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, // TODO: If dealing with the `github` collection, look for the `latest` tag query := bson.M{"_id": docId} - document.Api = SearchDocument(database, query, document.Collection) + document.Api, err = SearchDocument(database, query, document.Collection) - embeddings := embedding.PerformPipeline([]string{document.Api}, false) + if err != nil { + panic(err) + } + + embeddings := embedding.PerformPipeline([]string{string(document.Api)}, false) esDocument := elastic.ParseDocument(&document, embeddings) elastic.SendDocument(esClient, esDocument, "embeddings") } diff --git a/app/main.go b/app/main.go index 0c9f4872..11a9f999 100644 --- a/app/main.go +++ b/app/main.go @@ -6,10 +6,7 @@ import ( "log" _ "backend/app/docs" - "backend/app/internal/elastic" "backend/app/internal/helpers" - "backend/app/internal/mongodb" - "github.com/gin-gonic/gin" ) @@ -21,15 +18,9 @@ import ( func main() { cfg := helpers.LoadConfigs() - mongoClient := mongodb.Connect(cfg.Mongo) - elasticClient := elastic.Connect(cfg.Elastic) - // Run the sync pipelines on different goroutines - go mongodb.WatchDatabase(mongoClient, elasticClient, "insert") - go mongodb.WatchDatabase(mongoClient, elasticClient, "delete") - // Start the webserver router := gin.Default() - controller.SetupRoutes(router) + controller.SetupRoutes(router, &cfg) err := router.Run(fmt.Sprintf(":%d", cfg.Backend.Port)) if err != nil { From dd88a8320f9f74af4b6608ad0023328752197ca5 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Thu, 21 Mar 2024 13:09:00 +0100 Subject: [PATCH 17/60] added routes for adding and getting specifications --- app/docs/docs.go | 31 +++++-- app/docs/swagger.json | 31 +++++-- app/docs/swagger.yaml | 37 ++++++--- app/internal/controller/controller.go | 4 +- app/internal/controller/search.go | 11 ++- app/internal/controller/specification.go | 86 +++++++++++++++++-- app/internal/controller/sync.go | 1 + app/internal/elastic/operations.go | 40 ++++----- app/internal/elastic/parser.go | 25 ------ app/internal/embedding/embedding.go | 10 +-- app/internal/embedding/pipeline.go | 10 ++- app/internal/embedding/preprocessing.go | 2 +- app/internal/models/document.go | 20 ----- app/internal/models/elastic.go | 11 ++- app/internal/models/specifications.go | 7 ++ app/internal/mongodb/operations.go | 8 ++ app/internal/mongodb/sync.go | 100 ----------------------- app/tests/embedding/pipeline_test.go | 12 +-- docs/elastic/index.html | 8 +- 19 files changed, 222 insertions(+), 232 deletions(-) create mode 100644 app/internal/controller/sync.go delete mode 100644 app/internal/elastic/parser.go delete mode 100644 app/internal/models/document.go create mode 100644 app/internal/models/specifications.go delete mode 100644 app/internal/mongodb/sync.go diff --git a/app/docs/docs.go b/app/docs/docs.go index 35398d08..008991d0 100644 --- a/app/docs/docs.go +++ b/app/docs/docs.go @@ -55,7 +55,7 @@ const docTemplate = `{ } } }, - "/specifications/insert": { + "/specification": { "post": { "description": "Insert new OpenAPI specifications in the database.", "consumes": [ @@ -70,11 +70,13 @@ const docTemplate = `{ "summary": "Insert OpenAPI specifications", "parameters": [ { - "type": "string", - "description": "Specification ID", - "name": "id", - "in": "path", - "required": true + "description": "New Specifications", + "name": "specifications", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.SpecificationsRequest" + } } ], "responses": { @@ -100,7 +102,7 @@ const docTemplate = `{ } } }, - "/specifications/{id}": { + "/specification/{id}": { "get": { "description": "Retrieve a specific OpenAPI specification's content given a valid ID", "consumes": [ @@ -167,6 +169,21 @@ const docTemplate = `{ "example": "Bad Request" } } + }, + "models.Specification": { + "type": "object", + "additionalProperties": true + }, + "models.SpecificationsRequest": { + "type": "object", + "properties": { + "specifications": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Specification" + } + } + } } } }` diff --git a/app/docs/swagger.json b/app/docs/swagger.json index d9f3c4b4..3bdf7efb 100644 --- a/app/docs/swagger.json +++ b/app/docs/swagger.json @@ -48,7 +48,7 @@ } } }, - "/specifications/insert": { + "/specification": { "post": { "description": "Insert new OpenAPI specifications in the database.", "consumes": [ @@ -63,11 +63,13 @@ "summary": "Insert OpenAPI specifications", "parameters": [ { - "type": "string", - "description": "Specification ID", - "name": "id", - "in": "path", - "required": true + "description": "New Specifications", + "name": "specifications", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.SpecificationsRequest" + } } ], "responses": { @@ -93,7 +95,7 @@ } } }, - "/specifications/{id}": { + "/specification/{id}": { "get": { "description": "Retrieve a specific OpenAPI specification's content given a valid ID", "consumes": [ @@ -160,6 +162,21 @@ "example": "Bad Request" } } + }, + "models.Specification": { + "type": "object", + "additionalProperties": true + }, + "models.SpecificationsRequest": { + "type": "object", + "properties": { + "specifications": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Specification" + } + } + } } } } \ No newline at end of file diff --git a/app/docs/swagger.yaml b/app/docs/swagger.yaml index 09fb5b1c..cf85aaf5 100644 --- a/app/docs/swagger.yaml +++ b/app/docs/swagger.yaml @@ -14,6 +14,16 @@ definitions: example: Bad Request type: string type: object + models.Specification: + additionalProperties: true + type: object + models.SpecificationsRequest: + properties: + specifications: + items: + $ref: '#/definitions/models.Specification' + type: array + type: object info: contact: {} description: This is the backend for the API Scout platform. @@ -46,18 +56,18 @@ paths: summary: Search OpenAPI specifications tags: - search - /specifications/{id}: - get: + /specification: + post: consumes: - application/json - description: Retrieve a specific OpenAPI specification's content given a valid - ID + description: Insert new OpenAPI specifications in the database. parameters: - - description: Specification ID - in: path - name: id + - description: New Specifications + in: body + name: specifications required: true - type: string + schema: + $ref: '#/definitions/models.SpecificationsRequest' produces: - application/json responses: @@ -74,14 +84,15 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/models.HTTPError' - summary: Get OpenAPI specification + summary: Insert OpenAPI specifications tags: - specification - /specifications/insert: - post: + /specification/{id}: + get: consumes: - application/json - description: Insert new OpenAPI specifications in the database. + description: Retrieve a specific OpenAPI specification's content given a valid + ID parameters: - description: Specification ID in: path @@ -104,7 +115,7 @@ paths: description: Internal Server Error schema: $ref: '#/definitions/models.HTTPError' - summary: Insert OpenAPI specifications + summary: Get OpenAPI specification tags: - specification swagger: "2.0" diff --git a/app/internal/controller/controller.go b/app/internal/controller/controller.go index 3a5217ed..58b4a0da 100644 --- a/app/internal/controller/controller.go +++ b/app/internal/controller/controller.go @@ -20,8 +20,8 @@ func SetupRoutes(router *gin.Engine, config *models.Config) { v1.POST("/search", Search) spec := v1.Group("/specification") { + spec.POST("/", PostSpecificationHandler(mongoClient, elasticClient)) spec.GET("/:id", GetSpecificationHandler(mongoClient)) - spec.POST("/insert", PostSpecificationHandler(mongoClient, elasticClient)) } } @@ -34,5 +34,5 @@ func NewHTTPError(ctx *gin.Context, status int, message string) { Message: message, } - ctx.JSON(status, body) + ctx.AbortWithStatusJSON(status, body) } diff --git a/app/internal/controller/search.go b/app/internal/controller/search.go index c0580ec1..a848f424 100644 --- a/app/internal/controller/search.go +++ b/app/internal/controller/search.go @@ -10,8 +10,6 @@ import ( "github.com/gin-gonic/gin" ) -type EmbeddingRequest = models.EmbeddingRequest - // Search godoc // @Summary Search OpenAPI specifications // @Description Retrieve OpenAPI specifications matching the given query @@ -24,13 +22,18 @@ type EmbeddingRequest = models.EmbeddingRequest // @Failure 400 {object} models.HTTPError // @Router /search [post] func Search(ctx *gin.Context) { - var body EmbeddingRequest + var body models.EmbeddingRequest err := ctx.BindJSON(&body) if err != nil { NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") } - embeddings := embedding.PerformPipeline([]string{body.Fragment}, true) + embeddings, err := embedding.PerformPipeline([]string{body.Fragment}, true) + + if err != nil { + NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + } + log.Print(len(embeddings.Predictions[0])) } diff --git a/app/internal/controller/specification.go b/app/internal/controller/specification.go index 92ca7e60..8f76e2c1 100644 --- a/app/internal/controller/specification.go +++ b/app/internal/controller/specification.go @@ -1,18 +1,23 @@ package controller import ( - "backend/app/internal/mongodb" - "github.com/elastic/go-elasticsearch/v8" + "backend/app/internal/elastic" + "backend/app/internal/embedding" "github.com/goccy/go-json" - "go.mongodb.org/mongo-driver/bson" "net/http" + "backend/app/internal/models" + "backend/app/internal/mongodb" + + "github.com/elastic/go-elasticsearch/v8" "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" ) // GetSpecificationHandler godoc +// // @Summary Get OpenAPI specification // @Description Retrieve a specific OpenAPI specification's content given a valid ID // @Tags specification @@ -22,7 +27,7 @@ import ( // @Success 200 {object} map[string]interface{} // @Failure 400 {object} models.HTTPError // @Failure 500 {object} models.HTTPError -// @Router /specifications/{id} [get] +// @Router /specification/{id} [get] func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { fn := func(ctx *gin.Context) { id := ctx.Param("id") @@ -31,6 +36,7 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { if err != nil { NewHTTPError(ctx, http.StatusBadRequest, "The id has not been correctly formatted") + return } // Retrieve document based on its id @@ -39,6 +45,7 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { if err != nil { NewHTTPError(ctx, http.StatusNotFound, "The document with the given ID has not been found") + return } // Unmarshal raw bson into json document @@ -47,6 +54,7 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return } // Return the JSON representation of the document @@ -57,20 +65,80 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { } // PostSpecificationHandler godoc +// // @Summary Insert OpenAPI specifications // @Description Insert new OpenAPI specifications in the database. // @Tags specification // @Accept json // @Produce json -// @Param id path string true "Specification ID" -// @Success 200 {object} map[string]interface{} -// @Failure 400 {object} models.HTTPError -// @Failure 500 {object} models.HTTPError -// @Router /specifications/insert [post] +// @Param specifications body models.SpecificationsRequest true "New Specifications" +// @Success 200 {object} map[string]interface{} +// @Failure 400 {object} models.HTTPError +// @Failure 500 {object} models.HTTPError +// @Router /specification [post] func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc { fn := func(ctx *gin.Context) { + var body models.SpecificationsRequest + var specifications []string + var specificationJSONs []interface{} + + err := ctx.BindJSON(&body) + + if err != nil { + NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + return + } + + for index := range body.Specifications { + var specification interface{} + + if body.Specifications[index]["api"] == nil { + NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + return + } + + jsonBody, err := json.Marshal(body.Specifications[index]) + err = json.Unmarshal(jsonBody, &specification) + if err != nil { + NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + return + } + + specificationJSONs = append(specificationJSONs, specification) + specifications = append(specifications, string(jsonBody)) + } + + db := mongoClient.Database("apis") + documentIDs, err := mongodb.InsertDocuments(db, specificationJSONs, "test") + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + + var embeddings *models.EmbeddingResponse + embeddings, err = embedding.PerformPipeline(specifications, false) + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + + for index, embeddingVal := range embeddings.Predictions { + var request models.EsRequest + request.MongoId = documentIDs.InsertedIDs[index].(primitive.ObjectID).Hex() + request.Embedding = embeddingVal + + err := elastic.InsertDocument(elasticClient, request, "test") + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + } } + return fn } diff --git a/app/internal/controller/sync.go b/app/internal/controller/sync.go new file mode 100644 index 00000000..b0b429f8 --- /dev/null +++ b/app/internal/controller/sync.go @@ -0,0 +1 @@ +package controller diff --git a/app/internal/elastic/operations.go b/app/internal/elastic/operations.go index c2d6d939..ad29b921 100644 --- a/app/internal/elastic/operations.go +++ b/app/internal/elastic/operations.go @@ -14,29 +14,29 @@ import ( "github.com/goccy/go-json" ) -// SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need +// InsertDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need // to be passed to the function. -func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string) { +func InsertDocument(client *elasticsearch.Client, document models.EsRequest, index string) error { jsonDocument, err := json.Marshal(document) if err != nil { - panic(err) + return err } res, err := client.Index(index, bytes.NewReader(jsonDocument)) - if err != nil { - return + if err == nil { + if os.Getenv("GIN_MODE") == "debug" { + log.Printf("[ELASTIC-debug] Indexing: %s", res.Status()) + } } - if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] Indexing: %s", res.Status()) - } + return err } // SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need // to be passed to the function. -func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse { +func SearchDocument(client *elasticsearch.Client, query string, index string) (*models.EsSearchResponse, error) { var response models.EsSearchResponse res, err := client.Search( @@ -46,7 +46,7 @@ func SearchDocument(client *elasticsearch.Client, query string, index string) *m ) if err != nil { - panic(err) + return nil, err } if os.Getenv("GIN_MODE") == "debug" { @@ -60,29 +60,25 @@ func SearchDocument(client *elasticsearch.Client, query string, index string) *m _, err = out.ReadFrom(tr) if err != nil { - panic(err) + return nil, err } // Unmarshal the byte array into the response err = json.Unmarshal([]byte(out.String()), &response) - if err != nil { - panic(err) - } - - return &response + return &response, err } // DeleteDocument - delete a document in an index based on its id. An elasticsearch client, an id and an index need to // be passed to the function. -func DeleteDocument(client *elasticsearch.Client, id string, index string) { +func DeleteDocument(client *elasticsearch.Client, id string, index string) error { res, err := client.Delete(index, id) - if err != nil { - return + if err == nil { + if os.Getenv("GIN_MODE") == "debug" { + log.Printf("[ELASTIC-debug] Delete: %s", res.Status()) + } } - if os.Getenv("GIN_MODE") == "debug" { - log.Printf("[ELASTIC-debug] Delete: %s", res.Status()) - } + return err } diff --git a/app/internal/elastic/parser.go b/app/internal/elastic/parser.go deleted file mode 100644 index 0107b90c..00000000 --- a/app/internal/elastic/parser.go +++ /dev/null @@ -1,25 +0,0 @@ -package elastic - -import ( - "backend/app/internal/models" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -// ParseDocument - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the -// Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the -// function. -func ParseDocument(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument { - var err error - var esDocument models.EsDocument - - esDocument.MongoId, err = primitive.ObjectIDFromHex(document.Id) - - if err != nil { - panic(err) - } - - esDocument.Collection = document.Collection - esDocument.Embedding = embeddings.Predictions[0] - - return &esDocument -} diff --git a/app/internal/embedding/embedding.go b/app/internal/embedding/embedding.go index d46a1357..f6533e7c 100644 --- a/app/internal/embedding/embedding.go +++ b/app/internal/embedding/embedding.go @@ -10,11 +10,9 @@ import ( "backend/app/internal/models" ) -type Embeddings = models.EmbeddingResponse - // Embed use the Universal Sentence Encoder model to transform the array of fragments (string) into an array of // embeddings (512-dimension float32 embedding). A list of embeddings needs to be passed to the function. -func Embed(fragments []string) *Embeddings { +func Embed(fragments []string) (*models.EmbeddingResponse, error) { body, _ := json.Marshal(map[string][]string{ "instances": fragments, }) @@ -29,11 +27,11 @@ func Embed(fragments []string) *Embeddings { // Error handling if err != nil { - log.Fatal(err) + return nil, err } // Decode the JSON body containing the embeddings - embeddings := new(Embeddings) + embeddings := new(models.EmbeddingResponse) err = json.NewDecoder(res.Body).Decode(embeddings) // Error handling @@ -41,5 +39,5 @@ func Embed(fragments []string) *Embeddings { log.Fatal(err) } - return embeddings + return embeddings, err } diff --git a/app/internal/embedding/pipeline.go b/app/internal/embedding/pipeline.go index 48fb17d8..50faf737 100644 --- a/app/internal/embedding/pipeline.go +++ b/app/internal/embedding/pipeline.go @@ -1,10 +1,14 @@ package embedding +import ( + "backend/app/internal/models" +) + // PerformPipeline - fragments are preprocessed and embeddings are generated and returned. An array of fragments // (string) and a boolean indicating if the fragments are queries or not need to be passed to the function. -func PerformPipeline(fragments []string, isQuery bool) *Embeddings { +func PerformPipeline(fragments []string, isQuery bool) (*models.EmbeddingResponse, error) { preprocessed := PreprocessFragment(fragments, isQuery) - embeddings := Embed(preprocessed) + embeddings, err := Embed(preprocessed) - return embeddings + return embeddings, err } diff --git a/app/internal/embedding/preprocessing.go b/app/internal/embedding/preprocessing.go index 7aa8d5cf..c76b9c23 100644 --- a/app/internal/embedding/preprocessing.go +++ b/app/internal/embedding/preprocessing.go @@ -79,7 +79,7 @@ func Stemming(fragments []string) []string { for _, word := range words { // Perform stemming and append to stemmed words array engStemmer := porter2.Stemmer - //Trim non-alphanumeric characters from strin + //Trim non-alphanumeric characters from string trimmedWord := strings.TrimFunc(word, func(r rune) bool { return !unicode.IsLetter(r) && !unicode.IsNumber(r) }) diff --git a/app/internal/models/document.go b/app/internal/models/document.go deleted file mode 100644 index 01d43436..00000000 --- a/app/internal/models/document.go +++ /dev/null @@ -1,20 +0,0 @@ -package models - -import ( - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -// SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. -type SyncDocument struct { - Id string `bson:"_id"` - Collection string `bson:"coll"` - Api bson.Raw -} - -// EsDocument - structure of an elasticsearch document to be sent to the elasticsearch client. -type EsDocument struct { - MongoId primitive.ObjectID `json:"mongo_id"` - Collection string `json:"mongo_collection"` - Embedding []float32 `json:"embedding"` -} diff --git a/app/internal/models/elastic.go b/app/internal/models/elastic.go index 697d113b..80f1bcf3 100644 --- a/app/internal/models/elastic.go +++ b/app/internal/models/elastic.go @@ -1,5 +1,11 @@ package models +// EsRequest - structure of an elasticsearch document to be sent to the elasticsearch client. +type EsRequest struct { + MongoId interface{} `json:"mongo_id"` + Embedding []float32 `json:"embedding"` +} + // EsSearchResponse - structure of the response sent by the elasticsearch client type EsSearchResponse struct { Hits struct { @@ -12,8 +18,7 @@ type Hit struct { Id string `json:"_id"` Index string `json:"_index"` Document struct { - MongoId string `json:"mongo_id"` - MongoCollection string `json:"mongo_collection"` - Embedding []float32 `json:"embedding"` + MongoId string `json:"mongo_id"` + Embedding []float32 `json:"embedding"` } `json:"_source"` } diff --git a/app/internal/models/specifications.go b/app/internal/models/specifications.go new file mode 100644 index 00000000..3c27ef14 --- /dev/null +++ b/app/internal/models/specifications.go @@ -0,0 +1,7 @@ +package models + +type SpecificationsRequest struct { + Specifications []Specification +} + +type Specification map[string]interface{} diff --git a/app/internal/mongodb/operations.go b/app/internal/mongodb/operations.go index 840e7d5f..66dc00b0 100644 --- a/app/internal/mongodb/operations.go +++ b/app/internal/mongodb/operations.go @@ -2,6 +2,7 @@ package mongodb import ( "context" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) @@ -14,3 +15,10 @@ func SearchDocument(database *mongo.Database, query bson.M, collection string) ( return res, err } + +func InsertDocuments(database *mongo.Database, documents []interface{}, collection string) (*mongo.InsertManyResult, error) { + coll := database.Collection(collection) + ids, err := coll.InsertMany(context.Background(), documents) + + return ids, err +} diff --git a/app/internal/mongodb/sync.go b/app/internal/mongodb/sync.go deleted file mode 100644 index 59456874..00000000 --- a/app/internal/mongodb/sync.go +++ /dev/null @@ -1,100 +0,0 @@ -package mongodb - -import ( - "context" - "fmt" - "log" - "time" - - "backend/app/internal/elastic" - "backend/app/internal/embedding" - "backend/app/internal/models" - - "github.com/elastic/go-elasticsearch/v8" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -// WatchDatabase - watch for a certain type of events in the mongodb `apis` database. The supported events are -// document insertion and document deletion. -func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string) { - db := client.Database("apis") - match := bson.D{{"$match", bson.D{{"operationType", operation}}}} - opts := options.ChangeStream().SetMaxAwaitTime(5 * time.Second) - - stream, err := db.Watch(context.TODO(), mongo.Pipeline{match}, opts) - - if err != nil { - log.Fatal(err) - } - - switch operation { - case "insert": - InsertDocuments(esClient, stream, db) - case "delete": - DeleteDocuments(esClient, stream, db) - } -} - -// InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and -// saved in the respective elasticsearch index. -func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { - for stream.Next(context.TODO()) { - var document models.SyncDocument - // Retrieve the mongo document id - err := stream.Current.Lookup("documentKey").Unmarshal(&document) - - if err != nil { - panic(err) - } - - // Retrieve the mongo document collection - err = stream.Current.Lookup("ns").Unmarshal(&document) - - if err != nil { - panic(err) - } - - // Create ObjectId for mongodb query - docId, err := primitive.ObjectIDFromHex(document.Id) - - if err != nil { - panic(err) - } - - // TODO: If dealing with the `github` collection, look for the `latest` tag - - query := bson.M{"_id": docId} - document.Api, err = SearchDocument(database, query, document.Collection) - - if err != nil { - panic(err) - } - - embeddings := embedding.PerformPipeline([]string{string(document.Api)}, false) - esDocument := elastic.ParseDocument(&document, embeddings) - elastic.SendDocument(esClient, esDocument, "embeddings") - } -} - -// DeleteDocuments - every time a documents is deleted from the database, it will be searched in the elasticsearch -// index (based on the mongodb ObjectId) and deleted from the elasticsearch database. -func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database) { - for stream.Next(context.TODO()) { - var specification models.SyncDocument - err := stream.Current.Lookup("documentKey").Unmarshal(&specification) - - if err != nil { - panic(err) - } - - query := fmt.Sprintf(`{"query": {"match": {"mongo_id": "%s"}}}`, specification.Id) - response := elastic.SearchDocument(esClient, query, "embeddings") - - for _, document := range response.Hits.Hits { - elastic.DeleteDocument(esClient, document.Id, document.Index) - } - } -} diff --git a/app/tests/embedding/pipeline_test.go b/app/tests/embedding/pipeline_test.go index 006aa131..ff5ea80e 100644 --- a/app/tests/embedding/pipeline_test.go +++ b/app/tests/embedding/pipeline_test.go @@ -13,7 +13,7 @@ func TestPipelineEmptyString(t *testing.T) { } fragments := []string{""} - res := embedding.PerformPipeline(fragments, true) + res, _ := embedding.PerformPipeline(fragments, true) if len(res.Predictions) != 1 || len(res.Predictions[0]) != 512 { t.Fatal(res) @@ -26,7 +26,7 @@ func TestPipelineEmptyArray(t *testing.T) { } var fragments []string - res := embedding.PerformPipeline(fragments, true) + res, _ := embedding.PerformPipeline(fragments, true) if len(res.Predictions) != 0 { t.Fatal(res) @@ -39,7 +39,7 @@ func TestPipelineQuery(t *testing.T) { } fragments := []string{"this is a test query"} - res := embedding.PerformPipeline(fragments, true) + res, _ := embedding.PerformPipeline(fragments, true) if len(res.Predictions) != 1 || len(res.Predictions[0]) != 512 { t.Fatal(res) @@ -52,7 +52,7 @@ func TestPipelineQueries(t *testing.T) { } fragments := []string{"this is a test query", "this is another different test query"} - res := embedding.PerformPipeline(fragments, true) + res, _ := embedding.PerformPipeline(fragments, true) if len(res.Predictions) != 2 || len(res.Predictions[0]) != 512 || len(res.Predictions[1]) != 512 { t.Fatal(res) @@ -65,7 +65,7 @@ func TestPipelineDocument(t *testing.T) { } fragments := []string{"{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"test title\",\n \"description\": \"test description\",\n \"version\": \"0.0.1\",\n \"summary\": 'test \"summary\"'\n }\n}"} - res := embedding.PerformPipeline(fragments, false) + res, _ := embedding.PerformPipeline(fragments, false) if len(res.Predictions) != 1 || len(res.Predictions[0]) != 512 { t.Fatal(res) @@ -78,7 +78,7 @@ func TestPipelineDocuments(t *testing.T) { } fragments := []string{"{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"test title\",\n \"description\": \"test description\",\n \"version\": \"0.0.1\",\n \"summary\": 'test \"summary\"'\n }\n}", "\"version\": \"0.0.1\""} - res := embedding.PerformPipeline(fragments, false) + res, _ := embedding.PerformPipeline(fragments, false) if len(res.Predictions) != 2 || len(res.Predictions[0]) != 512 || len(res.Predictions[1]) != 512 { t.Fatal(res) diff --git a/docs/elastic/index.html b/docs/elastic/index.html index 9941f367..622eafd1 100644 --- a/docs/elastic/index.html +++ b/docs/elastic/index.html @@ -26,7 +26,7 @@

    Index

  • func DeleteDocument(client *elasticsearch.Client, id string, index string)
  • func ParseDocument(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
  • func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
  • -
  • func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
  • +
  • func InsertDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
  • Functions

    func Connect

    func Connect(config models.ElasticConfig) *elasticsearch.Client
    @@ -45,9 +45,9 @@

    func SearchDocument

    func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need to be passed to the function. -

    func SendDocument

    -
    func SendDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
    -

    SendDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need +

    func InsertDocument

    +
    func InsertDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
    +

    InsertDocument - send and save a document in an elasticsearch index. An elasticsearch client, document and index need to be passed to the function.


    From be68f70c3549f3cf854ae121b917ad35b0bed4bb Mon Sep 17 00:00:00 2001 From: edoriggio Date: Thu, 21 Mar 2024 13:15:01 +0100 Subject: [PATCH 18/60] fixed workflow file --- .github/workflows/deploy-backend.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 5aaab3d3..1ee4ae6f 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -34,6 +34,10 @@ jobs: deploy: runs-on: ubuntu-latest needs: test + if: contains(' + refs/heads/dev + refs/heads/main + ', github.ref) steps: - name: Checkout repo uses: actions/checkout@v4 From ab683a304c8967568aed664c34059287d0cc5868 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Fri, 22 Mar 2024 13:01:49 +0100 Subject: [PATCH 19/60] fixed MongoResponse Object --- app/docs/docs.go | 46 ++++++++++++++--- app/docs/swagger.json | 46 ++++++++++++++--- app/docs/swagger.yaml | 30 +++++++++-- app/internal/controller/controller.go | 1 + app/internal/controller/specification.go | 47 +++++++++++------ app/internal/controller/sync.go | 65 ++++++++++++++++++++++++ app/internal/helpers/certificate.go | 2 +- app/internal/models/elastic.go | 4 +- app/internal/models/mongo.go | 44 ++++++++++++++++ app/internal/models/specifications.go | 2 +- app/internal/mongodb/operations.go | 11 +++- 11 files changed, 258 insertions(+), 40 deletions(-) create mode 100644 app/internal/models/mongo.go diff --git a/app/docs/docs.go b/app/docs/docs.go index 008991d0..fc9be415 100644 --- a/app/docs/docs.go +++ b/app/docs/docs.go @@ -81,11 +81,7 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": true - } + "description": "OK" }, "400": { "description": "Bad Request", @@ -128,8 +124,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.MongoResponseWithApi" } }, "400": { @@ -170,6 +165,43 @@ const docTemplate = `{ } } }, + "models.MongoResponse": { + "type": "object", + "properties": { + "api_id": { + "type": "integer" + }, + "api_version": { + "type": "string" + }, + "commits_n": { + "type": "integer" + }, + "is_latest": { + "type": "boolean" + }, + "mongo_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "oas_version": { + "type": "string" + } + } + }, + "models.MongoResponseWithApi": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/models.MongoResponse" + }, + "specification": { + "type": "string" + } + } + }, "models.Specification": { "type": "object", "additionalProperties": true diff --git a/app/docs/swagger.json b/app/docs/swagger.json index 3bdf7efb..d4cabd05 100644 --- a/app/docs/swagger.json +++ b/app/docs/swagger.json @@ -74,11 +74,7 @@ ], "responses": { "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": true - } + "description": "OK" }, "400": { "description": "Bad Request", @@ -121,8 +117,7 @@ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.MongoResponseWithApi" } }, "400": { @@ -163,6 +158,43 @@ } } }, + "models.MongoResponse": { + "type": "object", + "properties": { + "api_id": { + "type": "integer" + }, + "api_version": { + "type": "string" + }, + "commits_n": { + "type": "integer" + }, + "is_latest": { + "type": "boolean" + }, + "mongo_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "oas_version": { + "type": "string" + } + } + }, + "models.MongoResponseWithApi": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/models.MongoResponse" + }, + "specification": { + "type": "string" + } + } + }, "models.Specification": { "type": "object", "additionalProperties": true diff --git a/app/docs/swagger.yaml b/app/docs/swagger.yaml index cf85aaf5..dfa96e07 100644 --- a/app/docs/swagger.yaml +++ b/app/docs/swagger.yaml @@ -14,6 +14,30 @@ definitions: example: Bad Request type: string type: object + models.MongoResponse: + properties: + api_id: + type: integer + api_version: + type: string + commits_n: + type: integer + is_latest: + type: boolean + mongo_id: + type: string + name: + type: string + oas_version: + type: string + type: object + models.MongoResponseWithApi: + properties: + metadata: + $ref: '#/definitions/models.MongoResponse' + specification: + type: string + type: object models.Specification: additionalProperties: true type: object @@ -73,9 +97,6 @@ paths: responses: "200": description: OK - schema: - additionalProperties: true - type: object "400": description: Bad Request schema: @@ -105,8 +126,7 @@ paths: "200": description: OK schema: - additionalProperties: true - type: object + $ref: '#/definitions/models.MongoResponseWithApi' "400": description: Bad Request schema: diff --git a/app/internal/controller/controller.go b/app/internal/controller/controller.go index 58b4a0da..efa03e59 100644 --- a/app/internal/controller/controller.go +++ b/app/internal/controller/controller.go @@ -22,6 +22,7 @@ func SetupRoutes(router *gin.Engine, config *models.Config) { { spec.POST("/", PostSpecificationHandler(mongoClient, elasticClient)) spec.GET("/:id", GetSpecificationHandler(mongoClient)) + spec.PUT("/sync", SyncSpecificationsHandler(mongoClient, elasticClient)) } } diff --git a/app/internal/controller/specification.go b/app/internal/controller/specification.go index 8f76e2c1..1b1b1dec 100644 --- a/app/internal/controller/specification.go +++ b/app/internal/controller/specification.go @@ -1,16 +1,17 @@ package controller import ( - "backend/app/internal/elastic" - "backend/app/internal/embedding" - "github.com/goccy/go-json" + "log" "net/http" + "backend/app/internal/elastic" + "backend/app/internal/embedding" "backend/app/internal/models" "backend/app/internal/mongodb" "github.com/elastic/go-elasticsearch/v8" "github.com/gin-gonic/gin" + "github.com/goccy/go-json" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" @@ -24,7 +25,7 @@ import ( // @Accept json // @Produce json // @Param id path string true "Specification ID" -// @Success 200 {object} map[string]interface{} +// @Success 200 {object} models.MongoResponseWithApi // @Failure 400 {object} models.HTTPError // @Failure 500 {object} models.HTTPError // @Router /specification/{id} [get] @@ -41,18 +42,21 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { // Retrieve document based on its id query := bson.M{"_id": objId} - specDoc, err := mongodb.SearchDocument(db, query, "specifications") + specDoc, err := mongodb.RetrieveDocument(db, query, "specifications") if err != nil { NewHTTPError(ctx, http.StatusNotFound, "The document with the given ID has not been found") return } - // Unmarshal raw bson into json document - var jsonMap map[string]interface{} - err = json.Unmarshal([]byte(specDoc.String()), &jsonMap) + // Unmarshal raw bson into MongoResponse object + var jsonMap models.MongoResponseWithApi + err = bson.Unmarshal(specDoc, &jsonMap.MongoResponse) + jsonMap.MongoResponse.InitObject() + jsonMap.Specification = specDoc.Lookup("api").String() if err != nil { + log.Print(err) NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") return } @@ -71,10 +75,10 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { // @Tags specification // @Accept json // @Produce json -// @Param specifications body models.SpecificationsRequest true "New Specifications" -// @Success 200 {object} map[string]interface{} -// @Failure 400 {object} models.HTTPError -// @Failure 500 {object} models.HTTPError +// @Param specifications body models.SpecificationsRequest true "New Specifications" +// @Success 200 +// @Failure 400 {object} models.HTTPError +// @Failure 500 {object} models.HTTPError // @Router /specification [post] func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc { fn := func(ctx *gin.Context) { @@ -126,11 +130,25 @@ func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elastics } for index, embeddingVal := range embeddings.Predictions { + jsonSpecification, err := json.Marshal(specificationJSONs[index]) + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + var request models.EsRequest - request.MongoId = documentIDs.InsertedIDs[index].(primitive.ObjectID).Hex() + err = json.Unmarshal(jsonSpecification, &request.MongoDocument) + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + + request.MongoDocument.MongoId = documentIDs.InsertedIDs[index].(primitive.ObjectID).Hex() request.Embedding = embeddingVal - err := elastic.InsertDocument(elasticClient, request, "test") + err = elastic.InsertDocument(elasticClient, request, "test") if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") @@ -139,6 +157,5 @@ func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elastics } } - return fn } diff --git a/app/internal/controller/sync.go b/app/internal/controller/sync.go index b0b429f8..0338a250 100644 --- a/app/internal/controller/sync.go +++ b/app/internal/controller/sync.go @@ -1 +1,66 @@ package controller + +import ( + "context" + "log" + "net/http" + + "backend/app/internal/elastic" + "backend/app/internal/embedding" + "backend/app/internal/models" + "backend/app/internal/mongodb" + + "github.com/elastic/go-elasticsearch/v8" + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc { + fn := func(ctx *gin.Context) { + documents, err := mongodb.RetrieveDocuments(mongoClient.Database("apis"), bson.D{{}}, "specifications") + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return + } + + current := 1 + total := 1422195 + + for documents.Next(context.TODO()) { + log.Printf("Saving document %d/%d - [%d%%]", current, total, current / total) + + var document models.MongoResponse + specification := documents.Current.Lookup("api") + err := documents.Decode(&document) + + if err != nil { + panic(err) + } + + document.InitObject() + + var embeddings *models.EmbeddingResponse + embeddings, err = embedding.PerformPipeline([]string{specification.String()}, false) + + if err != nil { + panic(err) + } + + var esDocument models.EsRequest + esDocument.MongoDocument = document + esDocument.Embedding = embeddings.Predictions[0] + + err = elastic.InsertDocument(elasticClient, esDocument, "apis") + + if err != nil { + panic(err) + } + + current++ + } + } + + return fn +} diff --git a/app/internal/helpers/certificate.go b/app/internal/helpers/certificate.go index 9fb209d1..f37a3709 100644 --- a/app/internal/helpers/certificate.go +++ b/app/internal/helpers/certificate.go @@ -7,7 +7,7 @@ import ( // GetCertificate - retrieve the elasticsearch cluster certificate. func GetCertificate() []byte { pwd, _ := os.Getwd() - cert, _ := os.ReadFile(pwd + "/ca.crt") + cert, _ := os.ReadFile(pwd + "/local-ca.crt") return cert } diff --git a/app/internal/models/elastic.go b/app/internal/models/elastic.go index 80f1bcf3..6124745d 100644 --- a/app/internal/models/elastic.go +++ b/app/internal/models/elastic.go @@ -2,8 +2,8 @@ package models // EsRequest - structure of an elasticsearch document to be sent to the elasticsearch client. type EsRequest struct { - MongoId interface{} `json:"mongo_id"` - Embedding []float32 `json:"embedding"` + MongoDocument MongoResponse + Embedding []float32 `json:"embedding"` } // EsSearchResponse - structure of the response sent by the elasticsearch client diff --git a/app/internal/models/mongo.go b/app/internal/models/mongo.go new file mode 100644 index 00000000..984387a3 --- /dev/null +++ b/app/internal/models/mongo.go @@ -0,0 +1,44 @@ +package models + +import ( + "strings" + + "go.mongodb.org/mongo-driver/bson" +) + +type MongoResponse struct { + MongoId string `json:"mongo_id" bson:"_id"` + Name string `json:"name" bson:"_name"` + ApiId int `json:"api_id" bson:"id"` + ApiVersion string `json:"api_version" bson:"_version"` + OASVersion string `json:"oas_version"` + Commits int `json:"commits_n" bson:"commits"` + Latest bool `json:"is_latest" bson:"latest"` + + Specification bson.Raw `json:"-" bson:"api"` + NameAlt string `json:"-" bson:"api_title"` + ApiVersionAlt string `json:"-" bson:"api_version"` +} + +type MongoResponseWithApi struct { + MongoResponse MongoResponse `json:"metadata"` + Specification string `json:"specification"` +} + +func (b *MongoResponse) InitObject() { + oasOpenapi := b.Specification.Lookup("openapi").String() + oasSwagger := b.Specification.Lookup("swagger").String() + oasOpenapi = strings.Trim(oasOpenapi, `\\"`) + oasSwagger = strings.Trim(oasSwagger, `\\"`) + + if strings.Compare(oasOpenapi, "") != 0 { + b.OASVersion = oasOpenapi + } else { + b.OASVersion = oasSwagger + } + + if strings.Compare(b.NameAlt, "") != 0 { + b.Name = b.NameAlt + b.ApiVersion = b.ApiVersionAlt + } +} diff --git a/app/internal/models/specifications.go b/app/internal/models/specifications.go index 3c27ef14..955ba7d0 100644 --- a/app/internal/models/specifications.go +++ b/app/internal/models/specifications.go @@ -1,7 +1,7 @@ package models type SpecificationsRequest struct { - Specifications []Specification + Specifications []Specification `json:"specifications"` } type Specification map[string]interface{} diff --git a/app/internal/mongodb/operations.go b/app/internal/mongodb/operations.go index 66dc00b0..6468e54b 100644 --- a/app/internal/mongodb/operations.go +++ b/app/internal/mongodb/operations.go @@ -7,15 +7,22 @@ import ( "go.mongodb.org/mongo-driver/mongo" ) -// SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection +// RetrieveDocument - search a document in a collection based on a query. A mongodb database, a query and a collection // need to be passed to the function. -func SearchDocument(database *mongo.Database, query bson.M, collection string) (bson.Raw, error) { +func RetrieveDocument(database *mongo.Database, query bson.M, collection string) (bson.Raw, error) { coll := database.Collection(collection) res, err := coll.FindOne(context.Background(), query).Raw() return res, err } +func RetrieveDocuments(database *mongo.Database, query bson.D, collection string) (*mongo.Cursor, error) { + coll := database.Collection(collection) + res, err := coll.Find(context.Background(), query) + + return res, err +} + func InsertDocuments(database *mongo.Database, documents []interface{}, collection string) (*mongo.InsertManyResult, error) { coll := database.Collection(collection) ids, err := coll.InsertMany(context.Background(), documents) From 0f653517f48f31e21be144df27ab3ce503eb3631 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Fri, 22 Mar 2024 13:02:02 +0100 Subject: [PATCH 20/60] fixed MongoResponse Object --- .github/workflows/deploy-backend.yml | 4 ---- .gitignore | 2 +- docs/elastic/index.html | 8 ++++---- docs/mongodb/index.html | 8 ++++---- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 40324de6..1ee4ae6f 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -32,10 +32,6 @@ jobs: path: tests-result.txt deploy: - if: contains(' - refs/heads/dev - refs/heads/main - ', github.ref) runs-on: ubuntu-latest needs: test if: contains(' diff --git a/.gitignore b/.gitignore index e2f948a7..836abe98 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ go.work .vscode/ .DS_Store -ca.crt +*.crt *.config.yml !config/template.config.yml models/* diff --git a/docs/elastic/index.html b/docs/elastic/index.html index 622eafd1..515345ee 100644 --- a/docs/elastic/index.html +++ b/docs/elastic/index.html @@ -25,7 +25,7 @@

    Index

  • func Connect(config models.ElasticConfig) *elasticsearch.Client
  • func DeleteDocument(client *elasticsearch.Client, id string, index string)
  • func ParseDocument(document *models.SyncDocument, embeddings *models.EmbeddingResponse) *models.EsDocument
  • -
  • func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
  • +
  • func RetrieveDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
  • func InsertDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
  • Functions

    func Connect

    @@ -41,9 +41,9 @@

    func ParseDocument

    ParseDocument - converts the SyncDocument returned by the mongo client, as well as the embeddings returned by the Universal Sentence Encoder model, into an EsDocument. A mongo document and an embedding need to be passed to the function. -

    func SearchDocument

    -
    func SearchDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
    -

    SearchDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need +

    func RetrieveDocument

    +
    func RetrieveDocument(client *elasticsearch.Client, query string, index string) *models.EsSearchResponse
    +

    RetrieveDocument - search a document in an index based on a query. An elasticsearch client, a query and an index need to be passed to the function.

    func InsertDocument

    func InsertDocument(client *elasticsearch.Client, document *models.EsDocument, index string)
    diff --git a/docs/mongodb/index.html b/docs/mongodb/index.html index 4726b0f7..1e78d84e 100644 --- a/docs/mongodb/index.html +++ b/docs/mongodb/index.html @@ -25,7 +25,7 @@

    Index

  • func Connect(config models.MongoConfig) *mongo.Client
  • func DeleteDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, ...)
  • func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, ...)
  • -
  • func SearchDocument(database *mongo.Database, query bson.M, collection string) string
  • +
  • func RetrieveDocument(database *mongo.Database, query bson.M, collection string) string
  • func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string)
  • Functions

    func Connect

    @@ -40,9 +40,9 @@

    func InsertDocuments

    func InsertDocuments(esClient *elasticsearch.Client, stream *mongo.ChangeStream, database *mongo.Database)

    InsertDocuments - every time a document is inserted in the database, it will be taken from mongodb, embedded, and saved in the respective elasticsearch index. -

    func SearchDocument

    -
    func SearchDocument(database *mongo.Database, query bson.M, collection string) string
    -

    SearchDocument - search a document in a collection based on a query. A mongodb database, a query and a collection +

    func RetrieveDocument

    +
    func RetrieveDocument(database *mongo.Database, query bson.M, collection string) string
    +

    RetrieveDocument - search a document in a collection based on a query. A mongodb database, a query and a collection need to be passed to the function.

    func WatchDatabase

    func WatchDatabase(client *mongo.Client, esClient *elasticsearch.Client, operation string)
    From 340cd2cdaed720b871b11ed39e9da9a7d025a43e Mon Sep 17 00:00:00 2001 From: edoriggio Date: Fri, 22 Mar 2024 17:35:18 +0100 Subject: [PATCH 21/60] sync pipeline also handles reconciliation --- app/internal/controller/specification.go | 2 - app/internal/controller/sync.go | 49 +++++++++++++++--------- app/internal/models/elastic.go | 4 +- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/app/internal/controller/specification.go b/app/internal/controller/specification.go index 1b1b1dec..5cb2f3c4 100644 --- a/app/internal/controller/specification.go +++ b/app/internal/controller/specification.go @@ -1,7 +1,6 @@ package controller import ( - "log" "net/http" "backend/app/internal/elastic" @@ -56,7 +55,6 @@ func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc { jsonMap.Specification = specDoc.Lookup("api").String() if err != nil { - log.Print(err) NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") return } diff --git a/app/internal/controller/sync.go b/app/internal/controller/sync.go index 0338a250..37652bc7 100644 --- a/app/internal/controller/sync.go +++ b/app/internal/controller/sync.go @@ -2,6 +2,7 @@ package controller import ( "context" + "fmt" "log" "net/http" @@ -17,12 +18,12 @@ import ( ) func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc { + // TODO: Move SyncSpecificationsHandler function somewhere else fn := func(ctx *gin.Context) { documents, err := mongodb.RetrieveDocuments(mongoClient.Database("apis"), bson.D{{}}, "specifications") if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") - return } current := 1 @@ -36,26 +37,38 @@ func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elastic err := documents.Decode(&document) if err != nil { - panic(err) + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") } - document.InitObject() - - var embeddings *models.EmbeddingResponse - embeddings, err = embedding.PerformPipeline([]string{specification.String()}, false) - - if err != nil { - panic(err) - } + log.Printf("Mongo ID: %s", document.MongoId) - var esDocument models.EsRequest - esDocument.MongoDocument = document - esDocument.Embedding = embeddings.Predictions[0] - - err = elastic.InsertDocument(elasticClient, esDocument, "apis") - - if err != nil { - panic(err) + document.InitObject() + query := fmt.Sprintf(`{"query": {"match": {"metadata.mongo_id": "%s"}}}`, document.MongoId) + res, err := elastic.SearchDocument(elasticClient, query, "apis") + + if len(res.Hits.Hits) == 0 { + var embeddings *models.EmbeddingResponse + embeddings, err = embedding.PerformPipeline([]string{specification.String()}, false) + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + } + + if len(embeddings.Predictions) != 0 { + var esDocument models.EsRequest + esDocument.MongoDocument = document + esDocument.Embedding = embeddings.Predictions[0] + + err = elastic.InsertDocument(elasticClient, esDocument, "apis") + + if err != nil { + NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + } + } else { + log.Print("No embedding was produced, skipping") + } + } else { + log.Printf("Already exists, skipping") } current++ diff --git a/app/internal/models/elastic.go b/app/internal/models/elastic.go index 6124745d..81ce46f8 100644 --- a/app/internal/models/elastic.go +++ b/app/internal/models/elastic.go @@ -2,8 +2,8 @@ package models // EsRequest - structure of an elasticsearch document to be sent to the elasticsearch client. type EsRequest struct { - MongoDocument MongoResponse - Embedding []float32 `json:"embedding"` + MongoDocument MongoResponse `json:"metadata"` + Embedding []float32 `json:"embedding"` } // EsSearchResponse - structure of the response sent by the elasticsearch client From 04c89c3cb298a8833e7d45796701d1e869aadffa Mon Sep 17 00:00:00 2001 From: edoriggio Date: Fri, 22 Mar 2024 17:50:52 +0100 Subject: [PATCH 22/60] added some documentation --- app/internal/controller/search.go | 2 ++ app/internal/controller/sync.go | 3 +++ app/internal/helpers/certificate.go | 3 ++- app/internal/models/error.go | 1 + app/internal/models/mongo.go | 7 +++++-- app/internal/models/specifications.go | 2 ++ app/internal/mongodb/operations.go | 4 ++++ app/main.go | 2 +- 8 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/internal/controller/search.go b/app/internal/controller/search.go index a848f424..5d79d2c4 100644 --- a/app/internal/controller/search.go +++ b/app/internal/controller/search.go @@ -27,12 +27,14 @@ func Search(ctx *gin.Context) { if err != nil { NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + return } embeddings, err := embedding.PerformPipeline([]string{body.Fragment}, true) if err != nil { NewHTTPError(ctx, http.StatusBadRequest, "The query has not been correctly formatted") + return } log.Print(len(embeddings.Predictions[0])) diff --git a/app/internal/controller/sync.go b/app/internal/controller/sync.go index 37652bc7..b7cebfc2 100644 --- a/app/internal/controller/sync.go +++ b/app/internal/controller/sync.go @@ -38,6 +38,7 @@ func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elastic if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return } log.Printf("Mongo ID: %s", document.MongoId) @@ -52,6 +53,7 @@ func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elastic if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return } if len(embeddings.Predictions) != 0 { @@ -63,6 +65,7 @@ func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elastic if err != nil { NewHTTPError(ctx, http.StatusInternalServerError, "Something went wrong, try again later") + return } } else { log.Print("No embedding was produced, skipping") diff --git a/app/internal/helpers/certificate.go b/app/internal/helpers/certificate.go index f37a3709..1ac5b165 100644 --- a/app/internal/helpers/certificate.go +++ b/app/internal/helpers/certificate.go @@ -1,13 +1,14 @@ package helpers import ( + "fmt" "os" ) // GetCertificate - retrieve the elasticsearch cluster certificate. func GetCertificate() []byte { pwd, _ := os.Getwd() - cert, _ := os.ReadFile(pwd + "/local-ca.crt") + cert, _ := os.ReadFile(pwd + fmt.Sprintf("/%s-ca.crt", os.Getenv("GIN_MODE"))) return cert } diff --git a/app/internal/models/error.go b/app/internal/models/error.go index 31dbeff0..683ead49 100644 --- a/app/internal/models/error.go +++ b/app/internal/models/error.go @@ -1,5 +1,6 @@ package models +// HTTPError - structure of the error response sent by the backend type HTTPError struct { Code int `json:"code" example:"400"` Message string `json:"message" example:"Bad Request"` diff --git a/app/internal/models/mongo.go b/app/internal/models/mongo.go index 984387a3..894bb0cc 100644 --- a/app/internal/models/mongo.go +++ b/app/internal/models/mongo.go @@ -6,6 +6,7 @@ import ( "go.mongodb.org/mongo-driver/bson" ) +// MongoResponse - structure of the Mongo document sent by the db type MongoResponse struct { MongoId string `json:"mongo_id" bson:"_id"` Name string `json:"name" bson:"_name"` @@ -16,15 +17,17 @@ type MongoResponse struct { Latest bool `json:"is_latest" bson:"latest"` Specification bson.Raw `json:"-" bson:"api"` - NameAlt string `json:"-" bson:"api_title"` - ApiVersionAlt string `json:"-" bson:"api_version"` + NameAlt string `json:"-" bson:"api_title"` + ApiVersionAlt string `json:"-" bson:"api_version"` } +// MongoResponseWithApi - structure containing both the mongo document and the embedding created by the backend type MongoResponseWithApi struct { MongoResponse MongoResponse `json:"metadata"` Specification string `json:"specification"` } +// InitObject - function to fix the initiated object func (b *MongoResponse) InitObject() { oasOpenapi := b.Specification.Lookup("openapi").String() oasSwagger := b.Specification.Lookup("swagger").String() diff --git a/app/internal/models/specifications.go b/app/internal/models/specifications.go index 955ba7d0..e5001c76 100644 --- a/app/internal/models/specifications.go +++ b/app/internal/models/specifications.go @@ -1,7 +1,9 @@ package models +// SpecificationsRequest - structure of the request to be sent to the backend whenever new specifications are added type SpecificationsRequest struct { Specifications []Specification `json:"specifications"` } +// Specification - type of the single specification type Specification map[string]interface{} diff --git a/app/internal/mongodb/operations.go b/app/internal/mongodb/operations.go index 6468e54b..c73c3b88 100644 --- a/app/internal/mongodb/operations.go +++ b/app/internal/mongodb/operations.go @@ -16,6 +16,8 @@ func RetrieveDocument(database *mongo.Database, query bson.M, collection string) return res, err } +// RetrieveDocuments - search documents in a collection based on a query. A mongodb database, a query and a collection +// need to be passed to the function. func RetrieveDocuments(database *mongo.Database, query bson.D, collection string) (*mongo.Cursor, error) { coll := database.Collection(collection) res, err := coll.Find(context.Background(), query) @@ -23,6 +25,8 @@ func RetrieveDocuments(database *mongo.Database, query bson.D, collection string return res, err } +// InsertDocuments - insert documents in a collection based on a query. A mongodb database, a document and a collection +// need to be passed to the function. func InsertDocuments(database *mongo.Database, documents []interface{}, collection string) (*mongo.InsertManyResult, error) { coll := database.Collection(collection) ids, err := coll.InsertMany(context.Background(), documents) diff --git a/app/main.go b/app/main.go index 11a9f999..58c4803a 100644 --- a/app/main.go +++ b/app/main.go @@ -14,7 +14,7 @@ import ( // @version 1.0 // @description This is the backend for the API Scout platform. -// @BasePath /api/v1 +// @BasePath /api/v1 func main() { cfg := helpers.LoadConfigs() From 0f8d4d8349eee14a9488834d1222c7b4ccf5174d Mon Sep 17 00:00:00 2001 From: Edoardo Riggio Date: Fri, 22 Mar 2024 18:09:33 +0100 Subject: [PATCH 23/60] Update deploy-backend.yml --- .github/workflows/deploy-backend.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 1ee4ae6f..2065e3a8 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -59,6 +59,9 @@ jobs: with: context: . file: ./Dockerfile + build-args: | + "GIN_MODE=release" + "MODELS_HOST=models" push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} From 0f198482fd9849741554fc7a8b5636b297a293ce Mon Sep 17 00:00:00 2001 From: Edoardo Riggio Date: Fri, 22 Mar 2024 18:15:27 +0100 Subject: [PATCH 24/60] removed not needed build args --- .github/workflows/deploy-backend.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/deploy-backend.yml b/.github/workflows/deploy-backend.yml index 2065e3a8..1ee4ae6f 100644 --- a/.github/workflows/deploy-backend.yml +++ b/.github/workflows/deploy-backend.yml @@ -59,9 +59,6 @@ jobs: with: context: . file: ./Dockerfile - build-args: | - "GIN_MODE=release" - "MODELS_HOST=models" push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} From 3c251b6530d38fc09d12557d262047fef20fc8f0 Mon Sep 17 00:00:00 2001 From: edoriggio Date: Mon, 25 Mar 2024 12:18:10 +0100 Subject: [PATCH 25/60] updated the documentation --- .../fragment/unknown_455b5ce.pf_fragment | Bin 0 -> 1708 bytes .../fragment/unknown_6acfcfa.pf_fragment | Bin 0 -> 574 bytes .../fragment/unknown_ba11e75.pf_fragment | Bin 0 -> 808 bytes .../fragment/unknown_c7b999b.pf_fragment | Bin 0 -> 565 bytes .../fragment/unknown_fa99fd0.pf_fragment | Bin 0 -> 791 bytes .../_/pagefind/index/unknown_9923a1f.pf_index | Bin 0 -> 5372 bytes docs/_/pagefind/pagefind-entry.json | 2 +- .../pagefind.unknown_d32456ea962894a.pf_meta | Bin 0 -> 155 bytes docs/controller/index.html | 67 +++++++++++---- docs/elastic/index.html | 24 ++---- docs/embedding/index.html | 30 +++---- docs/models/index.html | 78 ++++++++++++++---- docs/mongodb/index.html | 27 +++--- 13 files changed, 142 insertions(+), 86 deletions(-) create mode 100644 docs/_/pagefind/fragment/unknown_455b5ce.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_6acfcfa.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_ba11e75.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_c7b999b.pf_fragment create mode 100644 docs/_/pagefind/fragment/unknown_fa99fd0.pf_fragment create mode 100644 docs/_/pagefind/index/unknown_9923a1f.pf_index create mode 100644 docs/_/pagefind/pagefind.unknown_d32456ea962894a.pf_meta diff --git a/docs/_/pagefind/fragment/unknown_455b5ce.pf_fragment b/docs/_/pagefind/fragment/unknown_455b5ce.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..c6f21d44e10add82a0f6cee9c62ce9dcbf5059e4 GIT binary patch literal 1708 zcmV;d22=STiwFP!00002|J7K{a@#f#eiaT+X~#bjDan>^Nt#YP(>9qTO%JxmhDgXl zLJ=%M#rAmo?p+Wdu>c8*n&~AM%UCQveEWk1mIb+|YnG?CX_7vNyD|$e!qY8JX(mp? zqcGulMe_=T1xdbxZlLB)0=6x9Sq0bO3MOcto|2+CWuRT=B-04jVNg94GX}#y7a_2W7lXKqC{4Hqd zE&`*6c=G)g@M@mtYANKE)w&d_ExNXs9z?2-}%m_U7U95|Y? zMCHQO&DG61}2{hspO+596ySV1M6e(8&7t%7wb_=p>gJxRwN}A zsn12blcC?}wJfyPg~#0_w{s#$oBey7Zz(1jgSpn4&$ZO`zauubzGsziMprlR(;Bb= zk>cK!bYS-f=*eq=V*38emyhqtk~iUM$A;uvD8K5cYC;JJpc>OhvMn+Sg4twJ7d0w` ztm@7=*ebEL;tfdy9T{bs*|*0gT2J&^rVE%R&ziVMkG2L}rY@yhR@aKlJf)A_IVqLX zZA#ji+J&oYw#GalIollt-<1i~j$nu6ss1zm?ntA6|dlq6Wz=@l{zb_07bo&PRYbkH+OvbJNV*EvyF3YA{c5570u_Q) zA6DOJ0)<6stOCEzD?9)Saz*VXxJcIQvEGV-0;_YHE46Og{==#bxZ%V<Q(0$2rdz>?mBb44fyzi|6nw6KusYRy~CmSK*~@yuzE8 zqdIw{%B5=23Q}#Lfg9-4V5|BtgO(Nm3dxfVmwR13L*qiXstw#kpv+R)5PrWu=3vAR zMjs>qeeAZ0AkVn6EWDV!99c+lgJiW{2CCa8T5vNPP81~X1w4_rph49mgERH=>Lt{} zWV-ZI(Ht}*gJlE;Cz|iYsn51SX@&^nd@qJ>whW397@THc=xl(MY3pV8Zt(O7qb$at=++)(NGm{C=ib{7+~69;oWxoV zB&=-gFHvE-bnd!Iyl1U!>CtjM#0ZOFgzg#XJs#0yIgFzlQRk?+_DrK;l+nj4n$CS8 zK~1+48hZwT4ZR2OSBR0fZWPbP;qAF}qxftjui-m4noY*x?74EISv-=@xEnW`Ee3<= zDUj|QejCpB5Nxa2xO^RYWY~D}Yk&dMBaAefS^eF`Ks7^*wLAbze{`?_jSQil#bZ&; zXB&fR$uR2KSXBLu2iNpQfM4#Dv3TkWkb!H*7;QEd&1!57s4K?U=ZEADd=#?NM+p$# zGCDl!7OE@8*zQ4`^&^|FKn8Z-2PUUuibfrI{Y7TzP9{>Pj C{!ohm literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/fragment/unknown_6acfcfa.pf_fragment b/docs/_/pagefind/fragment/unknown_6acfcfa.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..ee4b3b4250ceb23c88005f39d76e1a3803cd3d43 GIT binary patch literal 574 zcmV-E0>S+siwFP!00002|CN+WZ`&{o$G-}pQ&YG}AK3=vHl#b`+5x+?MWIMcEL4^} zNlsb>`R=3qh-b%1(2HU7@gw;M&77}srHp)&Lhe}MG@G#rYVLy)6P7SxO+XXKnsf0^ z!B9KLpt9V$055Dw9yD^o^L(Nx+!?ML#tVa0VFb*rF(|^g^L0h^m0Ck)C2BwZRi(^J z;|Q*6gh%c~I-YAqjWnrn1BFKk!GfqQ^cvDbe^nMp9{7@b9K#~OR%s0mL*Wc?(~A@p zKcqZ>Any_n6>@Yd>oWLTpi}63QzS<|bL z_)&k20G+e0$07w}X#ftgv8i&fDmk_$W3MWBLXY9+@W@G-BIzmHWP{b{q(aVptwS6- zP8F0j^?VEC(S_d7UE_tJ54|^A;Gd9$_F-6rE}KN~XsX^l-wbHcowy{PQR0vsfnQVN zcS-6g(KTLBBCglxi4C~AKFCuspU~%)v`8vlM!iy{Fy&~Mwu4u7&#gz@*%udtuE*9o z`6g@;56Ingny{79bRRsM?bsjX)lz8{KH2Pw$cjYw^*_PirAX4N4}?G-6I`2Tj0aDQ^fAS(jy)@TjG!VQ^f9)^@vB#mUwsjegC@u M2MDY_p7NsgUlY%iX0D>%i$aEv}^1DhN=woQ9KF zC@nc6#-Ax3w*DrFFjCsWy)z*vO1H(Ls3j;vOBNK6?j4xMlEYWD!w9*U3eK!h@{UP2 z1={C52$l5IRUqgb@G&)-nRN)Bkj*^ob`J!2%2gaLhH)4&y-32K7ooiDcfl0n;o=$% z*CI-d0a`6^hQKyaucv)5kT;4>G($-VGZqLJy4P?qVxFm1x#S!p3r{97`dYa$$F;>Y z3xRSYW_>Vp0_lO(F;bgLcO!7>E8U5(jDeG*BUq}*6LPzPP`MbG=J%vo12mD627d|b zUq%8hZkY&Tjd1o##@%StztLLhZCHDM*g(a^H?&GOY%PVmg0YA8A>;N3&Nn&D-CqaX zzQD(X&8wu3FSbE9XEruKYHC187fiI5b>lG0?<=!UO?B>iIW+(SW~|_AXKor~n)|hy zt1DC$U6(k}HM%op;pL$c=XK#ig7pzxX4!-pZ2qOpDyS3XF4h#6u4D%IJ4R#ILL}~> z98i_w|4BkFywuwlkh(b!SdVeY6>lmC4WHJdk~COBl4`{~FMJ=tSGoue8#L0P4@ znVD+lg^3D_oZN&HbX`KP(2<`%Eks0&de^-UT=`7W%vfKT$}5qL(F%Is-c8e{|5>GS z<82(Je$(9fbD*=tl!Y5fUu-0A;KntP0MetwEM_a zob12j&!-J%DgwHUaXL%qr!Zn70$~?UXY6$Io##BP8cv9oB_Z8xJ0|Zq?awz>B$czm z21t>GpM=IF_f=AJymT^x2a1d&gx1O-~9@1#kB=%x9iaAUf&Axp0I6|^V&0K16IM@{M;fOAD`4i mY=&Y7r|2nwwZGJY)lESadQV)T(0P0Hu=)d(K1an43IG699EbA& literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/fragment/unknown_c7b999b.pf_fragment b/docs/_/pagefind/fragment/unknown_c7b999b.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..34c996fa385db263489250a3df0b8f58de6c8068 GIT binary patch literal 565 zcmV-50?Pd#iwFP!00002|E-iwZyGTWhX2aQCsJ)7B&i~CtKhYqT<7Z}G*>BEQxKu{INg;QvaGDKRFSBN4<)X(DCaei)0!4E! z-l-VsWEWJHTNmJ!EhvLV_IRH66qP%}b;EdNuq=##p*03Y=$`#`h`v-SLQ2%WJBdez zW#|sRm4NP0D{9{yfO{xBN(dH29ih*V9;O1x17C2DT^I-0D6PR^D4YR)C=nGhq&$G& z1{QdL=IEBzW$>#&r_h5nCHx32rym=SE{v=wG6MO_(N1%y*<@7zCm@>|n9WPQmR#U& zpU_TP(@u)o`rwoy89Mdpiaz0HJ4IjUkN`So-CesaDWuBCNf#BjKVioyWZaFHi*CE{ zSTe4BDCZ$1o4RF2)GMfH9Ti`)0JD7t%-S%j0LM{x8_`Y5V<${e1riUYA=$p9TN` DQIHc; literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/fragment/unknown_fa99fd0.pf_fragment b/docs/_/pagefind/fragment/unknown_fa99fd0.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..304507c9a7b1892aaf3dbf7c8c7af166bc8d4534 GIT binary patch literal 791 zcmV+y1L*u8iwFP!00002|E*O`bJ{Qv{VO{@LB~J>ZPRkgfzG7UNoh#iLz2k|dkvb% zk}HX%Oosp7m5gm{4CRoUy&q3+pH{mWTVTRv{1`{^Yp~KH7zYDP=NQLaE(SpuL`qte zmh2geo+unjcOQ6~DQ)3Cn3E4>JYZQi;FO>x6BW*V0Le;5FmZ^VYfx8D| zHN|$J^Db2}3e%qy`8Q}XB@KpvS}WbnlVN2L>=NOpv85H#4eAtUQWf-m`BtkJe8deeAK3sy}#y0XK zVr(3ZIYP#aA@YtBF>zX0!YWkxOGG1k%NAze(yCVRwHpXM!2Hjjas3UfvnE=lz{;AT z^L6(98e$c#{BQB$z!=<2X18!Tz3PS}MhqJ5O3Ruq`MD+pC8-Xj0a>&x(Mbu}rt`^C zOi{c0n(_<(tn}TIXM&M9u8h znM>swyY?UD9$pzQE`-%dJ2PtZanEWVBT7#Jkr3 z1*Z9;Tn;Io$8KdlEqWw{e&+b%FlZ{bEmCp`<+@SHV0^X-Yha@S%+Ie1rP`vk^!EqT ztNqXfsd;vw4q`P1W&>~ETVa0sco1`MqBLRK0xIP5;paop#RF>q?wEIAE{?#|I(-kV V>8(JAXBV4?%|F-vbDV7n008yBfWZI& literal 0 HcmV?d00001 diff --git a/docs/_/pagefind/index/unknown_9923a1f.pf_index b/docs/_/pagefind/index/unknown_9923a1f.pf_index new file mode 100644 index 0000000000000000000000000000000000000000..2bb548149abe6107c0d9d98edc1e4de3415595cb GIT binary patch literal 5372 zcmVBhLgtbH zA+FWinK#Go%)Hq*Z+2(7w{}-r2_XrAjQ~5C`>>PP;DD1jj_)|}g$cwV#IYS4+h5|u zi4!OO@`WV7>h77HU5PLMtn{j?`&C!h@vC}M@p68)P|kE_(wV`>)GeG|w|4Cyw+*L= zR#Ao?;jVMm4RUNaNjbWY{+iS0u3gI<<0QRmrOu=*9p&_Tvup^2v#A@8XJeIuR0kLF z|4gCem#c-KEJVn3u;-2Nq&@iWTG~l+(^F2b+c-XKq%yS6 z>d}GKmBNs<*@rlGXoXf+X>|j%nyJ+styV%ktyV+BleLWV!6EwS0KMoo7{%Me&>O(j?@Q4ccDI$tg2t!`ST*((t~oYSpFHaBAb^R-J}d#KAv<>kHj3I76Wv`5}&$ z4$4s&6pMZcC&9boT-V1+`9-f971D!vyAf$Wj!3D?&twYaob~GC@00h76&Q8U+$coo zSdmhY@rzY^@Z)b%3d*@415?F~NXbdyB-sMq9)sPd%%BCS`eZIUUWfxk4X2;Y=`PRw zKS{5%-{n>P4D%%M(e-c-<9F-nR=S_Ny8L15t?lqN@~83?PFo)OU~-|&Q+@mLMY zNHYf##>d6Mr)qVQRl%=q-rF2GxsMy?KB?k@qggsVsk8sjKsZ@xn4Qe}#4Qj^T9JI{JglPcAEvWm<}6N=RkXd9R%FZJ^LYoKMTeHC>(_ zg+#I7mm@gM!33>91}r6~!CgK~Ww41ZM7|!f+3*m(B-b@f=-hT-*%Y|Vi^-`-2Uj5V zzCmGVEYuEI71>i-tzyFld!wk`;W+B+XS>!`sTyfGU7AEOT zh^$F%q-9*ToJ^3emCR8l84QxDgBOkGS--UTn^tg7#;>NsLdANHfP+~`9CvYH95xZa zl5gw)pFYy?X;hl+R5S4AYG8`pG$8uWR_d`f-^j7iB;AGojnen%Ct97O)vX-gm!NG) z+5z%Kv=b|~LJzn5SP)$VB^(is5r0tL2~(YgcOZQ6#=FhC0?zneI`0;3<(w-~u=Ac3 z@x)ZQtk}LJ9Cxv}E@T#A-5PVdSJ2B`a`Fwsm^?j>(Na#V`@^nln(Qj-csdWG92kr6 z+4JcF)Qvj`scCPLHe=ylI!G_l-<#K7iIA2+KAEfIHnA$ODKu^`tBx#)#)*!rW3-ul zQ*~j4JrW($B{&MrLX2d%52lz#x628PK@KOe`wmK@LfudAn95WIdi=gtcfdMVkp~Y< z&;hPAHwpdTn$5;i+^`r{xQcsQ_|*zR*mnZh83G=6HwAEs%7V{j8L~AvHS`yozpoi(nBtSQV{Sdb3g9WSOPc6(k7!|+T zxQ20u#tz^=gj3YLQpMCqT=%O07u}9>t~3PZ&R%WO90mdHby*pOUK%e{2=X;aS_ksE z(B@3;ajeK|nsOc9b|yzHj0pyXpXRb&p;!yWgnNw9)&jp2P@>Y=LcNh(E@MAi47{kd zr^y-0IqTT&w8$bH*Y9KlcSW>?^Np8^pCt$z0MQ}%6p9`%z9$7(e z%FXP;vMKahismEzcvM2odVrp!7Z@%QlpG{V(cj>?R!#%_qQ;#-%i*cTRK1OsqF{8h zIw-`mkcfup59oWsNTNL�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 J8Q8=C002r-L#hA( literal 0 HcmV?d00001 diff --git a/docs/controller/index.html b/docs/controller/index.html index ac7d468d..9af0cca2 100644 --- a/docs/controller/index.html +++ b/docs/controller/index.html @@ -22,30 +22,61 @@
    import "backend/app/internal/controller"

    Index

    Functions

    - -
    func Search(ctx *gin.Context)
    -

    Search godoc -

    @Summary		Search OpenAPI specifications
    -@Description	retrieve OpenAPI specifications matching the given query
    -@Tags			search
    +  

    func GetSpecificationHandler

    +
    func GetSpecificationHandler(mongoClient *mongo.Client) gin.HandlerFunc
    +

    GetSpecificationHandler godoc +

    @Summary		Get OpenAPI specification
    +@Description	Retrieve a specific OpenAPI specification's content given a valid ID
    +@Tags			specification
    +@Accept			json
    +@Produce		json
    +@Param			id	path		string	true	"Specification ID"
    +@Success		200	{object}	models.MongoResponseWithApi
    +@Failure		400	{object}	models.HTTPError
    +@Failure		500	{object}	models.HTTPError
    +@Router			/specification/{id} [get]
    +
    +

    func NewHTTPError

    +
    func NewHTTPError(ctx *gin.Context, status int, message string)
    +

    func PostSpecificationHandler

    +
    func PostSpecificationHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc
    +

    PostSpecificationHandler godoc +

    @Summary		Insert OpenAPI specifications
    +@Description	Insert new OpenAPI specifications in the database.
    +@Tags			specification
     @Accept			json
     @Produce		json
    -@Success		200	{string} ok
    -@Failure		400	{string} Bad Request
    -@Failure		500	{string} Internal Server Error
    -@Router			/search [post]
    +@Param			specifications	body	models.SpecificationsRequest	true	"New Specifications"
    +@Success		200
    +@Failure		400	{object}	models.HTTPError
    +@Failure		500	{object}	models.HTTPError
    +@Router			/specification [post]
    +
    + +
    func Search(ctx *gin.Context)
    +

    Search godoc +

    	@Summary		Search OpenAPI specifications
    +	@Description	Retrieve OpenAPI specifications matching the given query
    +	@Tags			search
    +	@Accept			json
    +	@Produce		json
    +	@Param			fragment	body		models.EmbeddingRequest	true	"Search query"
    + TODO: Change this
    +	@Success		200			{string}	OK
    +	@Failure		400			{object}	models.HTTPError
    +	@Router			/search [post]
     

    func SetupRoutes

    -
    func SetupRoutes(router *gin.Engine)
    -

    Types

    -

    type EmbeddingRequest

    -
    type EmbeddingRequest = models.EmbeddingRequest
    +
    func SetupRoutes(router *gin.Engine, config *models.Config)
    +

    func SyncSpecificationsHandler

    +
    func SyncSpecificationsHandler(mongoClient *mongo.Client, elasticClient *elasticsearch.Client) gin.HandlerFunc

    EmbeddingResponse - structure of the response sent back by the embedding server. -

    type EsDocument

    -
    type EsDocument struct {
    -	MongoId    primitive.ObjectID `json:"mongo_id"`
    -	Collection string             `json:"mongo_collection"`
    -	Embedding  []float32          `json:"embedding"`
    +

    type EsRequest

    +
    type EsRequest struct {
    +	MongoDocument MongoResponse `json:"metadata"`
    +	Embedding     []float32     `json:"embedding"`
     }
    -

    EsDocument - structure of an elasticsearch document to be sent to the elasticsearch client. +

    EsRequest - structure of an elasticsearch document to be sent to the elasticsearch client.

    type EsSearchResponse

    type EsSearchResponse struct {
     	Hits struct {
    @@ -98,14 +112,19 @@ 

    type EsSearchResponse

    } `json:"hits"` }

    EsSearchResponse - structure of the response sent by the elasticsearch client +

    type HTTPError

    +
    type HTTPError struct {
    +	Code    int    `json:"code" example:"400"`
    +	Message string `json:"message" example:"Bad Request"`
    +}
    +

    HTTPError - structure of the error response sent by the backend

    type Hit

    type Hit struct {
     	Id       string `json:"_id"`
     	Index    string `json:"_index"`
     	Document struct {
    -		MongoId         string    `json:"mongo_id"`
    -		MongoCollection string    `json:"mongo_collection"`
    -		Embedding       []float32 `json:"embedding"`
    +		MongoId   string    `json:"mongo_id"`
    +		Embedding []float32 `json:"embedding"`
     	} `json:"_source"`
     }

    Hit - structure of an elasticsearch document @@ -118,13 +137,38 @@

    type MongoConfig

    Password string `yaml:"password"` }

    MongoConfig - all mongodb-related configurations. -

    type SyncDocument

    -
    type SyncDocument struct {
    -	Id         string `bson:"_id"`
    -	Collection string `bson:"coll"`
    -	Api        string
    +

    type MongoResponse

    +
    type MongoResponse struct {
    +	MongoId    string `json:"mongo_id" bson:"_id"`
    +	Name       string `json:"name" bson:"_name"`
    +	ApiId      int    `json:"api_id" bson:"id"`
    +	ApiVersion string `json:"api_version" bson:"_version"`
    +	OASVersion string `json:"oas_version"`
    +	Commits    int    `json:"commits_n" bson:"commits"`
    +	Latest     bool   `json:"is_latest" bson:"latest"`
    +
    +	Specification bson.Raw `json:"-" bson:"api"`
    +	NameAlt       string   `json:"-" bson:"api_title"`
    +	ApiVersionAlt string   `json:"-" bson:"api_version"`
    +}
    +

    MongoResponse - structure of the Mongo document sent by the db +

    func (*MongoResponse) InitObject

    +
    func (b *MongoResponse) InitObject()
    +

    InitObject - function to fix the initiated object +

    type MongoResponseWithApi

    +
    type MongoResponseWithApi struct {
    +	MongoResponse MongoResponse `json:"metadata"`
    +	Specification string        `json:"specification"`
    +}
    +

    MongoResponseWithApi - structure containing both the mongo document and the embedding created by the backend +

    type Specification

    +
    type Specification map[string]interface{}
    +

    Specification - type of the single specification +

    type SpecificationsRequest

    +
    type SpecificationsRequest struct {
    +	Specifications []Specification `json:"specifications"`
     }
    -

    SyncDocument - structure of the document returned by the mongodb driver and used in the sync process. +

    SpecificationsRequest - structure of the request to be sent to the backend whenever new specifications are added