diff --git a/code/go/Makefile b/code/go/Makefile index f61ce9647..413f8246d 100644 --- a/code/go/Makefile +++ b/code/go/Makefile @@ -8,9 +8,11 @@ update: check: lint check-spec +# "yamlschema" directory has been excluded from linting, because it contains implementations of gojsonschema interfaces +# which are not compliant with linter rules. The golint tool doesn't support ignore comments. lint: @go get -u golang.org/x/lint/golint - @go list ./... | xargs -n 1 golint -set_exit_status + @go list ./... | grep -v yamlschema | xargs -n 1 golint -set_exit_status # Checks that the spec is up-to-date check-spec: diff --git a/code/go/go.mod b/code/go/go.mod index 56f0dbae4..06aff470c 100644 --- a/code/go/go.mod +++ b/code/go/go.mod @@ -8,7 +8,9 @@ require ( github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/stretchr/testify v1.6.1 + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 + github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/tools v0.0.0-20200826040757-bc8aaaa29e06 // indirect + golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65 // indirect gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c ) diff --git a/code/go/go.sum b/code/go/go.sum index f1fc71dcd..47f4fdb65 100644 --- a/code/go/go.sum +++ b/code/go/go.sum @@ -11,9 +11,17 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -24,6 +32,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -35,9 +44,16 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuH golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200826040757-bc8aaaa29e06 h1:ChBCbOHeLqK+j+znGPlWCcvx/t2PdxmyPBheVZxXbcc= golang.org/x/tools v0.0.0-20200826040757-bc8aaaa29e06/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3 h1:r3P/5xOq/dK1991B65Oy6E1fRF/2d/fSYZJ/fXGVfJc= +golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200828161849-5deb26317202 h1:DrWbY9UUFi/sl/3HkNVoBjDbGfIPZZfgoGsGxOL1EU8= +golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65 h1:DajXNh69ob79PCQz1N7OHxmqq6ASZC5xAnJJWIQGR6I= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= diff --git a/code/go/internal/spec/statik.go b/code/go/internal/spec/statik.go index aeab66f01..50fa37112 100644 --- a/code/go/internal/spec/statik.go +++ b/code/go/internal/spec/statik.go @@ -8,7 +8,7 @@ import ( func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00 \x001/changelog.spec.ymlUT\x05\x00\x01\x80Cm8\x9cT\xdfo\x94@\x10~\xe7\xaf\x98\x1c&\xd5(\xd0F\x8d\x91\xb7\xc6\xd6\x1as\xb6\x8d\xfab\xfc\x91,0\xc0\x94ew\xdd\x1dzw\xff\xbd\x81=\xee\xb8\x1f\xad\xd1y!\xf3\xcd\xb7\xc37\xdf2\x84a\x10\x86p\x81.\xb7\x94\xa1\x03\xae\x11\x9c\xc1\x9cJ\xca\x05\x93VPj;\xa0F\xe4\x8d\xa8\xf0\xc4\xc1\xbb\x0f\xe7\xd7W\x97\xf3\x9b+(Ib\x10\x86A\x7f\"\x0d\x00B\xb8\xbcG\xbb\xe2\x9aT\x05\x9d*\xd0B\x8d\x16\xa1\xd4R\xea\x85\x83\x8f_n\xae\xc1\xe55\xb6\x02\x9e\xd6\xcc\xc6\xa5Ir\xe7\xb4\x8a<\x18k[%\xcf^\xc0\xc2\x123*\x10\x0e\xbe\x9d\x7f\x9a\x0f\x1a,\x8aBd$\x89W\x01\x00\xaf\x0c\xa6 \xac\x15}F\x8c\xad\xeb\x05\x8c\x05\x9d\xdda\xce\x03 \x8a\x82\xfaA\x84\xbc\xb5\xda\xa0eB\x97B)\xa4\xc3\xa1n\xb6\xe8\x90\x03\xdc\xa3u\xa4\xd5\x98\x02\x14\x83=\xa6\xef\x92\xc2\xad\xf7ad\xc5\x1b\x96\x7f\xb3cK\xaa\xda\x80F0\xa3U)\x9c\xfc\xfa~\x1a\xbd\xfd\xf9\xfcG\xbc\xfb|r\xb2\xe1\xe2R\xb4Fnu\x00D0;\x8bO\xe3W\xb35\x92\xd7BUS\xc2\x8e\xb299\x06]\x8e, 5^\xdaCbG\xff|L\\\x9c\x92&^\xfa\xf8\x9b\xa3>\x0e}\xf51\x95\xbcS\xd8\x9b\xe6b\x9bl\x87\x8a\xf7N\x1c\xf5\xdc\xc7\xa1\x9b>\"\x98\xbd\xa7%dV7\xa8\x80\xb15R0\xce\x82\x83\xb6\x8f\x89\xfb\xba2\xf8\x7f\xaaT\xd7\x1eQ\x94Y\x14\x0d\xa9*\xf2\x0dgG\x18]U\xd2\xf2H\x01U-T\x8e-*>Rm\x94^\xa8\x88\x9c\xeb\xf6\x9aJR\xcd\xa3#\xceI5\xc0\x1a\x86\xb3\xa0-\xdc~^\x13\xb2~\xbb\xbd\xd0\xfe\x1b+\x90\x05\xc9\x7f\xf1\xe0\xe1\x9b\x19\xff \x15q\xddeq\xae\xdb\x04\xa5pLy\x92\xa1`\x97\x0cj\\r\xf6\xf2\xf5\xe9\x9b\xe9@\x16\x7fwd\xb1\x98\xf6\x8c\xa6\x03\xed\xe0\xbd\xb8\x1d\xa0w#8\xec\x13\x8d\x8b\xb3\xce\xd6\x9b\xf5'\x00\x00\xff\xffPK\x07\x08\xeeO\xccS\xf8\x01\x00\x005\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00 \x001/changelog.ymlUT\x05\x00\x01\x80Cm8l\x8f\xb1N\x031\x10D{\x7f\xc5H\xae\xcfNZ\xf7\x14i\x80\"?\xb08{\xe7U\x1c\xdb\xca\xee!\xf1\xf7(\x864\x88v5\xfbf\x9e\xf7\xce{\x9c\x8b(V\xa9\x8cK\xcf\xfb\x8d\x9b)r\xa1\xb6\xb1B\x1a\xac0\x06\xe5+m\x0c\x1d\x9ce\x95L&\xbd\x05\x9c\x0c\xa2x};\x83\xfe\x8fLlp\xde\xbb\x05\x9f|W\xe9-\xe1\x18\x0e\xe1\xb0P\x1d\x85\x8e\x0e\xcf\xaa\xe4\x80\x05\x17\xd6|\x97a3xjbB\xf5\xf9\x89\xbe\xce1/\x95\xd4$\xe3\xfdO\xe3\xdc\xe4\x00\xc0\xbe\x06'p+\xd42?\x84\xe6\xb5J\xbb&\x14\xb3\xa1)\xc6M\xac\xec\x1f!\xf7[\xe4\x1f`\xfcUX\x1e\xc08\xf6Z5\x1e\xddw\x00\x00\x00\xff\xffPK\x07\x08ms,a\xbc\x00\x00\x00$\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00 \x001/dataset/_dev/spec.ymlUT\x05\x00\x01\x80Cm8D\xce\xb1\xaa\xc30\x0c\x85\xe1=Oq\x08w\xbd\xc9\xee\xb5\xd0\xf70\xf6I18r*)C\xde\xbe\xd8\xa4T\xe3\xcf'$;\x98\xc2\x04\xc4\x9c\x8b\x97&\xb1>\x9a8\xc5-`\x8b\xd58\x01\xe9[&\x00\xf8G\xa6%-G\xe7\x01\xcfV3u\x98X\xa4\xc8\x0bNs(\xad\x9d\x9ahc\x07\xf0\xeb`\xc06\xf0\x9d$\xee\x0cC\xdfA\xf9>\x8b2\xff.\xf7\xf9Sn\x01\xf3\xb2v\xb9\xf6\x7f\x97k\xaf\xf3'\x00\x00\xff\xffPK\x07\x08T\xb6\xb4\x9c\x7f\x00\x00\x00\xb9\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00 \x001/dataset/_dev/test/pipeline/config.spec.ymlUT\x05\x00\x01\x80Cm8\x9c\x90\xb1j31\x10\x84{=\xc5\x80\x8a\xff\x0f\xc4q\x7f] I\x11\xe2$\x90*\xa5|Z\xf9\xd6\xc8\x92\xd8\xdd\xb3\xf1\xdb\x87\xbb3\x04\x8c\xab\xa8\x12\xbb\xb3|3\xe3\xbd\xf3\x1eO\xa4\xbd\xf0\x96\x146\x10\xb4Q\xcf\x89\xfb`\\\x0bR\x15\x04\xc4`A\xc9\xfe)\x8eA\xb8\x8e\x8a\xc4\x94#\"%.\xbc\x089\x93:\xef\xddt\xdf9\xc0\xe3\xf9Hr\xb6\x81\xcb\x0ec\x89$\x18H\x08\xa9\xe6\\O\x8a\xd7\xaf\x8fwh?\xd0!\xe0\xff`\xd6\xb4[\xaf\xf7Z\xcbj\x19>T\xd9\xad\xef\xeeq\x126\xa3\x82\xa0\xf8~\xdc\xbc\xcd\x8e\x84B\x0c[\xcelg\x07\xd8\xb9Q\x87\xba\xddSo\x0e\x081\xce\x96B\xfe\x94\xdaH\x8cI;\xa4\x90\x95\x1c\xd0~g\x0e\xc0\x12\xe4\xf2\x07\xe2\\E\x9b\xce;\xbc\\e\xd4\x8b\xe8\x8a7\xbd\xdbL\x93\x91f\xc1a\xcc\xc6\x99\x0b\xdd\xe4l\xa6\xedjZ\xa3\xaf%\xf1n\x94\xb9\xfc\xbf\xe0~\x02\x00\x00\xff\xffPK\x07\x08\x07V+\xa7\xf9\x00\x00\x00\xd2\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00 \x001/dataset/_dev/test/pipeline/event.spec.ymlUT\x05\x00\x01\x80Cm8l\x90OK\xc4@\x0c\xc5\xef\xf3)\x1e\xccA\x05u\xef\xbd \x8a \xfe\x03O\x1e\xb3\x9dt\x9bev\xa6&i\x97~{\xd9m\xd1\x83\xcei\xf8\xe5=\xf2#1\x86\x18q\xcf\xd6\xaal\xd9\xe0=\xc3\x06n\xa5\x93\x96\\jAW\x15\x84DN\xc6~a\x98H\xa5\x8e\x86N8'$\xee\xa4\xc8\x12\x94\xcc\x16b\x0c\xa7~\x13\x80\x88\x87\x89u\xf6^\xca\x0ecI\xac\xe8Y\x19]\xcd\xb9\x1e\x0dO\x1fo\xaf\xb0\xb6\xe7\x03\xe1\xb2w\x1f\xac\xd9l\xf6V\xcb\xcd\x02o\xab\xee6W\xd78\xaa\xb8s\x01\x19>\xef^\x9e\xcfF\xca\x94h+Y|\x0e\x80\xcf\x037\xa8\xdb=\xb7\x1e\x00J\xe9\xacD\xf9]\xeb\xc0\xea\xc2\xd6\xa0\xa3l\x1c\x80\xe1\x97\x05\x00\xe0\x89\x8b\xaf\x7f \x9dO1\x9c\xea\x0d\x1ee\xe2\xb2\x06\xd6\xf9\xb2\x8aTi^\x898\x1f~\xea\x7f\\\x96\xf7\xbf\x91\xeb\xc8kD\xf9k\x14\xe5\xb4\xc0\xef\x00\x00\x00\xff\xffPK\x07\x08`\xe3\x1d\x18\xf3\x00\x00\x00\x96\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00 \x001/dataset/_dev/test/pipeline/expected.spec.ymlUT\x05\x00\x01\x80Cm8l\x90\xbdn\xe30\x10\x84{>\xc5\x00*\xee\x0e\xb8;\xf7\xea\x02\xc4M\x90? UJZ\x1cYk\xd0\"\xb3\xbb\xb2\xa3\xb7\x0fl)H\x91\xb0\xe3\xc7\xe1\xec\x87m\x9a\xd04\xb8\xa5u*;\x1a| \xac\xb2\x93^\xba\xe8RF\xf4E\x11\x91\xa2G\xa3\xff2\x9c\xa2J\x99\x0c\xbd0'$\xf62\xca\x12\x94L\x0bM\x13.\xff\xdb\x004\xd8\x9e\xa8\xb3\x0f2\xee1\x8d\x89\x8a\x81J\xf4%\xe7r6\xdc\xbd<=\xc2\xba\x81\xc7\x88\xdf\x83{\xb5v\xb39X\x19\xff-\xf0\x7f\xd1\xfd\xe6\xcf_\x9cU\xdc9\"\x1a^o\x1e\xee\xafF\xca\x98\xe2N\xb2\xf8\x1c\x00\x9f+[\x94\xdd\x81\x9d\x07 \xa6tU\x8a\xf9YK\xa5\xba\xd0Z\xf41\x1b\x03P\xbfX\x00\x00\xbeWv\xce\xb4\xdc\x80t]F\xbd\x14\xb4\xd8\xae\x8fp\x9aCiS\xf65\xb7\x0c\x8d\xaaq^\x898\x8f\xf6Y\xf3\xcdj9?\xbb\xb9N\\#\xca\xb7I\x94i\x81\x1f\x01\x00\x00\xff\xffPK\x07\x08\xeeF\xd5\x18\xfb\x00\x00\x00\xa0\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x001/dataset/_dev/test/pipeline/spec.ymlUT\x05\x00\x01\x80Cm8\xb4\x90MK31\x14\x85\xf7\xf3+\x0eC\xa1\xef\x8bd\xea\xd6l\x8bKw\xdd\xf9\x01!\xb9\x19\"i\x12\x93;j\xc5\x1f/\x19\xe3\x08\"\nj\xb3\x0c\x87s\x9e\xe7\x96DZv\x802\xc6\xb1\x8bA\xf9m\x0cL\x81\x8b\x84U\xbeP\x07\xe8\xb7\x9f\x0e\x00\x04\x0c\x15\x9d]\xaaq\x89\x1d\x15\x86V\x85\xe0\x02\xe8\x9e\x02\xc3\xc6\xbcW<\x87\x01>$\x92\xb0\xceS\xfbH\x8a\x99r\x90X\xdf0\x15\x16\x97J<\x9d\x8a3q}r5\xdc\x96\x18V\xeb\x16l\xb3\x17d\x9c\xda\xcd-\xbdJ\xc9;\xad\xea\xf2\xa6f\xfb\x16\xcdt7\xb9L\xe6\x9d\xb9\xbeU&+\xd1\x0f\x9b\x19k\xa8\xaa\xc3a\xef\xfbo5\xb2z\xf8\x85\x84\x8f\xe3\xe2\xf0\x19\xd8\x87\xe5m\x0c\xd6\x8dS\x9e\xad\x10-\xf8OQ\x84\x9e\xfb\x8fu\xda\xd6\xfe\xe5m\xcf\x1f\x13i&\xf3j\x96\xa9L\x9e\xcbOt\xfeU\xb0g\x1f\xc7\xff\x82Z\xe7\xb1\xbc\x96\xfe\xc5\xec%\x00\x00\xff\xffPK\x07\x08\xc3\x98\xf9\xf5\xf8\x00\x00\x00*\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00 \x001/dataset/_dev/test/spec.ymlUT\x05\x00\x01\x80Cm8D\xceA\n\x83@\x0c\x85\xe1\xbd\xa7xH\xb7\xd5}\xb6\x85\xdecp\x9e%0\xc6\xe9$]x\xfb\xa2h\x9b\xe5\xcf\x17\x12\xaf\x9c\xa4\x03R\xce\x1a\xbaZ*\x8f\xd5\x82\x16.\x98Sqv\xc0t\x95\x0e\x00\xee\xc8\xf4\xa9i\xdd\xb9\xe0\xb9\x96\xccv\x98\xa4\xa6\xf6B\xd5\xca\xa2F\x04=\xfc\xd8\x01b\xab\x14\xcc\x07>\x93\xa5\x85\xf2\xd3gl|\x7f\xb41\xff\xaf\xefsk\x9c\x05\xfd0^z\xdc\xff\x1e\xb6\xa5\xf4\xdf\x00\x00\x00\xff\xffPK\x07\x08s\xf3\xdd\x00\x7f\x00\x00\x00\xc1\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x001/dataset/fields/fields.spec.ymlUT\x05\x00\x01\x80Cm8\x84T\xc1n\xd40\x10\xbd\xe7+\x9e\x1a$@\xea\xd2{nH\xe5\x82\xa0 \x95\x0b\xa7\xd5$\x9e$.^O\x18O\xba\xcd\xdf\xa38e\xb3\x8dV\xda[\xde\x9by\xe3g\x8f^\xca\xb2(K\xdcsj\xd4\xd7\x9c`=#\x0d\xdc\xf8\xd67d^\"ZQ\x10\x1c\x19%\xb6\xf7 \xcf\xa4^\xc6\x84\xd6spp\xdc\xfa\xe8\x97F\x1f8\x15eY\xcc\xfa\xaa\x00J|yf\x9d\xac\xf7\xb1\xc3\x18\x1d+zVF+!\xc81\xe1\xeb\xe3\x8f\x07\xa4\xa6\xe7\x03\xe1Co6\xa4\xea\xee\xee)I\xdc-\xe4'\xd1\xee\xee\xe3-\x8e\xea\xcd8\x82\x12~\x7f\xfe\xfe-;R&G\xb5\x0f\xde\xa6\x02\xb0i\xe0\nR?qc\x05@\xceeK\x14~\xaa\x0c\xac\xe69U0\x1d\xb9\x00\x86\x95*\x00 \xd2\x81\x97/\xc0\xe5w\x18fm\x85\x07:0\xa4].\xfa\xda\xb0\x1c\x94L}\xec2e\xde\xc2e\xf9\xaf\xb9r]\x9f\x89K\xfa{2\x9a\xabWG\x00\x1c\xc7\xc3\x7f\x0f;4\x12\x93Q\xb4\xfd\x1f\x9e\x8e\xa2\xeeT0~\xb1\x13\xd8\x16\x83\x9c\xc6\xed\xe0\xa3q\xc7z\xc2\xa9\x17]\xa5\xf5d|\x02N\xc6:\xac\xb0\x0dBkgO\xa1\xdd\xbf\xa5RC\x81\xdd\x86tt>\x91\x8c\xf7\x91\xa2\xa4\xf5D\x91\xc0\x14W\xec#\xe9\xb4\xb5\xbbW\x8a\xdd\xc6\xca\x86\x9bo\xb9\xa1\x96\x0bl\xc9\xd9\xc3[\xca\x0f\x1b\xa2S\x19\x87\x8c\xce\xf7vi\x95\x8f\xf3\xf3\x9dSWw\x9a\x8b\xe9\xf2\xb0\xb1\xde-\xe5[\x1c{\x8eY\x0c\x9f\xce\xfc\x00\xef\x94\xdb\n7\xe5MFe\x8e\xdak\xaa\x90\xa6h\xf4\x92S4\x88\x8f6\xa7\xd3$'_El\xf6\x96\xff\x02\xb9\xbb\x00\x94\xff\x8e^\xd9\xcdnv9.\xf9c>\xb6\xf8\x17\x00\x00\xff\xffPK\x07\x08W\xf9\xc8\xba\xbc\x01\x00\x00?\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00 \x001/dataset/fields/spec.ymlUT\x05\x00\x01\x80Cm84\x8f1k\xc0 \x10\x85w\x7f\xc5C\n\x19\x8aI\xd7\xba\x16\xbau\xeb\xd6\x86r\xe8 \x07\xc6X5\xd0\xf4\xd7\x17m2\x89\x8f\xef\xbe{W3;\xab\x00\xf2^\x9a\xec\x89\xe2\xcb\x9e\x1a\xa7V-\x02\xc5\xca\npw\xa2\x00\x03\xcf\xd5\x15\xc9\x1d\xb6x\x15\x8e\xbe\xc2s\x904\xe6\x15\x00\xb43\xb3E\x90\xc8\xe3\x9b\xa95.\xc9b\xfa \xf3\xfbd\x9e\xd7\xeb\xfdZ\x1f\xef\xe4s>\xb78\x0d\xbc\xf0\xf7!\x85\xbdE+\xc7\xbf\xe1j\xf0\xc6^\xe8}\xc85\xe5\x1c\xc5Q\xdf\xb9\xfc\x98\x93\xb6\xa8\x07\xfaP8X\xe8y \xa3\xda\xdc\x0f\xecn\xad\xfe\x02\x00\x00\xff\xffPK\x07\x08t\xa7P\x0f\xa7\x00\x00\x00\xeb\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00 \x001/dataset/manifest.spec.ymlUT\x05\x00\x01\x80Cm8\xccV_\x8f\xdb6\x0c\x7f\xcf\xa7 .\x0fk\x81%i\xb7\x87\x01y\x19\xba^\x81\xdd\xb0v\x052l\xd8\xd3A\xb1\xe9X\x85,y\"}w\xf9\xf6\x83$;\x91m9\xce\xed6\xa0|\xb2)\x8a\xe4\x8f\xe2\xbf\xe5r\xb1\\\xc2-Rf\xe5\x1e \xb8D\xa0\x1a3Y\xc8L\xb04\x1a\ncA@.X\x10\xf27\x04\x95\xd0\xb2@\xe2\xf5\xb1RPH\x85\x8b\xe5r\xe1\xael\x17\x00K\xf8\xf0\x80\xf6\xc8\xa5\xd4\x07ht\x8e\x16J\xb4\x08\x85Q\xca<\x12\xfc\xb2\xfb\xed\x13PVb%\xe0U\xc9\\\xd3v\xb3\xf9BF\xaf\x02sm\xeca\xf3\xfa[x\xb4\x92\x195\x08\x82\xbf\xde}\xfc\xd5;aQ\xe4b/\x95\xe4\xe3\x02\x80\x8f5n\xc1\xec\xbf`\xc6\x0b\x00\x91\xe7\xd2\xb9+\xd4gkj\xb4,\x91\xb6P\x08E\xb8\x00\xa8\xcf\xbc\x05\x00\x80\x16\x15\x86/\x80\xdcc\xaf\xdd\xe5-|\x12\x15\x82):\xb8\xadH\xb0El\xa5>x\x16KVi\x05\xbf\xbb\x93H\xc3zJ\x05\x00>\x89\xaaV\x9dK\x00+x\xf7\xe7\x0e\xf6R)\x17\xbc\n\xd9\xca\x8c\xfc\x99E\x85\x82\xd2\x06w\xdc\xc6\xe4J\xa3\xba\xa9\xce\x06\xf1\xa9F++\xd4,\xd4\x89\xb9G\x16\x93.\x9e\x0e\xbd\xeed\x04\x8e\xf55!\x1c\xba\x12\xe3u\xff\xca\x1ch\xd2\x8bX\x98\xd8\xa2\xa8h\"8\xfe\x0cLQ\xa0\xc5\x1c\xf6\xc7t\x88\x84\xb5\xe2\xd8r$\xe3Y\xdb(\xcf\x02]\xce\xb6@\xc3\x9ck\xb5\xeb\xba\xe1\x98\x91\x0cM\xa0!\xee@+\x10\x8f\xb4\xe9\x87\xab;\xa1\xef\x07\x0c_\x9fgF/o[\xd6s\xad\xbb$\xfd)\x91\xa4\x81\xe2\xf0\xbf\xcc\xce{\xa3\x14f\x0b.\x81\x0d|P\x82Xf\x84\xc2f%H\x9d\xe3\xd3I\x89o3!\x9f\xd67\xd7x\xff ,]0z\xe7\x1e\xdb I\xb1WH\xeb\x84\xca8\xf3\x02\x0d\xf2/\x16\x1eda\xa0kr1P:#\x03\xc5\x1d1\xa6\x1e\x9e?Z$^z\x9d\x90\x9e|\xe4@\xe9\xa7\x0e\xb4\x82\xd2\x10\xd3\xe8$\xee31\xf5\x1c\xbb\x15,\xbc\xa4k<]\xbc\xff\x8d\x83QK\x8ai\x05\x8cO\xc3\xc0\x87\x83\xa3\xa8\xd4\xb3\xa1&\xb5%\x8a3Pz\xc0\xbc\x04\xe6E\xe7~N\xbe\xc3da\x8f\x8faW\x1a\xcb1\xeb\x7f\xf5\xf7\xc6;\xecLH\xcdx\xb0am!\xb4\x0f2CW\xf2\x99\xd1\xdau\x1267#\x05U\xa3X\xce\x02z/\xf4\xc9\x7f\xa7\x8e\x85\xd4\xe1j\xad\x10\x1e\x84j\x90~\x9c\xc4\xb57F\xa1\xd0I#\x85h\x14\xa7\xcb\x15f\x91\xb3m\xc6\x97,\xfe\xddH\x8b\xf9,\xa8;:c\xea.}- \xa84\x8f\xf7\x0d\xa1\x9dE\xb1+M\xa3r\xe0RFp\xf6\xe85h\xf7\xfan\xa3u\x9a\xfc\xf0\x0f\xae\xbe\x08e\xd2\xdf9\x90\xe9\xd0t:\xe70\xde\x06\xb9\x90h\xaf\xe8\xb5\x9fS\x1d\xd8I,\xe3\xd1\x12(9`\xe2\x8b\x93ux\x19\xa5\xafE\xb7\xd3o7\x9b\xb7\xdf\xfd\xb0~\xb3~\xb3~;\xac\xb8\xa9\xec\\\xf9\x992b\xfa\x9e>\xa2H\x0c\xb5\x8bA~i\x08S;\xd2;\xd9\xfe\xeb\xa7\xdf}\xec\xe6*\xf4\xe7\xe8?\xb2\x12q\xfd\x82\xe7\xff1\xde4:E=\xd7\xfa\xbb\x88 B\xd75\x0b\xa9\xfd@\xefzpb\xf6\xcf\xcf\xfc\xd4\xac\xf7\xcb\xce}\xb7\xec\xc4!\x1bl-\xbd\x9d\xe8\xecPtab\x1f\x99\xf7\x0b.\xec!\x84\xccR\x1fF\xc9\xd5\xaf\xf7V\x08\x08\xb3n\xb4\xf4\xb7\xb8\xc1\xed\xc9\xd5\xa9\x12u=k\xeec+\xf4rsR\x1f\x90\xf8\xbe\x965*\xa9G\x83\xfeBb\x84\x9b\xd0\xdd<\xc5\xe9Z\xcb\xd7\xbe\x0b\xfc\x17;\xe2\xdd\xc0\xd9DY\xc3\xe5N3\xdb\"b\x81\xae,\xff \x00\x00\xff\xffPK\x07\x08\xb9\xb2H\x06\xb5\x03\x00\x00\xc8\x10\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x001/dataset/spec.ymlUT\x05\x00\x01\x80Cm8\xb4\x95\xcf\x8e\xd30\x10\xc6\xef}\x8aQ\xb5RA\xab\xb4\\\xc9m\xc5\x1f \xc4.\x87\xe5\x82\xd8\xa5\x9a\x8d'e\x90\xe3\x18\x8fSQ\xc4\xc3#\xbbM\xd36i\x93h\xc5\xa9\xd2d\xbe\xf1o>w\xc6b)K'\x00\xa8\x14{.\x0d\xea7\xa5\xf1d\xbc\xa4\x90\xa3\x16\x9a\x00dud\x02\x90\x80\"\xc9\x1c\xdb\x90\x9c\xc2\xfbR+r1\x03\xd9\xb0Y\x01\x82\xb0Yi\x02\x85\x1e\x85<(\xca\xd9\xc4\xda\x13\x00\x00\xbf\xb1\x94B\x1eu1`\xd1{r&\x85\xd97L\xfe\xbcJ^?\xee~\x97\x8f\xd7ud\x163\x1d\xfd\xaa\xd8\x91J\xc1\xbb\x8ab\xe8\x12\xf61x\x0b\xfd\xa6&\x9c \x14h8'\xf1\x90\xb3\xdeJ\xf7\xa0M`W\xed\x96\x14\xe3\x97\xf8q\x8a\xd6j\xce0\x14\\\xfcN6X\xe8\xe9.\xd9`\x11\x12\xea\xc2\xf3M\xf3\xa9\xa3\x0d\x80+Gy\n\xd3\xf9b\xaf\x087\xd3\xc8z}\xcf\x99\xb4:0[\x8e\xdbh\xfc\xae\xd9\xa2@\x061mS\x17#\x89pE\xc6'\x8e4z\x1aE\x16\x85-\xb0\xe6Z\xfb\xae\xfd\xf4\xe2\x87\xb2\x82xGXt\xa0v\xc2\xd6\xb8[\xd5>\xd8ie\x1fr/\xe0;\x8d\xe29\x13B\x97\xfd\x00\x14!\xdf\xeb#\x1dj\xfe\x97s\xc7`\x1f\xcc*\x8c\xd1]\xa9\x08,[\xd2lh\xac\x9f\x1ck,k\xf9@\x07\xbb\xe0[\xf8o)\xc7J\xfb\xdd\x11]\x84{e\xc7\x02\x80\xa3m\xf5]m\x8b=\xcc_l\n\xfd\xf7\xa7\x94\xe6\xe5\xd5\xec \xf5\xcc\x1f\xe1\x04\xe9\xbe\xb2\xb6t>Xy\x9eJ\x80\x0d|\xbd\xb9\xfd4\x1co~\xfd\x10f\xf5\x10h\xd4\x02\x83\xb3\xc3\xf7\x8c\x16>\xde\x7f\xbe\x1b\xd7B\xb0uD\x0f!\xbd\xaf\x83Sz,\xac&\xa0u\xd8\x00\x97\xf6\xffn\xa5K\xcc_\xc6\xfc\xf9\xe1y#\xd0\x06`\xb5'\xcd\x93D\x8f\xeb\x8d\x1a\xd0\x04\xd0(\x90\xea)\xd9\x8eR\xefN\x98\x86*\xcf\xc2P\xb4&]\xda\"\xd8\xe5H\xca\xcae\xd4{\xecR\xd1\xfa\xc2\xa1\x00k\x16~b\xcd~\x93\x82u\xbcF\xdfz\x85B\x8d\xe6\x0d\xfa\x17\x00\x00\xff\xffPK\x07\x08@\xc9\xf3\xdb\x12\x02\x00\x00\xb9\x08\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x001/kibana/spec.ymlUT\x05\x00\x01\x80Cm8\xcc\x90\xbdN\xc30\x10\xc7w\x9e\xe2\x94\xa5\x03\xa2\xec\xde\x10\x12\x0bbcDB\xd7\xdc\x85\x1er\xce\xc6\xe7V\xc0\xd3\xa3\x98$\x94\xb6CP\x84\x94\xd1\xe7\xff\x97~\x00\x16\xb9v\x17\x00\x00H$Y\x82\xa2\xbf\x0d\x9aY\xb39h\xd0\x1b\x97\xdfz\xb8\x95\xd7\x15\x10[\x9d$v\x06\x07w\xc1\x13\xa7\xa2AQ\xd1\x17\xb8\x97\x0d*\x02\xa1m7\x01\x13\x01\x9aq\xb6b\x06\xc8\x1f\x91\x1d4\xc5\xd5\x9f\x14[v?\xfa\xfe\x9a\xf8m'\x89\xe9p\xc9\xf1\x96\x9357\xc7\xb5\xd0\x88\x1f\xbcc\xf9\xe1\xa9\x0f|`\x12|,\xdf\x15\xc6\xe8\xa5\xc6.\xf1\xfa\xd5\x82V\xa38b\xce\x9c\xd4\xc1j}\xf9\xb4\xee\xfeV\x7fb\xb2\x17\xdb\xa1\x97\xcf\x92=\x91\xcb/\xcf<6g\xea\x97\xc5\xc7p\xcf\x04\xc6\x98\xea\xedD<\xdf\xe2y\\Nk\x97\x85\xa5\xc58\x91F\x8bq\x1e\x8a\xb1jY\x04D\x89\xdf\x87\x94\x89,\xaabz\xeeM\xd5,.zn\xc1\xff#\xfa\n\x00\x00\xff\xffPK\x07\x08\xed\xdd\xda\xfb\xff\x00\x00\x00\xa4\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00 \x001/manifest.spec.ymlUT\x05\x00\x01\x80Cm8\xccY[o\x1b\xbb\x11~\xd7\xaf\x18H\x01l\xd7\xd5\xcaNP\x14\x16\xd0\x1aF\x124i\x9d4\xa8\xf3\xd2\x93\xe4\x08\\j\xb4b\xcc%7\xe4\xacd\xf9\xd7\x1f,\xf7\xc6\xbd\xc9\x82\xed\xe0\x84O\xe6\xcc\x88\xf3\xcd\x95\xc3\xf5d2\x9aL\xe0\x0dZnD\x88\x16h\x8d`\x13\xe4b%8#\xa1\x15\xac\xb4q\xd4\x84\xf1[\x16\xe1\x91\x85\x98 \x051Sb\x85\x96\x82],a%$\x8e&\x93Q\xf6\xcb\xf9\x08`\x02o7hv\xb4\x16*\x82T-\xd1\xc0\x1a\x0d\xc2JK\xa9\xb7\x16\xfe}\xf3\xdf\x8f`\xf9\x1ac\x06\xc7k\xa2\xc4\xceg\xb3\xefV\xabiN\x0c\xb4\x89f'\x7f\x85\xad\x11D\xa8\x80Y\xf8\xff\xd5\x87k\x87\xc5 [\xb2PHA\xbb\x11\x00\xed\x12\x9c\x83\x0e\xbf#\xa7\x11\x00[.E\x86\x9a\xc9OF'hH\xa0\x9d\xc3\x8aI\x8b#\x80\xa4\xa6\x8d\x00 ;.f\xb4\xd8\xa0\xb1B\xab\x9c\x06\xb0t\xceH\xb2c\xe6\xf0y\x8dP\xf0A\xaf|Gt\xdd\x143\x82\xd4\xe2\x12\xc2\x1d\xd0Z\xd8R2(\x0e\xce\xb1Z2BE\x05)aDh\xd4\x1c\x8e~?\xfer6\xbd\xf8vz\xf25\xe8\xfeu|9\x9f\xba\xbf\xaf\xa6\xbf\xb1\xe9\xfd\xf4\xdb\xe9\xf1\xe5\xfck\xd0\xa0\x9c\xfc\xe5\xe4\xe42#\x9f6\xc9\x97/\x8e\nex\xc7\xe2D\x96\xc6\x03La|\x1e\x9c\x05gc\xb7W,\xc6A\x17d\xcc\x96\xfd\x07Y\xf5\x85M\xef\xcf\xa6\x17\x8bo\xa7\xc3 X\xc2\xf8\x1a\xdd\x96\x04\xc9a\x10\x8e{8\x8a\xae\xa6\xabZ\x93\x7fx\x9f\xbe+\x90ZEh|\xea\xd3U\xc3{E\x18\x19\x971\x8e\xf5\xb8\xd4;\xc8\xf5\x7fNB\x9d\x05\xe7eBI\xc1Q\xd9\xe1p\x16\xfc\xa2?l\xd7\x82\xaf\x1b\xf5%,\x84\x985\x10\x83\x12\x99\xc5\xe5>\x87\xab4\xaeQ\x84\xcc\n^\xa9]\xb1T\xd2\xbcA\xec\x02\xaf\xb9\xee\xf4\xc1\x14\xdc%.\x03\x1f\x0eD\x13\x91h\xc5\xbd\x0fB[\xa60{\x10\x8b\xa5\xa2\x0d\x1e\x9e\x1dMPx\x97\xa0\x111*b\xb2v\x04\x12\xab6\x11\x1bD\xdb\xf91g\x84\x916\xa2\x16j ~]\xb1\x81t\x15\xed\xbaIB\x88Y\xc5\xd9&zf\x0c\xdb\x15\x14A\x18Wg\xf7\x9a\xd74\xd0\xf5\x96\xad\xf5w\xf7\xa9Ao\xcf\xa5N\x97\xfe^\xab\x95\x88\x161S,\xc2\xcc\xb4&\x8f\x98Ph\xfc\x03\xb9\x89\xfd]jI\xfb\x84%#fI7t\xa2d\x96\x04_Xb\xfc\xd6\xa3GZG\x12\x17mH\xb7i\x88F!\xa1\xafV2\x15\xa5,j\xd0b\xb4\x96E\xb8\xf8\x91b\xea\xeb\x8b\xb5\x12\xa4\x1bN\x9a\x82B\xdaj\xe3\xabW\x9a\xaa\xbb\xcc#k\xbb\xb0;K\xe8[\x95\x18\xbdL9\x89M~\x03\x97d\x8b<5-R\x9a$\xda\xf8^$\xc1o\x91\x9a`\x8a\x1e\xb7\xc8H\xe6\x99[Lz\x84q\"\x19\x0d\x8c\xace\xe1\xe5\xc2i>\x9aC\xf5\x1b\xd0\xab\x15\x9a_\xa7\xe6\xfc\x07|\xbe\x1a\xd6|,\x9e\xf0\xfd\xd6<1\x1e\xde\x1b\xbe8\xe1\xd0:\xfa)p\x8a\x92\x92:\xb2\xc0\xd4\x12b$#\xb8\xf5\xa4z\xde\xff]\x06\\\xf7~\x03\xf8)\x90_k)\x91S\x073\xac\x8c\x8eK\x83\xdct\xaa8\xfa\x96\x08\x95\xa4d\xf7\x19Q\x8eTN\xb0\x1c\xca\xf3\xbc=\xdc\x14?\x8f\x0b\xc5\xcdl\xf6\x85;\x83(\x1c\x98\xd9\xf9\x1a\x1aH\xa1\xb7\xfb\xe4\xab\x99]E\xfbq&\x07=\xd2{f\xd8\xde\xdc\xcd\xd7\xc00\xf5(%\xc3\xc32t\xf3\xe1\xa1\x1c\xc8\xd7`Nw\xd9\x03\x99\xfddS`\x9f-BE\xa5\x11\x8cs\xb4y\x9e\xa31\xda83;\xbf\xdd0\xd3\xeb\x9d\x17\x06Ws\x18\x073\xf7\xc0F\x9aU\x1f\xa3m\x82<\xd8\xc5rb\xc9 \x8b\xed\xcc%\xe9\xacN\xa8Yv\xe6\xb8uf\xf7\xe6\xc8\xd7\xd4\xd9\xdd%V\xd7\x88O\xf5\\\xe9\xf1\xe2T\x92H\xda\xe9\x94\xbb3\xd4Z\"\xab\xa5\xfb.\xb0\xac\xa9{\xdb\xa6\xea\xae\xd2\xc2!\x95\xd7\x1e\xbc\x83\x1ev\xe58\x8f\xa9\xde*4\xcdc\x0f}\x14\x17\x12}U\x1d Z\xa7\xa1\xef\x9cF\x96\xfeK\xd0\xbb4\x04\x83\x89\xb6\x82\xb4\xd9U\x1f\xa2\xcbg{\x9c=\xeb\xddw\x99\xees\xb8\x91\xaem\xe7N\x0b\xdd\xa3&k\xda\xfa\xa7\xc0\xc8\x0bB\xed\xfe\xb6\xe3\xab\x8f\x18\xee\xef\xe2\xc3\x9d\xfb\xdb\xb9\xed\x8f\x00\x00\x00\xff\xffPK\x07\x08\xa6\xa3\xa4M\xbe\x05\x00\x00e\x19\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x001/spec.ymlUT\x05\x00\x01\x80Cm8\xac\x92\xcfn\xdb0\x0c\x87\xef~\x8a\x1f\x92\x01;\xc5i\xaf\xbe\x0d]\xd7\x01\xfbw\xe9\x0b0\x16\x95\x10\xb1)M\x94\x87\xf9\xed\x07\xabvR\x0cA\xb2\x01=Z\xfcH~$\xbd^W\xeb5\x1e5\xa71\x06\xd1\x8c\xe0\x11\xa9=\xd2\x9ea\x91[\xf1\xd2R\x96\xa0u\xf5\x82~dk\x93\xec\xd8\x90\x0f\x0c\x1f:\xc7\xc9@\xea\xe0\xa5+\xaf\x94\xd1\xd3\x911D\xd0Rk\xcaF\xf5\x8b\x93I\xd0\x06\xf7\xf5]}\xb7\xa1.\x1e\xe8\xbe\x9a\xda4\x15@\xce\xc9\xd4\x89\xba\x87\xa0\x995[\x83\x9c\x06\xae\x80vy\xa8\x80\x0d\\Q\x88\xb9\x94z>0z\x12=Y\xf7\xa4\xe2\xd9r\xf1\xa9\x00 \x8f\x91\x9b\xf3\xe7\\\xec\x1b;\xa1\xe7\x12ZQ\x8c\xdd<\xe7\xf6\xf7f\xa4\xbe[\x15T\xa9\x9f\xc2K\xc9z\\\x02\x89\x7f\x0e\x92\xd8\x9d\x0c\x81w\x89}\x83U\xbd=\xd1\xd3`K\xca\x05\xebY\xf8\xbd\xe1\xe1\xf3\x87\xefO\x8f_\x7f<\xbd\xa1s{ \xdds\x17\xf6\x97\xa4=u\xf6\x97\xf5\x99\xbf\xa2\xfd\xa9\x9c\xbb\xd8\x90\xa8\xe8\x1e\x8e2\x19g8\xf6\xa2\xe5|\xf6\xda\xbf\xf0\xaf\xb4f\xfc\xe6\x0egn\xfb\x7f.\xa1\x1dz\xd6\\v\x02\x1fR\xf9E\xe75_\xb5\n\xad]V\xba\xd9\xf3\x8b\xecH d\xc6\xd90\x18;\xec\xc6\x7f\xed{,\xc9\xb7o\xf3\xc2\x9d\x97\xf1'\x00\x00\xff\xffPK\x07\x08\xcf\x08b\xadY\x01\x00\x00\xb5\x03\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xeeO\xccS\xf8\x01\x00\x005\x05\x00\x00\x14\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x001/changelog.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(ms,a\xbc\x00\x00\x00$\x01\x00\x00\x0f\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\x02\x00\x001/changelog.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(T\xb6\xb4\x9c\x7f\x00\x00\x00\xb9\x00\x00\x00\x17\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x03\x00\x001/dataset/_dev/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\x07V+\xa7\xf9\x00\x00\x00\xd2\x01\x00\x00,\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x04\x00\x001/dataset/_dev/test/pipeline/config.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(`\xe3\x1d\x18\xf3\x00\x00\x00\x96\x01\x00\x00+\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x05\x00\x001/dataset/_dev/test/pipeline/event.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xeeF\xd5\x18\xfb\x00\x00\x00\xa0\x01\x00\x00.\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\x06\x00\x001/dataset/_dev/test/pipeline/expected.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xc3\x98\xf9\xf5\xf8\x00\x00\x00*\x03\x00\x00%\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\x08\x00\x001/dataset/_dev/test/pipeline/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(s\xf3\xdd\x00\x7f\x00\x00\x00\xc1\x00\x00\x00\x1c\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w \x00\x001/dataset/_dev/test/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(W\xf9\xc8\xba\xbc\x01\x00\x00?\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\n\x00\x001/dataset/fields/fields.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(t\xa7P\x0f\xa7\x00\x00\x00\xeb\x00\x00\x00\x19\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\x0c\x00\x001/dataset/fields/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xb9\xb2H\x06\xb5\x03\x00\x00\xc8\x10\x00\x00\x1b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\x0d\x00\x001/dataset/manifest.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(@\xc9\xf3\xdb\x12\x02\x00\x00\xb9\x08\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Z\x11\x00\x001/dataset/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xed\xdd\xda\xfb\xff\x00\x00\x00\xa4\x05\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5\x13\x00\x001/kibana/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xa6\xa3\xa4M\xbe\x05\x00\x00e\x19\x00\x00\x13\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfc\x14\x00\x001/manifest.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xcf\x08b\xadY\x01\x00\x00\xb5\x03\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x1b\x00\x001/spec.ymlUT\x05\x00\x01\x80Cm8PK\x05\x06\x00\x00\x00\x00\x0f\x00\x0f\x00\xcd\x04\x00\x00\x9e\x1c\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00 \x001/changelog.spec.ymlUT\x05\x00\x01\x80Cm8\x9cT\xdfo\x94@\x10~\xe7\xaf\x98\x1c&\xd5(\xd0F\x8d\x91\xb7\xc6\xd6\x1as\xb6\x8d\xfab\xfc\x91,0\xc0\x94ew\xdd\x1dzw\xff\xbd\x81=\xee\xb8\x1f\xad\xd1y!\xf3\xcd\xb7\xc37\xdf2\x84a\x10\x86p\x81.\xb7\x94\xa1\x03\xae\x11\x9c\xc1\x9cJ\xca\x05\x93VPj;\xa0F\xe4\x8d\xa8\xf0\xc4\xc1\xbb\x0f\xe7\xd7W\x97\xf3\x9b+(Ib\x10\x86A\x7f\"\x0d\x00B\xb8\xbcG\xbb\xe2\x9aT\x05\x9d*\xd0B\x8d\x16\xa1\xd4R\xea\x85\x83\x8f_n\xae\xc1\xe55\xb6\x02\x9e\xd6\xcc\xc6\xa5Ir\xe7\xb4\x8a<\x18k[%\xcf^\xc0\xc2\x123*\x10\x0e\xbe\x9d\x7f\x9a\x0f\x1a,\x8aBd$\x89W\x01\x00\xaf\x0c\xa6 \xac\x15}F\x8c\xad\xeb\x05\x8c\x05\x9d\xdda\xce\x03 \x8a\x82\xfaA\x84\xbc\xb5\xda\xa0eB\x97B)\xa4\xc3\xa1n\xb6\xe8\x90\x03\xdc\xa3u\xa4\xd5\x98\x02\x14\x83=\xa6\xef\x92\xc2\xad\xf7ad\xc5\x1b\x96\x7f\xb3cK\xaa\xda\x80F0\xa3U)\x9c\xfc\xfa~\x1a\xbd\xfd\xf9\xfcG\xbc\xfb|r\xb2\xe1\xe2R\xb4Fnu\x00D0;\x8bO\xe3W\xb35\x92\xd7BUS\xc2\x8e\xb299\x06]\x8e, 5^\xdaCbG\xff|L\\\x9c\x92&^\xfa\xf8\x9b\xa3>\x0e}\xf51\x95\xbcS\xd8\x9b\xe6b\x9bl\x87\x8a\xf7N\x1c\xf5\xdc\xc7\xa1\x9b>\"\x98\xbd\xa7%dV7\xa8\x80\xb15R0\xce\x82\x83\xb6\x8f\x89\xfb\xba2\xf8\x7f\xaaT\xd7\x1eQ\x94Y\x14\x0d\xa9*\xf2\x0dgG\x18]U\xd2\xf2H\x01U-T\x8e-*>Rm\x94^\xa8\x88\x9c\xeb\xf6\x9aJR\xcd\xa3#\xceI5\xc0\x1a\x86\xb3\xa0-\xdc~^\x13\xb2~\xbb\xbd\xd0\xfe\x1b+\x90\x05\xc9\x7f\xf1\xe0\xe1\x9b\x19\xff \x15q\xddeq\xae\xdb\x04\xa5pLy\x92\xa1`\x97\x0cj\\r\xf6\xf2\xf5\xe9\x9b\xe9@\x16\x7fwd\xb1\x98\xf6\x8c\xa6\x03\xed\xe0\xbd\xb8\x1d\xa0w#8\xec\x13\x8d\x8b\xb3\xce\xd6\x9b\xf5'\x00\x00\xff\xffPK\x07\x08\xeeO\xccS\xf8\x01\x00\x005\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00 \x001/changelog.ymlUT\x05\x00\x01\x80Cm8l\x8f\xb1N\x031\x10D{\x7f\xc5H\xae\xcfNZ\xf7\x14i\x80\"?\xb08{\xe7U\x1c\xdb\xca\xee!\xf1\xf7(\x864\x88v5\xfbf\x9e\xf7\xce{\x9c\x8b(V\xa9\x8cK\xcf\xfb\x8d\x9b)r\xa1\xb6\xb1B\x1a\xac0\x06\xe5+m\x0c\x1d\x9ce\x95L&\xbd\x05\x9c\x0c\xa2x};\x83\xfe\x8fLlp\xde\xbb\x05\x9f|W\xe9-\xe1\x18\x0e\xe1\xb0P\x1d\x85\x8e\x0e\xcf\xaa\xe4\x80\x05\x17\xd6|\x97a3xjbB\xf5\xf9\x89\xbe\xce1/\x95\xd4$\xe3\xfdO\xe3\xdc\xe4\x00\xc0\xbe\x06'p+\xd42?\x84\xe6\xb5J\xbb&\x14\xb3\xa1)\xc6M\xac\xec\x1f!\xf7[\xe4\x1f`\xfcUX\x1e\xc08\xf6Z5\x1e\xddw\x00\x00\x00\xff\xffPK\x07\x08ms,a\xbc\x00\x00\x00$\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00 \x001/dataset/_dev/spec.ymlUT\x05\x00\x01\x80Cm8D\xce\xb1\xaa\xc30\x0c\x85\xe1=Oq\x08w\xbd\xc9\xee\xb5\xd0\xf70\xf6I18r*)C\xde\xbe\xd8\xa4T\xe3\xcf'$;\x98\xc2\x04\xc4\x9c\x8b\x97&\xb1>\x9a8\xc5-`\x8b\xd58\x01\xe9[&\x00\xf8G\xa6%-G\xe7\x01\xcfV3u\x98X\xa4\xc8\x0bNs(\xad\x9d\x9ahc\x07\xf0\xeb`\xc06\xf0\x9d$\xee\x0cC\xdfA\xf9>\x8b2\xff.\xf7\xf9Sn\x01\xf3\xb2v\xb9\xf6\x7f\x97k\xaf\xf3'\x00\x00\xff\xffPK\x07\x08T\xb6\xb4\x9c\x7f\x00\x00\x00\xb9\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00 \x001/dataset/_dev/test/pipeline/event.spec.ymlUT\x05\x00\x01\x80Cm8l\x90OK\xc4@\x0c\xc5\xef\xf3)\x1e\xdb\x83\n\xea\xde{\x13\x14A\xfc\x07\x9eD\x05\xc0\xa7\x9ek\x94\xcd\x8e\x1b\x0f\x00\xc5xB\xa2\xf4\xaa\xa5gua\xab\xd1R2\x0e@\xff\xab\x05\x00\xe0\x91\xb3/;\x10O\xaf\xe8\x8f\xf1\x1a\xf72r^\x0c\xcb}\xae\"U\x9a\x16E\x9c\xf7?\xf1?,\xf3\xfcO\xe4:\x1c\x81\x94\xbf\x06Q\x8e5>\xb0\x9a\xcbV\xf8\xfc\x0e\x00\x00\xff\xffPK\x07\x08rW\xd5\x8d\xfa\x00\x00\x00\x9a\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00 \x001/dataset/_dev/test/pipeline/expected.spec.ymlUT\x05\x00\x01\x80Cm8l\x90\xbdn\xe3@\x0c\x84\xfb}\x8a\x81U\xdc\x1dp\x89{u\x01\xe2&\xc8\x1f\x90*\x08R\xac\xb5#\x8b\xc6Z\xab\x90\x94\x1d\xbd}`\xcbF\x8a\x84\x1d\x87\xc3\xe1\x07VU\xa8*\xdc\xd2\x1a\x955\x0d\xde\x116\xb0\x91V\x9a\xe8Rz\xb4E\x11\x91\xa2G\xa3\xff1\xec\xa3J\x19\x0d\xad0'$\xb6\xd2\xcbl\x94L\x0bU\x15\x8e\xfbu\x00*\xac\xf6\xd4\xc9;\xe97\x18\xfbDEG%\xda\x92s9\x18\xee^\x9e\x1eaM\xc7]\xc4\xdf\xce}\xb0z\xb9\xdcZ\xe9\xaff\xf1\xba\xe8f\xf9\xef?\x0e*\xee\xec\x11\x0d\xaf7\x0f\xf7'\"eLq-Y|\n\x80O\x03k\x94\xf5\x96\x8d\x07 \xa6tB\x8a\xf9Y\xcb@u\xa1\xd5hc6\x06`\xf8\xd6\x02\x00\xf0s`\xe3Ls\x07\xa4\xd33\x86c@\x8d\xd5y\x08\xa79\x946f?\xfb\xe6\xa3Q5NgE\x9c;\xbb\xc4\xfc\xa0\x9a\xebw6\xd7\xf1\x88\xa6\xfc\x18E\x99j\xbcaq\xe1Z\xe0\xfd+\x00\x00\xff\xffPK\x07\x0887\x85\xbd\x02\x01\x00\x00\xa6\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x001/dataset/_dev/test/pipeline/spec.ymlUT\x05\x00\x01\x80Cm8\xac\x93O\x8b\xdb0\x14\xc4\xef\xf9\x14\x83 \xa4\xa5\xc8\xe9\xb5\xbe\x86\xf6\x16\xe8!\xb7\xfe\x01Uz\n\n\x8a\xa4J\xcf\xedf\xd9\x0f\xbf\xc8\xeb\xd8q\xc8\xee\xc2\xaes\xcb\xf3\x8fy3\xd2(GR\xcd\x02\x90Z[\xb6\xc1K\xb7 \x9e\xc9sn`\xa4\xcb\xb4\x00\xd4y\xb2\x00\x00\x01MY%\x1b\x0b\xde`G\x99\xa1d&X\x0f\xfaG\x9eaB:J\xee`\x80O\x91\x1a\x18\xeb\xa8\x1fD\xc9L\xc97X\xfdf\xca,~Hq\xffY|\x11\xbf>\xfd\xac\x0f9\xf8\xe5\xaa\x07\xfb\xb5[\xd2V\xee:\x95J\xc6\xe8\xac\x92e\xf3\xba\xb0U\x8f&\xfa\xdb\xdaDz\xf4\\~\xcbD\xa6AU\xaf;[u\x89Z\x9f\x8e\xaez5F\x92\xff\xdf\x11\xc2\x85\xfd\x90\xe1\x96\xb1\xab\xcd\x9b\xe0\x8d\xdd\xb7\xa9K\x85`\xc0\xb3Z\x11\xaa\xd3\x9f\xf9h{\x81\xa6\xff{\xb6\x15\xfe\x1cH\xf10\x1cK\xf5=\x85H\x89-\xe5\xa9\x0e\x10\xc7/\xc3\x0c0\x96\x9c\x9eL0=\xb5o\x05\x80&c}\xb7\"O\xd0\x9bn\xf0\xac#N-]`\xc7\xd6\xb1u\xd6\xd3\x0b\xfb\xb7\x85\x11\x05\x82\xba\xbc\xc0Yl\\5\xe4\xeb]$\xc5\xa4\x9f\x9a\x91(\xb7\x8e\xf3[\xea\xf0\xa1\\\xec\x83\x0b\xfb\x8f\x82z\xcd\x99{1>\xb9\xb3\xfe\xf0\xea\x1e\x03\x00\x00\xff\xffPK\x07\x08g.\xe6-M\x01\x00\x00j\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00 \x001/dataset/_dev/test/spec.ymlUT\x05\x00\x01\x80Cm8D\xceA\n\x83@\x0c\x85\xe1\xbd\xa7xH\xb7\xd5}\xb6\x85\xdecp\x9e%0\xc6\xe9$]x\xfb\xa2h\x9b\xe5\xcf\x17\x12\xaf\x9c\xa4\x03R\xce\x1a\xbaZ*\x8f\xd5\x82\x16.\x98Sqv\xc0t\x95\x0e\x00\xee\xc8\xf4\xa9i\xdd\xb9\xe0\xb9\x96\xccv\x98\xa4\xa6\xf6B\xd5\xca\xa2F\x04=\xfc\xd8\x01b\xab\x14\xcc\x07>\x93\xa5\x85\xf2\xd3gl|\x7f\xb41\xff\xaf\xefsk\x9c\x05\xfd0^z\xdc\xff\x1e\xb6\xa5\xf4\xdf\x00\x00\x00\xff\xffPK\x07\x08s\xf3\xdd\x00\x7f\x00\x00\x00\xc1\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x001/dataset/fields/fields.spec.ymlUT\x05\x00\x01\x80Cm8\x8c\x94\xc1n\xd4L\x0c\xc7\xefy\n\xab\xf9\xa4\x0f\xa4.\xbd\xe7\x86T.\x08\nR\xb9pZ9\x19'\x992;\x0e\xb6\xd3m\xde\x1e\xcd\xa4K\x87M+\xed-\xfe\xd9\xf9\x8f\xed\xf1\xb8\xae\xab\xba\x86[\xd2N|K\n6\x12\xe8D\x9d\xef}\x87\xe69B\xcf\x02\x08\x0e\x0d\x95\xec\x7f\x85G\x14\xcf\xb3B\xef)8p\xd4\xfb\xe8\xd7@\x1fH\xab\xba\xae\xd2\xffM\x05P\xc3\xa7G\x92\xc5F\x1f\x07\x98\xa3#\x81\x91\x84\xa0\xe7\x10\xf8\xa8\xf0\xf9\xfe\xdb\x1dh7\xd2\x01\xe1\xddh6iss\xf3\xa0\x1cw+\xfc\xc02\xdc\xbc\xbf\x86\xa3x3\x8a\x80\n??~\xfd\x923\x12B\x87\xad\x0f\xde\x96\n\xc0\x96\x89\x1a@\x11L\x967:hJ\xe0\xe4\xe0\xf6\x81:\xcb\x00\x9d\xcb\xd9b\xf8.<\x91\x98'm\xc0d\xa6\xec\x9e^`\xb6\x01\"\x1e\xe8\xf4\x0d\xe0r\xa3\xa6\xa4\xd0\xc0\x1d\x1e\x08\xb8_;\xf17d=RM|\x1c\x9e\xa1y\x0bo\x89\xfcH\xbe\xcbT\x12z]\xe4\x16\x0d\x93\xfb\"\x1d\x00\x8a\xf3\xe1Ei\x07\x1dG5\x8c\xb6\xffE\xcb\x91\xc5\x15.\xa3'+\xccm@\xe0Bx\x07>\x1a\x0d$\x05\xd1\x91\xa5\x94h\x17\xa3\xc2t<\xb7\xa1\x04}`,\xe3G\x0c\xfd\xfe\x1cj\x87\x81\xdc\x06;\xfcW\x1b\x8d\xf6\x11#ky>s \x8c%\xf1\x11e\xd9\x16\xb1\x17\x8c\xc3&\xb5\x0dM\x1d\xd8\xc0\xb5\xac-N\x19\x9dC?m\xd0 \xddZ\x89.\x1a\xad\x1c\xa0oI\xce\xedn\x0d\xb8\x86\xe3H1\x0b\x80\xd7\xb3b\xff\x13\xea\x1b\xb8\xaa\xaf\xb2U\xe7-\xf1\xbc\x10@\x97h\xf8\x94\x17@\xeeFZ,\xc6yi \xb3\xa5\x1c\xf3\x02\xcb\xd1YQ\xe8\xf7\xec\x85\xdc\x9a\xd3.?\xe7\xe7\xcft|\xf5'\x00\x00\xff\xffPK\x07\x08)\x81\xfe\xcd\xde\x01\x00\x00\x00\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00 \x001/dataset/fields/spec.ymlUT\x05\x00\x01\x80Cm84\x8f1k\xc0 \x10\x85w\x7f\xc5C\n\x19\x8aI\xd7\xba\x16\xbau\xeb\xd6\x86r\xe8 \x07\xc6X5\xd0\xf4\xd7\x17m2\x89\x8f\xef\xbe{W3;\xab\x00\xf2^\x9a\xec\x89\xe2\xcb\x9e\x1a\xa7V-\x02\xc5\xca\npw\xa2\x00\x03\xcf\xd5\x15\xc9\x1d\xb6x\x15\x8e\xbe\xc2s\x904\xe6\x15\x00\xb43\xb3E\x90\xc8\xe3\x9b\xa95.\xc9b\xfa \xf3\xfbd\x9e\xd7\xeb\xfdZ\x1f\xef\xe4s>\xb78\x0d\xbc\xf0\xf7!\x85\xbdE+\xc7\xbf\xe1j\xf0\xc6^\xe8}\xc85\xe5\x1c\xc5Q\xdf\xb9\xfc\x98\x93\xb6\xa8\x07\xfaP8X\xe8y \xa3\xda\xdc\x0f\xecn\xad\xfe\x02\x00\x00\xff\xffPK\x07\x08t\xa7P\x0f\xa7\x00\x00\x00\xeb\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00 \x001/dataset/manifest.spec.ymlUT\x05\x00\x01\x80Cm8\xbcW\xdd\x8f\xdbD\x10\x7f\xf7_1J\x90h\xa5&i\xe1\x01)/\xa8\xf4*q\x88\x96J\x87@\x08\xa1\xd3\xd8\x1e\xc7[\xadw\xcd\xce\xf8r\xf9\xef\xd1\xfa#Y\x7f^\x0eP\xf7)\x9e\x99\x9d\xf9\xed|g\xbd\x8e\xd6k\xb8!N\x9c\x8a\x89Ar\x02.)Q\x99JP\x945\x90Y\x07\x08)\n2\xc9\xd7\x0c\x05\x1a\x95\x11\xcb\xf6Th\xc8\x94\xa6h\xbd\x8e\xfc\x95}\x04\xb0\x86\xf7\x0f\xe4N\x92+s\x80\xca\xa4\xe4 'G\x90Y\xad\xed\x91\xe1\xa7\xbb_>\x02'9\x15\x08/r\x91\x92\xf7\xbb\xddg\xb6f\xd3\x10\xb7\xd6\x1dv/_\xc1\xd1)\x112\x80\x0c\x7f\xbc\xfd\xf0s\x0d\xc2\x11\xa6\x18+\xad\xe4\x14\x01\xc8\xa9\xa4=\xd8\xf83%\x12\x01`\x9a*\x0f\x17\xf5'gKr\xa2\x88\xf7\x90\xa1f\x8a\x00R\xca\x94\xa9\xf9\xecQ\x02<\xa0k\x7fy\xa6\x7f|\xe9\xb9{\xb85e%\x9e\xad0\xd6\xc4\xdbV\xa6\xb1\x86\xce\xe1\xa9\xa5(\xa1\xe2\xacb\x04\xa79\xcb\xa0\x9aS^8g\x1a\x80\xc1\x82\xc2\xef\x01\xca\xdfZ|\xb5\xdc\xb6'\xd7\x00aq\xca\x1cz\x0cz\xc4\xa2\xd4}3\xfel \xb7,\x1c\x0dT\xcc\x1b\xbfA\xc1Z\x06lv\xf6\xd4\xb5 LU\x8c\x01(#t 7\xa2\xc7\xd6\xea\x11\xb1D\xe6\xa3u\xe9\x88!\xf4(#\xe2 \x0b}\xa5\x1b\x06\xf7E\x89^r\xc3\xaf\x9e\xffo\\0\x0b\xe0\xc7A\x1cBs\xf38\xeer\xeb$$\xfd\xaf\x98V5(\xaf\xb2\x0e\x92kz\x02\x93{P \x81XH\xac1\x94\x08\x88]\x05\x97\x8bJ\x8bZ\x00\xfd\x0e\xcd\x19\xa3W!\xa8Ls\xa9\xd4\x04\x0f\xa8+\xe2\xef'\xb0\xfb\x8c 4\x03\xc5\x19VZ\x86\x85\x05\xcb\xc1vU(\xea\xe8\xefJ9J\x17 \xdf\xf2\x05q'\xfe%!rn\x8f\xf7\x15\x93[\xce\x85J\xa7 \xb9\n\xc0\xc6T\xdf5>Z\xbe\xbd{\x1d\x10\x9f:P\xcf~\xc3\x00\xd7\xd2\x13\x86\xcf\xedt\xcc\xbf\xe0\xa6\x91hR\xe0\x05\xbf\xac;\x7f\xf7\x94 \xa4\x7f\xc2\xaa\xc9\xe7\xd5+X\xd5\xfd\xd9\xffh\x1b\x8a\xff\xd9>e\x05\x7f\xf5n\x0f\xdaw\xa8r\xa2>\xe6\xdfX\xd7\x88\x1fd\xfb\xdd\xee\xcd7\xdfm_o_o\xdf\\*a*\xaf6u\xd7\xee\x11\xbc\xe1h<\x0b\xc2)\xd0\xf3\xd2G,\xea\xd6\xd3N\xe5Vd\x04\xbf\xd7\xc2\xa6\x9bW\xaba;\xa7b\xfc\xf2\x0d\xbc\xfd\xfd\x0eb\xa5\xb5\x9f\xf1\x05\x89SI\xd3\xb5\x1ciB\x9e6x'\xed\xe8\xbe\xd2h0'6@\x8f%9U\x90\x11\xd4gbL\x82\xb3\x10\xcf\xccp\x96\xf5=\xd0\x0e\xb0'\\8\x84\x12\xbe\xd7\x7fk{\xe0Y\x14\xa10\x8b#,\xa6\x97\x8e\xbb\x86\x076\xcb\xc8QZ\x17\xe7\x94\x8b\xbe\xdc\xfe\xa1\xfc\x1a\xd4\xcf\xf5g\x0e\x8f\x0d\xe0\x91w}wu\x1c\xfev@\xa8\xd7\xc8\x0bab\xf4>\xdb\xbaO\xd2\x1f&\x92\xb49\xb3\xa3\xf5\xd9v\xdeY\xad\xfd\xfc\x9b+\x8aV-\x15\xa5F\xa1\xfb\x12%_h\x7f\xabO(\xb9o\xd4\xef5\xb2\xa8\x84 ]\x92\x832)=\x9e\x95\xd4=\xb1\xc9\xa7\xed\xea\x1a\xf4\xe1\xb6\xdb\x9c\xaf\x1ce{X\xadw\xc1f\xbc\xf3b\xa1>2\xbe\xe9>1\x13\x1b\x1c\x9d\xec5\xc3d\xdc\x137M\xc4\x83\xef\xc0J@\xad\xb3\xb2\xfe\xa6\xd0=\x935\xd5w 2\x93\x84\x7f\x03\xa2\x10a\xafl\x9e.\x9a\xa9\x92\xa9#t\xdfEh?\x93jp\xdb\x0f\xe4\x05P\x98+S\xa5|\x0d.\x98-g\x00&\x11e\x0e\xa3\xf9\xd5\xefC\xad\x100%\xdd&\xd9O\xbd\xc1\xed\x19\xa8\x00\x05\x96\xe5\x93\xe6>\xb4B\xff\xdd\x9c2\x07b\xb9/UIZ\x19Z\xb4:\xac,\x7f\x13\xba\x9bg?]k\xf9\xda\xb8\xc0Bl`\xf2\x0f_s\x06\xd9\xd3\x07;\xd8#\xba\xb3\xb0\xc6L\xef\xb9\xc1N\x12\nte\xf9O\x00\x00\x00\xff\xffPK\x07\x08\x8a\xbc\xcb\xac\xce\x03\x00\x00$\x10\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x001/dataset/spec.ymlUT\x05\x00\x01\x80Cm8\xb4\x95\xcf\x8e\xd30\x10\xc6\xef}\x8aQ\xb5RA\xab\xb4\\\xc9m\xc5\x1f \xc4.\x87\xe5\x82\xd8\xa5\x9a\x8d'e\x90\xe3\x18\x8fSQ\xc4\xc3#\xbbM\xd36i\x93h\xc5\xa9\xd2d\xbe\xf1o>w\xc6b)K'\x00\xa8\x14{.\x0d\xea7\xa5\xf1d\xbc\xa4\x90\xa3\x16\x9a\x00dud\x02\x90\x80\"\xc9\x1c\xdb\x90\x9c\xc2\xfbR+r1\x03\xd9\xb0Y\x01\x82\xb0Yi\x02\x85\x1e\x85<(\xca\xd9\xc4\xda\x13\x00\x00\xbf\xb1\x94B\x1eu1`\xd1{r&\x85\xd97L\xfe\xbcJ^?\xee~\x97\x8f\xd7ud\x163\x1d\xfd\xaa\xd8\x91J\xc1\xbb\x8ab\xe8\x12\xf61x\x0b\xfd\xa6&\x9c \x14h8'\xf1\x90\xb3\xdeJ\xf7\xa0M`W\xed\x96\x14\xe3\x97\xf8q\x8a\xd6j\xce0\x14\\\xfcN6X\xe8\xe9.\xd9`\x11\x12\xea\xc2\xf3M\xf3\xa9\xa3\x0d\x80+Gy\n\xd3\xf9b\xaf\x087\xd3\xc8z}\xcf\x99\xb4:0[\x8e\xdbh\xfc\xae\xd9\xa2@\x061mS\x17#\x89pE\xc6'\x8e4z\x1aE\x16\x85-\xb0\xe6Z\xfb\xae\xfd\xf4\xe2\x87\xb2\x82xGXt\xa0v\xc2\xd6\xb8[\xd5>\xd8ie\x1fr/\xe0;\x8d\xe29\x13B\x97\xfd\x00\x14!\xdf\xeb#\x1dj\xfe\x97s\xc7`\x1f\xcc*\x8c\xd1]\xa9\x08,[\xd2lh\xac\x9f\x1ck,k\xf9@\x07\xbb\xe0[\xf8o)\xc7J\xfb\xdd\x11]\x84{e\xc7\x02\x80\xa3m\xf5]m\x8b=\xcc_l\n\xfd\xf7\xa7\x94\xe6\xe5\xd5\xec \xf5\xcc\x1f\xe1\x04\xe9\xbe\xb2\xb6t>Xy\x9eJ\x80\x0d|\xbd\xb9\xfd4\x1co~\xfd\x10f\xf5\x10h\xd4\x02\x83\xb3\xc3\xf7\x8c\x16>\xde\x7f\xbe\x1b\xd7B\xb0uD\x0f!\xbd\xaf\x83Sz,\xac&\xa0u\xd8\x00\x97\xf6\xffn\xa5K\xcc_\xc6\xfc\xf9\xe1y#\xd0\x06`\xb5'\xcd\x93D\x8f\xeb\x8d\x1a\xd0\x04\xd0(\x90\xea)\xd9\x8eR\xefN\x98\x86*\xcf\xc2P\xb4&]\xda\"\xd8\xe5H\xca\xcae\xd4{\xecR\xd1\xfa\xc2\xa1\x00k\x16~b\xcd~\x93\x82u\xbcF\xdfz\x85B\x8d\xe6\x0d\xfa\x17\x00\x00\xff\xffPK\x07\x08@\xc9\xf3\xdb\x12\x02\x00\x00\xb9\x08\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x001/kibana/spec.ymlUT\x05\x00\x01\x80Cm8\xcc\x90\xbdN\xc30\x10\xc7w\x9e\xe2\x94\xa5\x03\xa2\xec\xde\x10\x12\x0bbcDB\xd7\xdc\x85\x1er\xce\xc6\xe7V\xc0\xd3\xa3\x98$\x94\xb6CP\x84\x94\xd1\xe7\xff\x97~\x00\x16\xb9v\x17\x00\x00H$Y\x82\xa2\xbf\x0d\x9aY\xb39h\xd0\x1b\x97\xdfz\xb8\x95\xd7\x15\x10[\x9d$v\x06\x07w\xc1\x13\xa7\xa2AQ\xd1\x17\xb8\x97\x0d*\x02\xa1m7\x01\x13\x01\x9aq\xb6b\x06\xc8\x1f\x91\x1d4\xc5\xd5\x9f\x14[v?\xfa\xfe\x9a\xf8m'\x89\xe9p\xc9\xf1\x96\x9357\xc7\xb5\xd0\x88\x1f\xbcc\xf9\xe1\xa9\x0f|`\x12|,\xdf\x15\xc6\xe8\xa5\xc6.\xf1\xfa\xd5\x82V\xa38b\xce\x9c\xd4\xc1j}\xf9\xb4\xee\xfeV\x7fb\xb2\x17\xdb\xa1\x97\xcf\x92=\x91\xcb/\xcf<6g\xea\x97\xc5\xc7p\xcf\x04\xc6\x98\xea\xedD<\xdf\xe2y\\Nk\x97\x85\xa5\xc58\x91F\x8bq\x1e\x8a\xb1jY\x04D\x89\xdf\x87\x94\x89,\xaabz\xeeM\xd5,.zn\xc1\xff#\xfa\n\x00\x00\xff\xffPK\x07\x08\xed\xdd\xda\xfb\xff\x00\x00\x00\xa4\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00 \x001/manifest.spec.ymlUT\x05\x00\x01\x80Cm8\xccX\xe1o\xdb\xb6\x12\xff\xee\xbf\xe2\x10\x17H\xf2\xf2,'-\x1e\x1eb`\x0b\x82\xb6X\xbb\xa5]\xb1\xf4\xcb\xd6v\x06M\x9fe6\x14\xa9\xf2Nv\x9c\xbf~\x10%\xd9\x94,9F\x92b\xe5'\xf1H\xf1~w\xfc\xdd\xe9N\xfd~\xaf\xdf\x87WH\xd2\xa9 \x12\xf0\x1c\x81R\x94j\xa6\xa4`e\x0d\xcc\xac\xf3\xd2T\xc8\x1b\x11\xe3!A\"\x94\x81D\x185C\xe2h\x95h\x98)\x8d\xbd~\xbf\x97\xbf9\xea\x01\xf4\xe1\xf5\x02\xdd\x8a\xe7\xca\xc4\x90\x99):\x98\xa3C\x98Y\xad\xed\x92\xe0\xd7\xeb\xdf\xdf\x03\xc99&\x02\x8e\xe6\xcc)\x8d\x86\xc3\xafd\xcd\xa0\x10F\xd6\xc5\xc3\xe3\xff\xc2\xd2)f4 \x08\xfe\xbc|w\xe5\xb18\x14S1QZ\xf1\xaa\x07\xc0\xab\x14G`'_Qr\x0f@L\xa7*G-\xf4\x07gSt\xac\x90F0\x13\x9a\xb0\x07\x90nd=\x00\xc8\x8fK\x04\x8f\x17\xe8HYS\xc8\x00\xa6\xde\x19i~\xcc\x08>\xce\x11\xcau\xb0\xb3\xd0\x11\xdbnJ\x04CF8\x85\xc9\nx\xae\xa8\xda\x19\x95\x07\x17X\x89\x9d2q)J\x053:3\x82\xc3\xbf\x8f>\x9d\x0e\xce\xbf\x9c\x1c\x7f\x8e\xb6\x9f\x8e.F\x03\xff|9\xf8K\x0c\xee\x06_N\x8e.F\x9f\xa3\x9a\xe4\xf8?\xc7\xc7\x17\xb9\xf8\xa4.\xbexvX*\xc3[\x91\xa4\xba2\x1e`\x00\x07g\xd1itz\xe0\xe7F$\xd8\xe9\x82|\xb1a\xff^V}\x12\x83\xbb\xd3\xc1\xf9\xf8\xcbI7\x08\x91\n9G?e\xc5\xba\x1b\x84_\xdd\x1f\xc5\xb6\xa6\xcb\x8d\xa6\xf0\xf06}\x97\xa0\xad\x89\xd1\x85\xd2\xc7\xab\x86\xb7\x861v\x9e1~\xe9a\xd4\xdb\xcb\xf5\xff\x0e\xa1N\xa3\xb3\x8aPZI4\xd4}\x9d\xe5z\x99\x1f\x96s%\xe7\xb5\xf8R\x04\x13\xcc\x13\x88C\x8d\x82p\xba\xcb\xe1&K6(&\x82\x94\\\xab\x9d\x89L\xf3\xa8&\xdc\x06\xbeY\xf5\xa7wRp\x95z\x06\xde\x7f\x11uD\xaaq\xefm\x10\x9a{J\xb3;\xb1\x10\x97ip\x7fv\xd4A\xe1m\x8aN%hX\xe8\x8d#\x90\xc5z\x12\x8bN\xb4[/K\xc1\x18[\xa76\x9bj\x88_\xae\x97\x81\xed\xfa\xb67I\x12&\x98G\x1c\xd5\xd1\x0b\xe7\xc4\xaa\x94(\xc6d}v\xabyu\x03}nYR8\xbb\xcb\x1c\x06s\xa9m6\x0d\xe7\xd6\xccT\xfb\x1d\xd4\xb3\x86\xd8 e\x98\x1a\xc9&\xa0\x9f\x14\x06&\x08\xca\x10\x0b\xad\x9b\xc9f]`\xe4cw\x91\x91\x8ff\xa1\x91\x8f\x1b5\x11FD\x8d\x8c\x0f]Ln\xd8\xf0\x9b\x7f\xbb\xf2\x15\x81\xb4I*XM4\xc2R\xf1\xbc\xb5\xde\x80V\xb7\x81w\xdd\xc1\xcf?\xfd?:\xafR\xb5\x92]\xbe\xbbR\xc4y~\xf1;|\xfd\xb5\xb3\xb8\xb97^k\x8e\xdc\xc7\x95\xed\xce\x04 '\xeb6\xd5`\xff\x81Z\xb0Z\xe491w\x8e\xf5\xf91\xb7\xe1\x90@%\xf9}\xe7%kT;\xa0\xe3\x1av\xf8p\xa8\x92x\xa8ml\xc7E\x0d\x13\xd1\">\x08/6,g\x8aQ\xcf\xe2UA\x93#{,\x98\xb2\xc2\xb8\xb2\xb1\x0d1\x90\xba\xdb\x05\xe1Z\xdd\xadK\xaa\xa7@\xf1\xe2\xf9\xed\x8b\xe7\x07Mrw\xeb\x7f\xf7\xf6\xdd\xeb\xf5W\xb5\x02\xf1\x84W\xe4O\x1a\xd2\">\xb9M\xf4\x06\x97\xc3o\x99r8\x0d\xb3 \xb9\xa2\x00 \xe9\x10\x0d\xcd-\xef\x0e\x89`_>-#T\x10!\x13H\x87\x82\xefk\x05~\xe8h\xc9\xcd3\xde\xbc\xa7\x8f\x99\"\\\xc6y\xe77\x1d\x13\xba\x05\xba\xfc\x83\xc8\x19E\xa9yX\x08mn\xe3\xb1\x08\xcb@z\xf3\xf1\xe3\x87Wp\xed\xc1\xc1\xb5\x07\xf7\xc0\xb8z:hg\xcf\xcf\xfew{vv~\xfe\x98\x08\xdb\xc0y\xc2k-\xe2\xacvy\xbbb\x0c\xcaj\x80u\xc1\xdc\xb2\xf2bLR-\xb8\xa3\x84\xac\x02\xaf\xd8\x9c\x15\xa52\xac\xdf\x01;\x9b\xa1\xfbqb.l\xa8\x8bQ\xb3\xe6}\xd9R\xb7[\xf3\xc8\xfb\x08z\xea\xf2\x84}\xe3\xe8\xbb\xc0)CJ\xdb\x98@\x98)$\xc8NI\nv\xb5\xf4\xe3\xdb\x0bp\xd5\xda\x93\x7f\x17\xc8/\xad\xd6(y\x0b3\xcc\x9cM*\x83|\xb5h$\x86\x96(\x93fL\xbb\x8c\xa8J*\xbf\xb1*\x92\x0b\xde\xeeoJ\xc8\xe3Rq\x9d\xcd\xe1\xe6\x06\xa7\x8b\xb1\x0f\xb3\x8b\xd1\xce\xefblg\x9fb\xd4\xd9U\xa6\x1for\xd4\xb2\xbb\xf3z\xa0\x9d\xbb\xc5\xe8(\xa6\x1e\xa4\xa4\x8b \xc5h\xf0\xe1>\x0e\x14\xa3\x93\xd3\xdb\xcb\x1d\xcc\xfe\xae\xa6(\x13W6\x08)\x91\n\x9a\xa3s\xd6y+\xb7\xde]\x08\xd7z\xe23\x87\xb3\x11\x1cDC\xdf\xef\"\x0f\xd7\xff\x86)E\x19\xad\x12\xdd\x1fNq\xa6L\xd1\xa3\x0d\xf3s\x0e\x1a\xe7l\x7f,\x8a1\xf0\xa6n\x0b\xd7_\x8eP\x1ax/XK2\xcd*m2\xa8\xf0\xe0\xc4Z\x8db\xb3\xbb\xed\x9b\x95\xe7\xf1`ZW\xbd\xad\xd4.\x0d\xba\xea\xfd'\xeb\x1ec\xc5\xf3l\x12\x9aP\xa3\xcf/\x8a\xdfd\x13p\x98Z\xca\xdb\xfd\xd5\xfa\x8fm\xd5\xdf&y\xff\xeb\x7f`\x84|j\xe1Q\xd3\x05\x83Rw\xaf\xbe4h\xfc=\xef\x05\xae\xda8\xa9\xe9\x9eu\xb7\xef\x9f\xcb?\\\xfe\xd9\xbb\xed\x9f\x00\x00\x00\xff\xffPK\x07\x086h\xad\x80\x99\x05\x00\x00\x8e\x18\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x001/spec.ymlUT\x05\x00\x01\x80Cm8\xac\x92\xcfn\xdb0\x0c\x87\xef~\x8a\x1f\x92\x01;\xc5i\xaf\xbe\x0d]\xd7\x01\xfbw\xe9\x0b0\x16\x95\x10\xb1)M\x94\x87\xf9\xed\x07\xabvR\x0cA\xb2\x01=Z\xfcH~$\xbd^W\xeb5\x1e5\xa71\x06\xd1\x8c\xe0\x11\xa9=\xd2\x9ea\x91[\xf1\xd2R\x96\xa0u\xf5\x82~dk\x93\xec\xd8\x90\x0f\x0c\x1f:\xc7\xc9@\xea\xe0\xa5+\xaf\x94\xd1\xd3\x911D\xd0Rk\xcaF\xf5\x8b\x93I\xd0\x06\xf7\xf5]}\xb7\xa1.\x1e\xe8\xbe\x9a\xda4\x15@\xce\xc9\xd4\x89\xba\x87\xa0\x995[\x83\x9c\x06\xae\x80vy\xa8\x80\x0d\\Q\x88\xb9\x94z>0z\x12=Y\xf7\xa4\xe2\xd9r\xf1\xa9\x00 \x8f\x91\x9b\xf3\xe7\\\xec\x1b;\xa1\xe7\x12ZQ\x8c\xdd<\xe7\xf6\xf7f\xa4\xbe[\x15T\xa9\x9f\xc2K\xc9z\\\x02\x89\x7f\x0e\x92\xd8\x9d\x0c\x81w\x89}\x83U\xbd=\xd1\xd3`K\xca\x05\xebY\xf8\xbd\xe1\xe1\xf3\x87\xefO\x8f_\x7f<\xbd\xa1s{ \xdds\x17\xf6\x97\xa4=u\xf6\x97\xf5\x99\xbf\xa2\xfd\xa9\x9c\xbb\xd8\x90\xa8\xe8\x1e\x8e2\x19g8\xf6\xa2\xe5|\xf6\xda\xbf\xf0\xaf\xb4f\xfc\xe6\x0egn\xfb\x7f.\xa1\x1dz\xd6\\v\x02\x1fR\xf9E\xe75_\xb5\n\xad]V\xba\xd9\xf3\x8b\xecH d\xc6\xd90\x18;\xec\xc6\x7f\xed{,\xc9\xb7o\xf3\xc2\x9d\x97\xf1'\x00\x00\xff\xffPK\x07\x08\xcf\x08b\xadY\x01\x00\x00\xb5\x03\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xeeO\xccS\xf8\x01\x00\x005\x05\x00\x00\x14\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x001/changelog.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(ms,a\xbc\x00\x00\x00$\x01\x00\x00\x0f\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\x02\x00\x001/changelog.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(T\xb6\xb4\x9c\x7f\x00\x00\x00\xb9\x00\x00\x00\x17\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x03\x00\x001/dataset/_dev/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(rW\xd5\x8d\xfa\x00\x00\x00\x9a\x01\x00\x00+\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x04\x00\x001/dataset/_dev/test/pipeline/event.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(87\x85\xbd\x02\x01\x00\x00\xa6\x01\x00\x00.\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x05\x00\x001/dataset/_dev/test/pipeline/expected.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(g.\xe6-M\x01\x00\x00j\x04\x00\x00%\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5\x06\x00\x001/dataset/_dev/test/pipeline/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(s\xf3\xdd\x00\x7f\x00\x00\x00\xc1\x00\x00\x00\x1c\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x08\x00\x001/dataset/_dev/test/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!()\x81\xfe\xcd\xde\x01\x00\x00\x00\x05\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P \x00\x001/dataset/fields/fields.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(t\xa7P\x0f\xa7\x00\x00\x00\xeb\x00\x00\x00\x19\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\x0b\x00\x001/dataset/fields/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\x8a\xbc\xcb\xac\xce\x03\x00\x00$\x10\x00\x00\x1b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81|\x0c\x00\x001/dataset/manifest.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(@\xc9\xf3\xdb\x12\x02\x00\x00\xb9\x08\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c\x10\x00\x001/dataset/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xed\xdd\xda\xfb\xff\x00\x00\x00\xa4\x05\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf7\x12\x00\x001/kibana/spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(6h\xad\x80\x99\x05\x00\x00\x8e\x18\x00\x00\x13\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>\x14\x00\x001/manifest.spec.ymlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x00\x00!(\xcf\x08b\xadY\x01\x00\x00\xb5\x03\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81!\x1a\x00\x001/spec.ymlUT\x05\x00\x01\x80Cm8PK\x05\x06\x00\x00\x00\x00\x0e\x00\x0e\x00j\x04\x00\x00\xbb\x1b\x00\x00\x00\x00" fs.Register(data) } \ No newline at end of file diff --git a/code/go/internal/validator/common_spec.go b/code/go/internal/validator/common_spec.go new file mode 100644 index 000000000..88741a3e3 --- /dev/null +++ b/code/go/internal/validator/common_spec.go @@ -0,0 +1,31 @@ +package validator + +import ( + "github.com/creasty/defaults" + "github.com/pkg/errors" +) + +type commonSpec struct { + AdditionalContents bool `yaml:"additionalContents"` + Content map[string]interface{} `yaml:"content"` + Contents []folderItemSpec `yaml:"contents"` +} + +func setDefaultValues(spec *commonSpec) error { + err := defaults.Set(spec) + if err != nil { + return errors.Wrap(err, "could not set default values") + } + + if len(spec.Contents) == 0 { + return nil + } + + for i := range spec.Contents { + err = setDefaultValues(&spec.Contents[i].commonSpec) + if err != nil { + return err + } + } + return nil +} diff --git a/code/go/internal/validator/folder_item_spec.go b/code/go/internal/validator/folder_item_spec.go new file mode 100644 index 000000000..0aa462165 --- /dev/null +++ b/code/go/internal/validator/folder_item_spec.go @@ -0,0 +1,125 @@ +package validator + +import ( + "encoding/json" + "fmt" + "github.com/elastic/package-spec/code/go/internal/yamlschema" + "github.com/xeipuuv/gojsonschema" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "regexp" + + "github.com/pkg/errors" + "gopkg.in/yaml.v3" +) + +type folderItemSpec struct { + Description string `yaml:"description"` + ItemType string `yaml:"type"` + ContentMediaType string `yaml:"contentMediaType"` + Name string `yaml:"name"` + Pattern string `yaml:"pattern"` + Required bool `yaml:"required"` + Ref string `yaml:"$ref"` + Visibility string `yaml:"visibility" default:"public"` + commonSpec `yaml:",inline"` +} + +func (s *folderItemSpec) matchingFileExists(files []os.FileInfo) (bool, error) { + if s.Name != "" { + for _, file := range files { + if file.Name() == s.Name { + return s.isSameType(file), nil + } + } + } else if s.Pattern != "" { + for _, file := range files { + isMatch, err := regexp.MatchString(s.Pattern, file.Name()) + if err != nil { + return false, errors.Wrap(err, "invalid folder item spec pattern") + } + if isMatch { + return s.isSameType(file), nil + } + } + } + + return false, nil +} + +func (s *folderItemSpec) isSameType(file os.FileInfo) bool { + switch s.ItemType { + case itemTypeFile: + return !file.IsDir() + case itemTypeFolder: + return file.IsDir() + } + + return false +} + +func (s *folderItemSpec) validate(fs http.FileSystem, folderSpecPath string, itemPath string) ValidationErrors { + var schemaLoader gojsonschema.JSONLoader + if s.Ref != "" { + schemaPath := filepath.Join(filepath.Dir(folderSpecPath), s.Ref) + schemaLoader = yamlschema.NewReferenceLoaderFileSystem("file://"+schemaPath, fs) + } else if s.Content != nil { + schemaLoader = yamlschema.NewRawLoaderFileSystem(s.Content, fs) + } else { + return nil // item's schema is not defined + } + + // loading item content + itemData, err := loadItemContent(itemPath, s.ContentMediaType) + if err != nil { + return ValidationErrors{errors.Wrapf(err, "loading item content failed (path %s)", itemPath)} + } + + // validation with schema + documentLoader := gojsonschema.NewBytesLoader(itemData) + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + if err != nil { + return ValidationErrors{err} + } + + if result.Valid() { + return nil // item content is valid according to the loaded schema + } + + var errs ValidationErrors + for _, re := range result.Errors() { + errs = append(errs, fmt.Errorf("field %s: %s", re.Field(), re.Description())) + } + return errs +} + +func loadItemContent(itemPath, mediaType string) ([]byte, error) { + itemData, err := ioutil.ReadFile(itemPath) + if err != nil { + return nil, errors.Wrap(err, "reading item file failed") + } + + if len(itemData) == 0 { + return nil, errors.New("file is empty") + } + + switch mediaType { + case "application/x-yaml": + var c interface{} + err = yaml.Unmarshal(itemData, &c) + if err != nil { + return nil, errors.Wrapf(err, "unmarshalling YAML file failed (path: %s)", itemPath) + } + + itemData, err = json.Marshal(&c) + if err != nil { + return nil, errors.Wrapf(err, "converting YAML file to JSON failed (path: %s)", itemPath) + } + case "application/json": // no need to convert the item content + default: + return nil, fmt.Errorf("unsupported media type (%s)", mediaType) + } + return itemData, nil +} diff --git a/code/go/internal/validator/folder.go b/code/go/internal/validator/folder_spec.go similarity index 72% rename from code/go/internal/validator/folder.go rename to code/go/internal/validator/folder_spec.go index 60174d2ce..3081acaf8 100644 --- a/code/go/internal/validator/folder.go +++ b/code/go/internal/validator/folder_spec.go @@ -4,12 +4,10 @@ import ( "fmt" "io/ioutil" "net/http" - "os" "path" "path/filepath" "regexp" - "github.com/creasty/defaults" "github.com/pkg/errors" "gopkg.in/yaml.v3" ) @@ -28,23 +26,6 @@ type folderSpec struct { commonSpec } -type folderItemSpec struct { - Description string `yaml:"description"` - ItemType string `yaml:"type"` - ContentMediaType string `yaml:"contentMediaType"` - Name string `yaml:"name"` - Pattern string `yaml:"pattern"` - Required bool `yaml:"required"` - Ref string `yaml:"$ref"` - Visibility string `yaml:"visibility" default:"public"` - commonSpec `yaml:",inline"` -} - -type commonSpec struct { - AdditionalContents bool `yaml:"additionalContents"` - Contents []folderItemSpec `yaml:"contents"` -} - func newFolderSpec(fs http.FileSystem, specPath string) (*folderSpec, error) { specFile, err := fs.Open(specPath) if err != nil { @@ -151,7 +132,14 @@ func (s *folderSpec) validate(folderPath string) ValidationErrors { errs = append(errs, fmt.Errorf("[%s] is a file but is expected to be a folder", fileName)) continue } - // TODO: more validation for file item + + itemPath := filepath.Join(folderPath, file.Name()) + itemValidationErrs := itemSpec.validate(s.fs, s.specPath, itemPath) + if itemValidationErrs != nil { + for _, ive := range itemValidationErrs { + errs = append(errs, errors.Wrapf(ive, "file \"%s\" is invalid", itemPath)) + } + } } } @@ -198,56 +186,4 @@ func (s *folderSpec) findItemSpec(folderItemName string) (*folderItemSpec, error // No item spec found return nil, nil -} - -func (s *folderItemSpec) matchingFileExists(files []os.FileInfo) (bool, error) { - if s.Name != "" { - for _, file := range files { - if file.Name() == s.Name { - return s.isSameType(file), nil - } - } - } else if s.Pattern != "" { - for _, file := range files { - isMatch, err := regexp.MatchString(s.Pattern, file.Name()) - if err != nil { - return false, errors.Wrap(err, "invalid folder item spec pattern") - } - if isMatch { - return s.isSameType(file), nil - } - } - } - - return false, nil -} - -func (s *folderItemSpec) isSameType(file os.FileInfo) bool { - switch s.ItemType { - case itemTypeFile: - return !file.IsDir() - case itemTypeFolder: - return file.IsDir() - } - - return false -} - -func setDefaultValues(spec *commonSpec) error { - err := defaults.Set(spec) - if err != nil { - return errors.Wrap(err, "could not set default values") - } - - if len(spec.Contents) == 0 { - return nil - } - - for i := range spec.Contents { - err = setDefaultValues(&spec.Contents[i].commonSpec) - if err != nil { - return err - } - } - return nil -} +} \ No newline at end of file diff --git a/code/go/internal/validator/test/packages/good/changelog.yml b/code/go/internal/validator/test/packages/good/changelog.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/go/internal/validator/test/packages/good/dataset/foo/_dev/test/pipeline/test-access-raw.log-expected.json b/code/go/internal/validator/test/packages/good/dataset/foo/_dev/test/pipeline/test-access-raw.log-expected.json index 9477a3be2..4b619857f 100644 --- a/code/go/internal/validator/test/packages/good/dataset/foo/_dev/test/pipeline/test-access-raw.log-expected.json +++ b/code/go/internal/validator/test/packages/good/dataset/foo/_dev/test/pipeline/test-access-raw.log-expected.json @@ -1,5 +1,5 @@ { - "1expected": [ + "expected": [ { "event.category": [ "web" diff --git a/code/go/internal/validator/test/packages/good/dataset/foo/fields/some_fields.yml b/code/go/internal/validator/test/packages/good/dataset/foo/fields/some_fields.yml index e69de29bb..e6e1d439f 100644 --- a/code/go/internal/validator/test/packages/good/dataset/foo/fields/some_fields.yml +++ b/code/go/internal/validator/test/packages/good/dataset/foo/fields/some_fields.yml @@ -0,0 +1,24 @@ +- name: source + title: Source + group: 2 + type: group + fields: + - name: geo.city_name + level: core + type: keyword + description: City name. + ignore_above: 1024 + - name: geo.location + level: core + type: geo_point + description: Longitude and latitude. + - name: geo.region_iso_code + level: core + type: keyword + description: Region ISO code. + ignore_above: 1024 + - name: geo.region_name + level: core + type: keyword + description: Region name. + ignore_above: 1024 \ No newline at end of file diff --git a/code/go/internal/validator/test/packages/good/dataset/foo/manifest.yml b/code/go/internal/validator/test/packages/good/dataset/foo/manifest.yml index e69de29bb..2adfb5005 100644 --- a/code/go/internal/validator/test/packages/good/dataset/foo/manifest.yml +++ b/code/go/internal/validator/test/packages/good/dataset/foo/manifest.yml @@ -0,0 +1,23 @@ +title: Nginx access logs +type: logs +release: experimental +streams: + - input: logfile + vars: + - name: paths + type: text + title: Paths + multi: true + required: true + show_user: true + default: + - /var/log/nginx/access.log* + - name: server_status_path + type: text + title: Server Status Path + multi: false + required: true + show_user: false + default: /server-status + title: Nginx access logs + description: Collect Nginx access logs \ No newline at end of file diff --git a/code/go/internal/validator/test/packages/good/manifest.yml b/code/go/internal/validator/test/packages/good/manifest.yml index 24ed53d91..2c8f1830d 100644 --- a/code/go/internal/validator/test/packages/good/manifest.yml +++ b/code/go/internal/validator/test/packages/good/manifest.yml @@ -1 +1,27 @@ -format_version: 1.0.4 \ No newline at end of file +format_version: 1.0.4 +name: good +title: GOOD +description: This package is good. +version: 0.1.2 +release: beta +conditions: + kibana.version: '^7.9.0' +config_templates: + - name: apache + title: Apache logs and metrics + description: Collect logs and metrics from Apache instances + inputs: + - type: apache/metrics + title: Collect metrics from Apache instances + description: Collecting Apache status metrics + vars: + - name: hosts + type: text + title: Hosts + multi: true + required: true + show_user: true + default: + - http://127.0.0.1 +owner: + github: elastic/foobar \ No newline at end of file diff --git a/code/go/internal/yamlschema/schema_loader.go b/code/go/internal/yamlschema/schema_loader.go new file mode 100644 index 000000000..cae2f3521 --- /dev/null +++ b/code/go/internal/yamlschema/schema_loader.go @@ -0,0 +1,121 @@ +package yamlschema + +import ( + "io/ioutil" + "net/http" + "net/url" + + "github.com/pkg/errors" + "github.com/xeipuuv/gojsonreference" + "github.com/xeipuuv/gojsonschema" + "gopkg.in/yaml.v3" +) + +type itemSchemaSpec struct { + Spec map[string]interface{} `json:"spec" yaml:"spec"` +} + +type yamlReferenceLoader struct { + fs http.FileSystem + source string +} + +var _ gojsonschema.JSONLoader = new(yamlReferenceLoader) + +type rawReferenceLoader struct { + fs http.FileSystem + source interface{} +} + +var _ gojsonschema.JSONLoader = new(rawReferenceLoader) + +// NewReferenceLoaderFileSystem method creates new instance of `yamlReferenceLoader`. +func NewReferenceLoaderFileSystem(source string, fs http.FileSystem) gojsonschema.JSONLoader { + return &yamlReferenceLoader{ + fs: fs, + source: source, + } +} + +// NewRawLoaderFileSystem method creates new instance of `rawReferenceLoader` +func NewRawLoaderFileSystem(source interface{}, fs http.FileSystem) gojsonschema.JSONLoader { + return &rawReferenceLoader{ + fs: fs, + source: source, + } +} + +func (l *yamlReferenceLoader) JsonSource() interface{} { // golint:ignore + return l.source +} + +func (l *yamlReferenceLoader) LoadJSON() (interface{}, error) { + parsed, err := url.Parse(l.source) + if err != nil { + return nil, errors.Wrapf(err, "parsing source failed (source: %s)", l.source) + } + resourcePath := parsed.Path + + itemSchemaFile, err := l.fs.Open(resourcePath) + if err != nil { + return nil, errors.Wrapf(err, "opening schema file failed (path: %s)", resourcePath) + } + defer itemSchemaFile.Close() + + itemSchemaData, err := ioutil.ReadAll(itemSchemaFile) + if err != nil { + return nil, errors.Wrap(err, "reading schema file failed") + } + + if len(itemSchemaData) == 0 { + return nil, errors.New("schema file is empty") + } + + var schema itemSchemaSpec + err = yaml.Unmarshal(itemSchemaData, &schema) + if err != nil { + return nil, errors.Wrapf(err, "schema unmarshalling failed (path: %s)", l.source) + } + return schema.Spec, nil +} + +func (l *yamlReferenceLoader) JsonReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference(l.JsonSource().(string)) +} + +func (l *yamlReferenceLoader) LoaderFactory() gojsonschema.JSONLoaderFactory { + return &fileSystemYAMLLoaderFactory{ + fs: l.fs, + } +} + +func (l *rawReferenceLoader) JsonSource() interface{} { + return l.source +} + +func (l *rawReferenceLoader) LoadJSON() (interface{}, error) { + return l.source, nil +} + +func (l *rawReferenceLoader) JsonReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} + +func (l *rawReferenceLoader) LoaderFactory() gojsonschema.JSONLoaderFactory { + return &fileSystemYAMLLoaderFactory{ + fs: l.fs, + } +} + +type fileSystemYAMLLoaderFactory struct { + fs http.FileSystem +} + +var _ gojsonschema.JSONLoaderFactory = new(fileSystemYAMLLoaderFactory) + +func (f *fileSystemYAMLLoaderFactory) New(source string) gojsonschema.JSONLoader { + return &yamlReferenceLoader{ + fs: f.fs, + source: source, + } +} diff --git a/versions/1/dataset/_dev/test/pipeline/config.spec.yml b/versions/1/dataset/_dev/test/pipeline/config.spec.yml deleted file mode 100644 index 6bd651cd0..000000000 --- a/versions/1/dataset/_dev/test/pipeline/config.spec.yml +++ /dev/null @@ -1,16 +0,0 @@ -## -## Describes the specification for a dataset's various field definition files -## -spec: - # Everything under here follows JSON schema (https://json-schema.org/), written as YAML for readability - type: object - additionalProperties: false - properties: - fields: - description: Field definitions - type: object - additionalProperties: true - multiline: - description: Multi-line configuration - type: object - additionalProperties: true \ No newline at end of file diff --git a/versions/1/dataset/_dev/test/pipeline/event.spec.yml b/versions/1/dataset/_dev/test/pipeline/event.spec.yml index 8f3e44e31..a205de9eb 100644 --- a/versions/1/dataset/_dev/test/pipeline/event.spec.yml +++ b/versions/1/dataset/_dev/test/pipeline/event.spec.yml @@ -12,4 +12,4 @@ spec: items: type: object additionalProperties: true - required: true \ No newline at end of file + required: [ "events" ] \ No newline at end of file diff --git a/versions/1/dataset/_dev/test/pipeline/expected.spec.yml b/versions/1/dataset/_dev/test/pipeline/expected.spec.yml index dd3307f56..53e1dd06a 100644 --- a/versions/1/dataset/_dev/test/pipeline/expected.spec.yml +++ b/versions/1/dataset/_dev/test/pipeline/expected.spec.yml @@ -12,4 +12,4 @@ spec: items: type: object additionalProperties: true - required: true \ No newline at end of file + required: [ "expected" ] \ No newline at end of file diff --git a/versions/1/dataset/_dev/test/pipeline/spec.yml b/versions/1/dataset/_dev/test/pipeline/spec.yml index 3c90b61ed..7603b87de 100644 --- a/versions/1/dataset/_dev/test/pipeline/spec.yml +++ b/versions/1/dataset/_dev/test/pipeline/spec.yml @@ -16,7 +16,18 @@ spec: pattern: '^test-[a-z0-9-]+\.log-config.json$' contentMediaType: "application/json" required: false - $ref: "./config.spec.yml" + content: + type: object + additionalProperties: false + properties: + fields: + description: Field definitions + type: object + additionalProperties: true + multiline: + description: Multi-line configuration + type: object + additionalProperties: true - description: Expected test results type: file pattern: '^test-[a-z0-9-]+\.(json|log)-expected.json$' diff --git a/versions/1/dataset/fields/fields.spec.yml b/versions/1/dataset/fields/fields.spec.yml index 91aa649b2..556aab337 100644 --- a/versions/1/dataset/fields/fields.spec.yml +++ b/versions/1/dataset/fields/fields.spec.yml @@ -3,47 +3,54 @@ ## spec: # Everything under here follows JSON schema (https://json-schema.org/), written as YAML for readability - type: object - additionalProperties: true - properties: - name: - description: Name of field - type: string - title: - description: Title of field - type: string - type: - description: Datatype of field - type: string - enum: - - constant_keyword - - text - - keyword - - long - - integer - - short - - byte - - double - - float - - half_float - - scaled_float - - date - - date_nanos - - boolean - - binary - - integer_range - - float_range - - long_range - - double_range - - date_range - - ip_range - - group - description: - description: Short description of field - type: string - fields: - description: Sub-fields, when type is group - $ref: "#" # JSON-schema syntax for pointing to the root of the schema - required: - - name - - type + type: array + items: + type: object + additionalProperties: true + properties: + name: + description: Name of field + type: string + title: + description: Title of field + type: string + type: + description: Datatype of field + type: string + enum: + - constant_keyword + - text + - keyword + - long + - integer + - short + - byte + - double + - float + - half_float + - scaled_float + - date + - date_nanos + - boolean + - binary + - integer_range + - float_range + - long_range + - double_range + - date_range + - ip_range + - group + - geo_point + - object + - ip + - nested + - array + description: + description: Short description of field + type: string + fields: + description: Sub-fields, when type is group + $ref: "#" # JSON-schema syntax for pointing to the root of the schema + required: + - name + - type diff --git a/versions/1/dataset/manifest.spec.yml b/versions/1/dataset/manifest.spec.yml index 26755f871..b1fff83fc 100644 --- a/versions/1/dataset/manifest.spec.yml +++ b/versions/1/dataset/manifest.spec.yml @@ -5,6 +5,68 @@ spec: # Everything under here follows JSON schema (https://json-schema.org/), written as YAML for readability type: object additionalProperties: false + definitions: + vars: + description: Input variables. + type: array + items: + type: object + additionalProperties: false + properties: + name: + description: Variable name. + type: string + examples: + - hosts + type: + description: Data type of variable. + type: string + enum: + - integer + - bool + - password + - text + - yaml + examples: + - text + title: + description: Title of variable. + type: string + examples: + - Hosts + description: + description: Short description of variable. + type: string + examples: + - "Hosts of integration service to connect to" + multi: + description: Can variable contain multiple values? + type: boolean + default: false + examples: + - true + required: + description: Is variable required? + type: boolean + default: false + examples: + - true + show_user: + description: Should this variable be shown to the user by default? + type: boolean + default: true + examples: + - false + default: + description: Default value(s) for variable + type: [ "string", "array", "integer", "boolean" ] + items: + type: string + examples: + - "http://127.0.0.1" + required: + - name + - type properties: name: description: Name of dataset @@ -55,63 +117,7 @@ spec: description: "Path to Elasticsearch index template for stream." type: string vars: - description: Input variables. - type: array - items: - type: object - additionalProperties: false - properties: - name: - description: Variable name. - type: string - examples: - - hosts - type: - description: Data type of variable. - type: string - enum: - - text - - yaml - examples: - - text - title: - description: Title of variable. - type: string - examples: - - Hosts - description: - description: Short description of variable. - type: string - examples: - - "Hosts of integration service to connect to" - multi: - description: Can variable contain multiple values? - type: boolean - default: false - examples: - - true - required: - description: Is variable required? - type: boolean - default: false - examples: - - true - show_user: - description: Should this variable be shown to the user by default? - type: boolean - default: true - examples: - - false - default: - description: Default value(s) for variable - type: array - items: - type: string - examples: - - "http://127.0.0.1" - required: - - name - - type + $ref: "#/definitions/vars" enabled: description: Is stream enabled? type: boolean diff --git a/versions/1/manifest.spec.yml b/versions/1/manifest.spec.yml index 0b184661e..c611dcdcd 100644 --- a/versions/1/manifest.spec.yml +++ b/versions/1/manifest.spec.yml @@ -92,17 +92,13 @@ spec: conditions: description: Constraints under which this package can be installed. type: object - additionalProperties: false + additionalProperties: false properties: - kibana: + kibana.version: + type: string description: Kibana versions compatible with this package. - type: object - additionalProperties: false - properties: - version: - type: string - examples: - - ">=7.9.0" + examples: + - ">=7.9.0" icons: description: List of icons for by this package. type: array @@ -202,10 +198,10 @@ spec: description: description: Longer description of input. type: string - examples: + examples: - Collecting Apache access and error logs vars: - $ref: "./dataset/manifest.spec.yml#streams/items/properties/vars" + $ref: "./dataset/manifest.spec.yml#/definitions/vars" required: - type - title @@ -216,10 +212,6 @@ spec: - name - title - description - datasets: - type: array - items: - $ref: "./dataset/manifest.spec.yml" owner: type: object additionalProperties: false