diff --git a/common-operating-picture/.gitignore b/common-operating-picture/.gitignore index 50ff16d..1882594 100644 --- a/common-operating-picture/.gitignore +++ b/common-operating-picture/.gitignore @@ -1,15 +1,32 @@ # Local development db-data -#dsp.yaml dsp-keys +proto_vendor/ +credentials.json +#.venv/ # Binary dsp-cop - +geos-*.apk +geos/ # Sensitive or environment-specific configuration -config.yaml -config.docker.yaml +etc/ # Nifi **/truststore +# IDE +.vscode +.idea + +# Bundle +virtru-dsp-bundle-* +virtru-dsp-bundle/ + +# Node +node_modules/ + +#python vevn +COP_venv/ + + diff --git a/common-operating-picture/README.md b/common-operating-picture/README.md index dba07ef..ba09994 100644 --- a/common-operating-picture/README.md +++ b/common-operating-picture/README.md @@ -23,7 +23,7 @@ Table of Contents ## Quick Start -This applicaiton can be run in two modes: +This application can be run in two modes: 1. `Lite` - Sits on top of an already-deployed DSP stack - Follow [lite-deployment.md](./deploy/lite/lite-deployment.md) 1. `Full` - Deploys a full DSP stack @@ -63,7 +63,7 @@ and [Configuration](#configuration)). The configuration file is mapped in `config.example.yaml` and can be located at specific locations scoped to how you are running the application. -1. Project-level: `config.yaml` +1. Project-level: `/config.docker.yaml/config.docker.yaml` 2. User-level: `~/.dsp-cop/config.yaml` 3. System-level: `/etc/dsp-cop/config.yaml` @@ -99,93 +99,195 @@ To demonstrate the capabilities of DSP, there are two root-level files to provis ### Pre-requisites -1. Copy the config `cp config.example.yaml config.yaml` -2. Install necessary dependencies(only _one_ docker runtime is needed): - 1. Container runtime and compose - * Docker + Docker Compose - * [Colima (recommended)](https://github.com/abiosoft/colima) - * [Rancher Desktop](https://rancherdesktop.io) - * [Podman Desktop](https://podman-desktop.io) - 2. [node](https://nodejs.org/en/download/package-manager) - 3. [golang](https://go.dev/doc/install) - 4. [geos](https://libgeos.org/usage/install/) - 5. [make](https://formulae.brew.sh/formula/make) -3. Map `local-dsp.virtru.com` to `localhost` in your hosts file - - To ensure all PEPs can operate we need to map a local domain to the your localhost. - In \*nix environments your hosts file is located at `/etc/hosts` and windows is typically `C:\Windows\System32\drivers\etc`. +1. **Run the Setup Script** +To install necessary dependencies automatically, run the provided script: - > [!NOTE] - > You will probably need to use root permisisons (i.e. `sudo`) to edit your hosts file. + ```bash + ./ubuntu_cop_prereqs_cop.sh + + # Reboot after running script for some changes to take effect + reboot + ``` + +
+ Manual Installation Details (Optional) + + If you prefer to install manually or need to debug, the script handles the following: + + - **Container Runtime:** Installs Docker + Docker Compose. + - _Alternatives supported:_ [Colima (recommended)](https://github.com/abiosoft/colima), [Rancher Desktop](https://rancherdesktop.io), or [Podman Desktop](https://podman-desktop.io). + - **Languages & Tools:** + - [Node.js (via nvm)](https://nodejs.org/en/download/package-manager) + - [Go (Golang)](https://go.dev/doc/install) + - [GEOS](https://libgeos.org/usage/install/) + - [Make](https://formulae.brew.sh/formula/make) +
+ - **Local DNS Configuration** + - Entry added into /etc/hosts + - ```text + 127.0.0.1 local-dsp.virtru.com + ``` + +--- + +### Step 1: Generate Local Certificates (Mkcert) + +You need SSL certificates for local development. + +**Option A: Script Setup** +Run the key generation script: + +```bash +./ubuntu_cop_keys.sh +``` + +**Option B: Make Command** +** Note: you can use `'make dev-certs'` as a shortcut to generate the development certs ** - ```shell - 127.0.0.1 local-dsp.virtru.com - ``` +**Currently NonFunctional - Use the script above** + +```bash +# Make command +make dev-certs +``` -4. Use Mkcert for local development +### Step 2: Unpack the Bundle - We use `mkcert` to generate certs for local development. This is required for the `local-dsp.virtru.com` domain. +Unzip the main bundle and unpack the specific DSP tools. Replace `X.X.X`, ``, and `` with your specific version and system details. - ```shell - brew install mkcert - ``` + ```bash + # 1. Untar the main bundle + mkdir virtru-dsp-bundle && tar -xvf virtru-dsp-bundle-* -C virtru-dsp-bundle/ && cd virtru-dsp-bundle/ - Next follow these steps to generate the certs: + # 2. Unpack DSP Tools + tar -xvf tools/dsp/data-security-platform_X.X.X__.tar.gz + #Example - AMD linux: + tar -xvf tools/dsp/data-security-platform_2.7.1_linux_amd64.tar.gz - ```shell - # Create the keys dir - mkdir -p dsp-keys - # Install the CA - mkcert -install - # Generate the certs - mkcert -cert-file dsp-keys/local-dsp.virtru.com.pem -key-file dsp-keys/local-dsp.virtru.com.key.pem local-dsp.virtru.com "*.local-dsp.virtru.com" localhost - # Generate keys for KAS and PolicyImportExport artifact signing - ./.github/scripts/init-temp-keys.sh - # OPTIONAL: generate temporary x509 certificates - ./.github/scripts/x509-temp-keys.sh - ``` + # 3. Unpack and setup Helm + tar -xvf tools/helm/helm-vX.X.X--.tar.gz + #Example - AMD linux: + tar -xvf tools/helm/helm-v3.15.4-linux-amd64.tar.gz + # Then move command into working directory + mv -/helm ./helm - > Note: you can use `'make dev-certs'` as a shortcut to generate the development certs + # 4. Unpack and setup grpcurl + tar -xvf tools/grpcurl/grpcurl_X.X.X__.tar.gz + #Example - AMD linux: + tar -xvf tools/grpcurl/grpcurl_1.9.1_linux_x86_64.tar.gz -5. Copy DSP Docker Images to Local Registry + # Make Executable + chmod +x ./grpcurl + ``` - DSP images are stored in the `virtru-dsp-bundle` as OCI artifacts. They can be copied to your local registry by using the `dsp copy-images` utility in that same bundle: +### Step 3: Setup Local Docker Registry - ```bash - # Setup a local registry - docker run -d --restart=always -p 5000:5000 --name registry registry:2 - # Copy DSP images into local registry (Run in virtru-dsp-bundle root-level) - dsp copy-images --insecure localhost:5000/virtru - # Confirm that the images were successfully copied - curl -X GET http://localhost:5000/v2/_catalog - curl -X GET http://localhost:5000/v2/virtru/data-security-platform/tags/list - ``` +The DSP images are stored in the bundle as OCI artifacts. You must spin up a local registry and copy the images into it. -### Start required services + ```bash + # 1. Start a local registry instance + docker run -d --restart=always -p 5000:5000 --name registry registry:2 -Create and start containers + # 2. Copy DSP images into local registry + # (Run this from the virtru-dsp-bundle root directory) + ./dsp copy-images --insecure localhost:5000/virtru -```sh - docker compose -f docker-compose.all.yaml up + # 3. Verify images were copied successfully + curl -X GET http://localhost:5000/v2/_catalog + curl -X GET http://localhost:5000/v2/virtru/data-security-platform/tags/list + ``` + +### Step 4: Build and Run + +Use Docker Compose to build and start the environment. + +**Start the environment:** + +```bash +docker compose --env-file env/default.env -f docker-compose.dev.yaml up --build --force-recreate ``` + This starts the following services: + + 1. [COP database](./compose/docker-compose.cop-db.yaml) + 2. [Keycloak](./compose/docker-compose.keycloak.yaml) + 3. [Data Security Platform (DSP)](./compose/docker-compose.dsp.yaml) + 1. Provision keycloak with sample users and clients + 2. Setup the database + 3. Start the DSP server + 4. Load the sample policy + 4. [COP Web Server](./compose/docker-compose.cop-web-server.yaml) + 5. [NiFi](./compose/docker-compose.nifi.yaml) (_disabled by default_) + > [!NOTE] + > Nifi is resource-intensive, so you should run `colima` with extra resources allocated: `colima start --memory 16 --cpu 6` + 1. For local docker compose, run the [build_truststore_local.sh](./build_truststore_local.sh) to build a truststore for use with NiFi and Tagging Services + 2. Copy the trusted cert for tagging pdp use to it's mounted drive: `cp ./dsp-keys/local-dsp.virtru.com.pem ./nifi/truststore` + 3. Run with envfile and nifi profile enabled: `docker compose --profile nifi -f docker-compose.all.yaml --env-file=./env/default.env up` + * Note that NiFi uses significant resources; ensure your docker env has sufficient resources allocated + +Local COP Application URL: https://local-dsp.virtru.com:5001/ + +**Stop the environment:** + +The following will stop the enviroment and COP application. Crtl + c in the terminal will also stop the containers however it is recommended +to also run the following down command as it will cleanup the container remnants. + +```bash +docker compose --env-file env/default.env -f docker-compose.dev.yaml down +``` + +--- + +### Step 5. Seeding Vehicle Data and Live Data Flow Simulation + +Following the successful building of COP: + + ```bash + # Install the venv module + sudo apt install python3-venv -y + + # Create a virtual environment named 'COP_venv' in the current directory + python3 -m venv COP_venv + ``` + + ```bash + # Activate the virtual environment. + # Your shell prompt will change to indicate it's active. + source COP_venv/bin/activate + ``` + + ```bash + # Pip install all required package from requirements.txt + pip install -r requirements.txt + ``` + + ```bash + # Run seeding script to populate database + # 50 is the standard number of objects that the script will inset but is configurable via NUM_RECORDS variable + python3 seed_data.py + ``` + + ```bash + # Start simulation + # NUM_ENTITIES will determine how many moving entities the script will query the database for and apply movement logic to + # UPDATE_INTERVAL_SECONDS determins the frequency of movement for each object + # BOUNDING_BOX_PARAMS define the area for the OpenSky query for live planes (smaller box results in less credits used on init). + + # For live data from OpenSky Network login to https://opensky-network.org/, download credentials file (credentials.json), + # place the file in the base director (where the sim_data.py script is located) and then run: + python3 sim_data.py + + # For a fake simulation that does not require the credentials file or use account credits with OpenSky run this script + # for simulated movement: + python3 sim_data_fake_opensky.py + ``` + +### Troubleshooting & Verification Checklist + +If you encounter issues, double-check the following: -This starts the following services: - -1. [COP database](./compose/docker-compose.cop-db.yaml) -2. [Keycloak](./compose/docker-compose.keycloak.yaml) -3. [Data Security Platform (DSP)](./compose/docker-compose.dsp.yaml) - 1. Provision keycloak with sample users and clients - 2. Setup the database - 3. Start the DSP server - 4. Load the sample policy -4. [COP Web Server](./compose/docker-compose.cop-web-server.yaml) -5. [NiFi](./compose/docker-compose.nifi.yaml) (_disabled by default_) - > [!NOTE] - > Nifi is resource-intensive, so you should run `colima` with extra resources allocated: `colima start --memory 16 --cpu 6` - 1. For local docker compose, run the [build_truststore_local.sh](./build_truststore_local.sh) to build a truststore for use with NiFi and Tagging Services - 2. Copy the trusted cert for tagging pdp use to it's mounted drive: `cp ./dsp-keys/local-dsp.virtru.com.pem ./nifi/truststore` - 3. Run with envfile and nifi profile enabled: `docker compose --profile nifi -f docker-compose.all.yaml --env-file=./env/default.env up` - * Note that NiFi uses significant resources; ensure your docker env has sufficient resources allocated +- **dsp.yaml:** Ensure this file exists in your working directory. +- **rootCA.cert:** Ensure the root CA certificate was copied correctly during the setup. +- **Permissions:** Verify that the certificates in `dsp-keys` have `chmod 755` permissions. ### Run the COP Server Locally @@ -229,7 +331,7 @@ See the [ui README](/ui/README.md) for more information on the frontend developm DSP-COP supports two authentication flows: 1. Username/Password (default) - - user enters credentials into application form, application initiates token request + - user enters credentials into application form, application initiates token request 2. Keycloak Authentication (PKI/x509 or username/password) - Application redirects user to Keycloak for authentication, keycloak returns a token @@ -318,7 +420,7 @@ dsp tructl --with-client-creds '{"clientId":"opentdf","clientSecret":"secret"}' * Possible to zoom out the map and see countries multiple times with only single pins rendered * Autocomplete in form UI is unintuitive * When searching, no UI validation of start and end date/time - * start date is required + * start date is required * start date must be before end date * URL search params are not cleared when swithing between source types, resulting in unrelated params breaking search * Source Type is NULLable and should be required diff --git a/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note.pb.go b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note.pb.go new file mode 100644 index 0000000..9d0d3ae --- /dev/null +++ b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note.pb.go @@ -0,0 +1,969 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v3.21.12 +// source: tdf_note/v1/tdf_note.proto + +package tdf_notev1 + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The StreamEventType enum is reused from the previous schema +type StreamEventType int32 + +const ( + StreamEventType_STREAM_EVENT_TYPE_UNSPECIFIED StreamEventType = 0 + // system events + StreamEventType_STREAM_EVENT_TYPE_STARTUP StreamEventType = 1 + StreamEventType_STREAM_EVENT_TYPE_SHUTDOWN StreamEventType = 2 + StreamEventType_STREAM_EVENT_TYPE_RESTART StreamEventType = 3 + StreamEventType_STREAM_EVENT_TYPE_MAINTENANCE StreamEventType = 4 + // data events + StreamEventType_STREAM_EVENT_TYPE_CONNECTED StreamEventType = 5 + StreamEventType_STREAM_EVENT_TYPE_HEARTBEAT StreamEventType = 6 + // generic events + StreamEventType_STREAM_EVENT_TYPE_GENERIC_ERROR StreamEventType = 10 + StreamEventType_STREAM_EVENT_TYPE_SERVER_ERROR StreamEventType = 11 + StreamEventType_STREAM_EVENT_TYPE_DATA_ERROR StreamEventType = 12 + // tdf_notes stream events + StreamEventType_STREAM_EVENT_TYPE_TDF_NOTES_NEW StreamEventType = 20 +) + +// Enum value maps for StreamEventType. +var ( + StreamEventType_name = map[int32]string{ + 0: "STREAM_EVENT_TYPE_UNSPECIFIED", + 1: "STREAM_EVENT_TYPE_STARTUP", + 2: "STREAM_EVENT_TYPE_SHUTDOWN", + 3: "STREAM_EVENT_TYPE_RESTART", + 4: "STREAM_EVENT_TYPE_MAINTENANCE", + 5: "STREAM_EVENT_TYPE_CONNECTED", + 6: "STREAM_EVENT_TYPE_HEARTBEAT", + 10: "STREAM_EVENT_TYPE_GENERIC_ERROR", + 11: "STREAM_EVENT_TYPE_SERVER_ERROR", + 12: "STREAM_EVENT_TYPE_DATA_ERROR", + 20: "STREAM_EVENT_TYPE_TDF_NOTES_NEW", + } + StreamEventType_value = map[string]int32{ + "STREAM_EVENT_TYPE_UNSPECIFIED": 0, + "STREAM_EVENT_TYPE_STARTUP": 1, + "STREAM_EVENT_TYPE_SHUTDOWN": 2, + "STREAM_EVENT_TYPE_RESTART": 3, + "STREAM_EVENT_TYPE_MAINTENANCE": 4, + "STREAM_EVENT_TYPE_CONNECTED": 5, + "STREAM_EVENT_TYPE_HEARTBEAT": 6, + "STREAM_EVENT_TYPE_GENERIC_ERROR": 10, + "STREAM_EVENT_TYPE_SERVER_ERROR": 11, + "STREAM_EVENT_TYPE_DATA_ERROR": 12, + "STREAM_EVENT_TYPE_TDF_NOTES_NEW": 20, + } +) + +func (x StreamEventType) Enum() *StreamEventType { + p := new(StreamEventType) + *p = x + return p +} + +func (x StreamEventType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StreamEventType) Descriptor() protoreflect.EnumDescriptor { + return file_tdf_note_v1_tdf_note_proto_enumTypes[0].Descriptor() +} + +func (StreamEventType) Type() protoreflect.EnumType { + return &file_tdf_note_v1_tdf_note_proto_enumTypes[0] +} + +func (x StreamEventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StreamEventType.Descriptor instead. +func (StreamEventType) EnumDescriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{0} +} + +// Represents a note associated with a TDF object +type TdfNote struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the note + Ts *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=ts,proto3" json:"ts,omitempty"` // Timestamp of the note creation + ParentId string `protobuf:"bytes,3,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` // Plaintext JSON search index for searching notes + TdfBlob []byte `protobuf:"bytes,5,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // Binary TDF data for the note + TdfUri string `protobuf:"bytes,6,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` // URI pointing to the note data + XCreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=_created_at,json=CreatedAt,proto3" json:"_created_at,omitempty"` // Timestamp of when the note was created + XCreatedBy string `protobuf:"bytes,8,opt,name=_created_by,json=CreatedBy,proto3" json:"_created_by,omitempty"` // Who created the note +} + +func (x *TdfNote) Reset() { + *x = TdfNote{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TdfNote) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TdfNote) ProtoMessage() {} + +func (x *TdfNote) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TdfNote.ProtoReflect.Descriptor instead. +func (*TdfNote) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{0} +} + +func (x *TdfNote) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TdfNote) GetTs() *timestamppb.Timestamp { + if x != nil { + return x.Ts + } + return nil +} + +func (x *TdfNote) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *TdfNote) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *TdfNote) GetTdfBlob() []byte { + if x != nil { + return x.TdfBlob + } + return nil +} + +func (x *TdfNote) GetTdfUri() string { + if x != nil { + return x.TdfUri + } + return "" +} + +func (x *TdfNote) GetXCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.XCreatedAt + } + return nil +} + +func (x *TdfNote) GetXCreatedBy() string { + if x != nil { + return x.XCreatedBy + } + return "" +} + +// Request message for creating a new note +type CreateTdfNoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentId string `protobuf:"bytes,1,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + Search string `protobuf:"bytes,2,opt,name=search,proto3" json:"search,omitempty"` // Plaintext JSON search index for searching notes + TdfBlob []byte `protobuf:"bytes,3,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // Binary TDF data for the note + TdfUri string `protobuf:"bytes,4,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` // URI pointing to the note data + Ts *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=ts,proto3" json:"ts,omitempty"` // Timestamp of the note +} + +func (x *CreateTdfNoteRequest) Reset() { + *x = CreateTdfNoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTdfNoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTdfNoteRequest) ProtoMessage() {} + +func (x *CreateTdfNoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTdfNoteRequest.ProtoReflect.Descriptor instead. +func (*CreateTdfNoteRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateTdfNoteRequest) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *CreateTdfNoteRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *CreateTdfNoteRequest) GetTdfBlob() []byte { + if x != nil { + return x.TdfBlob + } + return nil +} + +func (x *CreateTdfNoteRequest) GetTdfUri() string { + if x != nil { + return x.TdfUri + } + return "" +} + +func (x *CreateTdfNoteRequest) GetTs() *timestamppb.Timestamp { + if x != nil { + return x.Ts + } + return nil +} + +// Response message for creating a new note +type CreateTdfNoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier of the newly created note +} + +func (x *CreateTdfNoteResponse) Reset() { + *x = CreateTdfNoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTdfNoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTdfNoteResponse) ProtoMessage() {} + +func (x *CreateTdfNoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTdfNoteResponse.ProtoReflect.Descriptor instead. +func (*CreateTdfNoteResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateTdfNoteResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// Request message to retrieve a note by ID +type GetTdfNoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The ID of the note to retrieve +} + +func (x *GetTdfNoteRequest) Reset() { + *x = GetTdfNoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTdfNoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTdfNoteRequest) ProtoMessage() {} + +func (x *GetTdfNoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTdfNoteRequest.ProtoReflect.Descriptor instead. +func (*GetTdfNoteRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{3} +} + +func (x *GetTdfNoteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// Response message for retrieving a note by ID +type GetTdfNoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TdfNote *TdfNote `protobuf:"bytes,1,opt,name=tdf_note,json=tdfNote,proto3" json:"tdf_note,omitempty"` // The note object +} + +func (x *GetTdfNoteResponse) Reset() { + *x = GetTdfNoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTdfNoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTdfNoteResponse) ProtoMessage() {} + +func (x *GetTdfNoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTdfNoteResponse.ProtoReflect.Descriptor instead. +func (*GetTdfNoteResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{4} +} + +func (x *GetTdfNoteResponse) GetTdfNote() *TdfNote { + if x != nil { + return x.TdfNote + } + return nil +} + +// Request message for querying notes associated with a TDF object +type QueryTdfNotesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentId string `protobuf:"bytes,1,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + StartTs *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` // Start timestamp for querying notes + EndTs *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_ts,json=endTs,proto3" json:"end_ts,omitempty"` // End timestamp for querying notes + Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` // Search query for filtering notes +} + +func (x *QueryTdfNotesRequest) Reset() { + *x = QueryTdfNotesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryTdfNotesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryTdfNotesRequest) ProtoMessage() {} + +func (x *QueryTdfNotesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryTdfNotesRequest.ProtoReflect.Descriptor instead. +func (*QueryTdfNotesRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{5} +} + +func (x *QueryTdfNotesRequest) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *QueryTdfNotesRequest) GetStartTs() *timestamppb.Timestamp { + if x != nil { + return x.StartTs + } + return nil +} + +func (x *QueryTdfNotesRequest) GetEndTs() *timestamppb.Timestamp { + if x != nil { + return x.EndTs + } + return nil +} + +func (x *QueryTdfNotesRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +// Response message for querying notes associated with a TDF object +type QueryTdfNotesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TdfNotes []*TdfNote `protobuf:"bytes,1,rep,name=tdf_notes,json=tdfNotes,proto3" json:"tdf_notes,omitempty"` // List of notes associated with the parent TDF object +} + +func (x *QueryTdfNotesResponse) Reset() { + *x = QueryTdfNotesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryTdfNotesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryTdfNotesResponse) ProtoMessage() {} + +func (x *QueryTdfNotesResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryTdfNotesResponse.ProtoReflect.Descriptor instead. +func (*QueryTdfNotesResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryTdfNotesResponse) GetTdfNotes() []*TdfNote { + if x != nil { + return x.TdfNotes + } + return nil +} + +type StreamTdfNotesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StreamTdfNotesRequest) Reset() { + *x = StreamTdfNotesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamTdfNotesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamTdfNotesRequest) ProtoMessage() {} + +func (x *StreamTdfNotesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamTdfNotesRequest.ProtoReflect.Descriptor instead. +func (*StreamTdfNotesRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{7} +} + +// Stream response for streaming note events (similar to streaming TDF objects) +type StreamTdfNotesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventType StreamEventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=tdf_notes.v1.StreamEventType" json:"event_type,omitempty"` // Type of stream event (e.g., new note) + EventDetail string `protobuf:"bytes,2,opt,name=event_detail,json=eventDetail,proto3" json:"event_detail,omitempty"` // Details about the event + TdfNotes []*TdfNote `protobuf:"bytes,6,rep,name=tdf_notes,json=tdfNotes,proto3" json:"tdf_notes,omitempty"` // List of notes being streamed +} + +func (x *StreamTdfNotesResponse) Reset() { + *x = StreamTdfNotesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamTdfNotesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamTdfNotesResponse) ProtoMessage() {} + +func (x *StreamTdfNotesResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamTdfNotesResponse.ProtoReflect.Descriptor instead. +func (*StreamTdfNotesResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{8} +} + +func (x *StreamTdfNotesResponse) GetEventType() StreamEventType { + if x != nil { + return x.EventType + } + return StreamEventType_STREAM_EVENT_TYPE_UNSPECIFIED +} + +func (x *StreamTdfNotesResponse) GetEventDetail() string { + if x != nil { + return x.EventDetail + } + return "" +} + +func (x *StreamTdfNotesResponse) GetTdfNotes() []*TdfNote { + if x != nil { + return x.TdfNotes + } + return nil +} + +var File_tdf_note_v1_tdf_note_proto protoreflect.FileDescriptor + +var file_tdf_note_v1_tdf_note_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8a, 0x02, 0x0a, 0x07, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x02, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, + 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, + 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x3a, 0x0a, 0x0b, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, 0x62, 0x6c, + 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, + 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x07, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x22, 0xb5, 0x01, 0x0a, + 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x65, 0x6e, 0x64, 0x54, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x22, 0x4b, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, + 0x09, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x08, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, + 0x73, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xbf, 0x01, 0x0a, 0x16, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x32, 0x0a, 0x09, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, + 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, + 0x52, 0x08, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, + 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x2a, 0x87, 0x03, 0x0a, + 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, + 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e, + 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, + 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, + 0x43, 0x45, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, + 0x42, 0x45, 0x41, 0x54, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, + 0x52, 0x49, 0x43, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x22, 0x0a, 0x1e, 0x53, + 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0b, 0x12, + 0x20, 0x0a, 0x1c, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x44, 0x46, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x53, + 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x14, 0x32, 0xf4, 0x02, 0x0a, 0x0e, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x74, 0x64, 0x66, + 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, + 0x65, 0x12, 0x1f, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, + 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, + 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, + 0x12, 0x23, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x41, 0x5a, + 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x69, 0x72, 0x74, + 0x72, 0x75, 0x2d, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x64, 0x73, 0x70, 0x2d, 0x63, 0x6f, 0x70, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, + 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_tdf_note_v1_tdf_note_proto_rawDescOnce sync.Once + file_tdf_note_v1_tdf_note_proto_rawDescData = file_tdf_note_v1_tdf_note_proto_rawDesc +) + +func file_tdf_note_v1_tdf_note_proto_rawDescGZIP() []byte { + file_tdf_note_v1_tdf_note_proto_rawDescOnce.Do(func() { + file_tdf_note_v1_tdf_note_proto_rawDescData = protoimpl.X.CompressGZIP(file_tdf_note_v1_tdf_note_proto_rawDescData) + }) + return file_tdf_note_v1_tdf_note_proto_rawDescData +} + +var file_tdf_note_v1_tdf_note_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tdf_note_v1_tdf_note_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_tdf_note_v1_tdf_note_proto_goTypes = []interface{}{ + (StreamEventType)(0), // 0: tdf_notes.v1.StreamEventType + (*TdfNote)(nil), // 1: tdf_notes.v1.TdfNote + (*CreateTdfNoteRequest)(nil), // 2: tdf_notes.v1.CreateTdfNoteRequest + (*CreateTdfNoteResponse)(nil), // 3: tdf_notes.v1.CreateTdfNoteResponse + (*GetTdfNoteRequest)(nil), // 4: tdf_notes.v1.GetTdfNoteRequest + (*GetTdfNoteResponse)(nil), // 5: tdf_notes.v1.GetTdfNoteResponse + (*QueryTdfNotesRequest)(nil), // 6: tdf_notes.v1.QueryTdfNotesRequest + (*QueryTdfNotesResponse)(nil), // 7: tdf_notes.v1.QueryTdfNotesResponse + (*StreamTdfNotesRequest)(nil), // 8: tdf_notes.v1.StreamTdfNotesRequest + (*StreamTdfNotesResponse)(nil), // 9: tdf_notes.v1.StreamTdfNotesResponse + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp +} +var file_tdf_note_v1_tdf_note_proto_depIdxs = []int32{ + 10, // 0: tdf_notes.v1.TdfNote.ts:type_name -> google.protobuf.Timestamp + 10, // 1: tdf_notes.v1.TdfNote._created_at:type_name -> google.protobuf.Timestamp + 10, // 2: tdf_notes.v1.CreateTdfNoteRequest.ts:type_name -> google.protobuf.Timestamp + 1, // 3: tdf_notes.v1.GetTdfNoteResponse.tdf_note:type_name -> tdf_notes.v1.TdfNote + 10, // 4: tdf_notes.v1.QueryTdfNotesRequest.start_ts:type_name -> google.protobuf.Timestamp + 10, // 5: tdf_notes.v1.QueryTdfNotesRequest.end_ts:type_name -> google.protobuf.Timestamp + 1, // 6: tdf_notes.v1.QueryTdfNotesResponse.tdf_notes:type_name -> tdf_notes.v1.TdfNote + 0, // 7: tdf_notes.v1.StreamTdfNotesResponse.event_type:type_name -> tdf_notes.v1.StreamEventType + 1, // 8: tdf_notes.v1.StreamTdfNotesResponse.tdf_notes:type_name -> tdf_notes.v1.TdfNote + 2, // 9: tdf_notes.v1.TdfNoteService.CreateTdfNote:input_type -> tdf_notes.v1.CreateTdfNoteRequest + 4, // 10: tdf_notes.v1.TdfNoteService.GetTdfNote:input_type -> tdf_notes.v1.GetTdfNoteRequest + 6, // 11: tdf_notes.v1.TdfNoteService.QueryTdfNotes:input_type -> tdf_notes.v1.QueryTdfNotesRequest + 8, // 12: tdf_notes.v1.TdfNoteService.StreamTdfNotes:input_type -> tdf_notes.v1.StreamTdfNotesRequest + 3, // 13: tdf_notes.v1.TdfNoteService.CreateTdfNote:output_type -> tdf_notes.v1.CreateTdfNoteResponse + 5, // 14: tdf_notes.v1.TdfNoteService.GetTdfNote:output_type -> tdf_notes.v1.GetTdfNoteResponse + 7, // 15: tdf_notes.v1.TdfNoteService.QueryTdfNotes:output_type -> tdf_notes.v1.QueryTdfNotesResponse + 9, // 16: tdf_notes.v1.TdfNoteService.StreamTdfNotes:output_type -> tdf_notes.v1.StreamTdfNotesResponse + 13, // [13:17] is the sub-list for method output_type + 9, // [9:13] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_tdf_note_v1_tdf_note_proto_init() } +func file_tdf_note_v1_tdf_note_proto_init() { + if File_tdf_note_v1_tdf_note_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_tdf_note_v1_tdf_note_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TdfNote); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateTdfNoteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateTdfNoteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTdfNoteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTdfNoteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryTdfNotesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryTdfNotesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamTdfNotesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamTdfNotesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_tdf_note_v1_tdf_note_proto_rawDesc, + NumEnums: 1, + NumMessages: 9, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_tdf_note_v1_tdf_note_proto_goTypes, + DependencyIndexes: file_tdf_note_v1_tdf_note_proto_depIdxs, + EnumInfos: file_tdf_note_v1_tdf_note_proto_enumTypes, + MessageInfos: file_tdf_note_v1_tdf_note_proto_msgTypes, + }.Build() + File_tdf_note_v1_tdf_note_proto = out.File + file_tdf_note_v1_tdf_note_proto_rawDesc = nil + file_tdf_note_v1_tdf_note_proto_goTypes = nil + file_tdf_note_v1_tdf_note_proto_depIdxs = nil +} diff --git a/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note_grpc.pb.go b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note_grpc.pb.go new file mode 100644 index 0000000..098e4e7 --- /dev/null +++ b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_note_grpc.pb.go @@ -0,0 +1,257 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.21.12 +// source: tdf_note/v1/tdf_note.proto + +package tdf_notev1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + TdfNoteService_CreateTdfNote_FullMethodName = "/tdf_notes.v1.TdfNoteService/CreateTdfNote" + TdfNoteService_GetTdfNote_FullMethodName = "/tdf_notes.v1.TdfNoteService/GetTdfNote" + TdfNoteService_QueryTdfNotes_FullMethodName = "/tdf_notes.v1.TdfNoteService/QueryTdfNotes" + TdfNoteService_StreamTdfNotes_FullMethodName = "/tdf_notes.v1.TdfNoteService/StreamTdfNotes" +) + +// TdfNoteServiceClient is the client API for TdfNoteService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type TdfNoteServiceClient interface { + // RPC for creating a new TDF note + CreateTdfNote(ctx context.Context, in *CreateTdfNoteRequest, opts ...grpc.CallOption) (*CreateTdfNoteResponse, error) + // RPC for retrieving a TDF note by ID + GetTdfNote(ctx context.Context, in *GetTdfNoteRequest, opts ...grpc.CallOption) (*GetTdfNoteResponse, error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(ctx context.Context, in *QueryTdfNotesRequest, opts ...grpc.CallOption) (*QueryTdfNotesResponse, error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(ctx context.Context, in *StreamTdfNotesRequest, opts ...grpc.CallOption) (TdfNoteService_StreamTdfNotesClient, error) +} + +type tdfNoteServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewTdfNoteServiceClient(cc grpc.ClientConnInterface) TdfNoteServiceClient { + return &tdfNoteServiceClient{cc} +} + +func (c *tdfNoteServiceClient) CreateTdfNote(ctx context.Context, in *CreateTdfNoteRequest, opts ...grpc.CallOption) (*CreateTdfNoteResponse, error) { + out := new(CreateTdfNoteResponse) + err := c.cc.Invoke(ctx, TdfNoteService_CreateTdfNote_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) GetTdfNote(ctx context.Context, in *GetTdfNoteRequest, opts ...grpc.CallOption) (*GetTdfNoteResponse, error) { + out := new(GetTdfNoteResponse) + err := c.cc.Invoke(ctx, TdfNoteService_GetTdfNote_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) QueryTdfNotes(ctx context.Context, in *QueryTdfNotesRequest, opts ...grpc.CallOption) (*QueryTdfNotesResponse, error) { + out := new(QueryTdfNotesResponse) + err := c.cc.Invoke(ctx, TdfNoteService_QueryTdfNotes_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) StreamTdfNotes(ctx context.Context, in *StreamTdfNotesRequest, opts ...grpc.CallOption) (TdfNoteService_StreamTdfNotesClient, error) { + stream, err := c.cc.NewStream(ctx, &TdfNoteService_ServiceDesc.Streams[0], TdfNoteService_StreamTdfNotes_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &tdfNoteServiceStreamTdfNotesClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type TdfNoteService_StreamTdfNotesClient interface { + Recv() (*StreamTdfNotesResponse, error) + grpc.ClientStream +} + +type tdfNoteServiceStreamTdfNotesClient struct { + grpc.ClientStream +} + +func (x *tdfNoteServiceStreamTdfNotesClient) Recv() (*StreamTdfNotesResponse, error) { + m := new(StreamTdfNotesResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// TdfNoteServiceServer is the server API for TdfNoteService service. +// All implementations must embed UnimplementedTdfNoteServiceServer +// for forward compatibility +type TdfNoteServiceServer interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *CreateTdfNoteRequest) (*CreateTdfNoteResponse, error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *GetTdfNoteRequest) (*GetTdfNoteResponse, error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *QueryTdfNotesRequest) (*QueryTdfNotesResponse, error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(*StreamTdfNotesRequest, TdfNoteService_StreamTdfNotesServer) error + mustEmbedUnimplementedTdfNoteServiceServer() +} + +// UnimplementedTdfNoteServiceServer must be embedded to have forward compatible implementations. +type UnimplementedTdfNoteServiceServer struct { +} + +func (UnimplementedTdfNoteServiceServer) CreateTdfNote(context.Context, *CreateTdfNoteRequest) (*CreateTdfNoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateTdfNote not implemented") +} +func (UnimplementedTdfNoteServiceServer) GetTdfNote(context.Context, *GetTdfNoteRequest) (*GetTdfNoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTdfNote not implemented") +} +func (UnimplementedTdfNoteServiceServer) QueryTdfNotes(context.Context, *QueryTdfNotesRequest) (*QueryTdfNotesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryTdfNotes not implemented") +} +func (UnimplementedTdfNoteServiceServer) StreamTdfNotes(*StreamTdfNotesRequest, TdfNoteService_StreamTdfNotesServer) error { + return status.Errorf(codes.Unimplemented, "method StreamTdfNotes not implemented") +} +func (UnimplementedTdfNoteServiceServer) mustEmbedUnimplementedTdfNoteServiceServer() {} + +// UnsafeTdfNoteServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to TdfNoteServiceServer will +// result in compilation errors. +type UnsafeTdfNoteServiceServer interface { + mustEmbedUnimplementedTdfNoteServiceServer() +} + +func RegisterTdfNoteServiceServer(s grpc.ServiceRegistrar, srv TdfNoteServiceServer) { + s.RegisterService(&TdfNoteService_ServiceDesc, srv) +} + +func _TdfNoteService_CreateTdfNote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateTdfNoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).CreateTdfNote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_CreateTdfNote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).CreateTdfNote(ctx, req.(*CreateTdfNoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_GetTdfNote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTdfNoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).GetTdfNote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_GetTdfNote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).GetTdfNote(ctx, req.(*GetTdfNoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_QueryTdfNotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTdfNotesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).QueryTdfNotes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_QueryTdfNotes_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).QueryTdfNotes(ctx, req.(*QueryTdfNotesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_StreamTdfNotes_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StreamTdfNotesRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TdfNoteServiceServer).StreamTdfNotes(m, &tdfNoteServiceStreamTdfNotesServer{stream}) +} + +type TdfNoteService_StreamTdfNotesServer interface { + Send(*StreamTdfNotesResponse) error + grpc.ServerStream +} + +type tdfNoteServiceStreamTdfNotesServer struct { + grpc.ServerStream +} + +func (x *tdfNoteServiceStreamTdfNotesServer) Send(m *StreamTdfNotesResponse) error { + return x.ServerStream.SendMsg(m) +} + +// TdfNoteService_ServiceDesc is the grpc.ServiceDesc for TdfNoteService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var TdfNoteService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "tdf_notes.v1.TdfNoteService", + HandlerType: (*TdfNoteServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateTdfNote", + Handler: _TdfNoteService_CreateTdfNote_Handler, + }, + { + MethodName: "GetTdfNote", + Handler: _TdfNoteService_GetTdfNote_Handler, + }, + { + MethodName: "QueryTdfNotes", + Handler: _TdfNoteService_QueryTdfNotes_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "StreamTdfNotes", + Handler: _TdfNoteService_StreamTdfNotes_Handler, + ServerStreams: true, + }, + }, + Metadata: "tdf_note/v1/tdf_note.proto", +} diff --git a/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go new file mode 100644 index 0000000..b154b89 --- /dev/null +++ b/common-operating-picture/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go @@ -0,0 +1,206 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: tdf_note/v1/tdf_note.proto + +package tdf_notev1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + v1 "github.com/virtru-corp/dsp-cop/api/proto/github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1" + + connect "connectrpc.com/connect" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // TdfNoteServiceName is the fully-qualified name of the TdfNoteService service. + TdfNoteServiceName = "tdf_notes.v1.TdfNoteService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // TdfNoteServiceCreateTdfNoteProcedure is the fully-qualified name of the TdfNoteService's + // CreateTdfNote RPC. + TdfNoteServiceCreateTdfNoteProcedure = "/tdf_notes.v1.TdfNoteService/CreateTdfNote" + // TdfNoteServiceGetTdfNoteProcedure is the fully-qualified name of the TdfNoteService's GetTdfNote + // RPC. + TdfNoteServiceGetTdfNoteProcedure = "/tdf_notes.v1.TdfNoteService/GetTdfNote" + // TdfNoteServiceQueryTdfNotesProcedure is the fully-qualified name of the TdfNoteService's + // QueryTdfNotes RPC. + TdfNoteServiceQueryTdfNotesProcedure = "/tdf_notes.v1.TdfNoteService/QueryTdfNotes" + // TdfNoteServiceStreamTdfNotesProcedure is the fully-qualified name of the TdfNoteService's + // StreamTdfNotes RPC. + TdfNoteServiceStreamTdfNotesProcedure = "/tdf_notes.v1.TdfNoteService/StreamTdfNotes" +) + +// TdfNoteServiceClient is a client for the tdf_notes.v1.TdfNoteService service. +type TdfNoteServiceClient interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest]) (*connect.ServerStreamForClient[v1.StreamTdfNotesResponse], error) +} + +// NewTdfNoteServiceClient constructs a client for the tdf_notes.v1.TdfNoteService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewTdfNoteServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) TdfNoteServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + tdfNoteServiceMethods := v1.File_tdf_note_v1_tdf_note_proto.Services().ByName("TdfNoteService").Methods() + return &tdfNoteServiceClient{ + createTdfNote: connect.NewClient[v1.CreateTdfNoteRequest, v1.CreateTdfNoteResponse]( + httpClient, + baseURL+TdfNoteServiceCreateTdfNoteProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("CreateTdfNote")), + connect.WithClientOptions(opts...), + ), + getTdfNote: connect.NewClient[v1.GetTdfNoteRequest, v1.GetTdfNoteResponse]( + httpClient, + baseURL+TdfNoteServiceGetTdfNoteProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("GetTdfNote")), + connect.WithClientOptions(opts...), + ), + queryTdfNotes: connect.NewClient[v1.QueryTdfNotesRequest, v1.QueryTdfNotesResponse]( + httpClient, + baseURL+TdfNoteServiceQueryTdfNotesProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("QueryTdfNotes")), + connect.WithClientOptions(opts...), + ), + streamTdfNotes: connect.NewClient[v1.StreamTdfNotesRequest, v1.StreamTdfNotesResponse]( + httpClient, + baseURL+TdfNoteServiceStreamTdfNotesProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("StreamTdfNotes")), + connect.WithClientOptions(opts...), + ), + } +} + +// tdfNoteServiceClient implements TdfNoteServiceClient. +type tdfNoteServiceClient struct { + createTdfNote *connect.Client[v1.CreateTdfNoteRequest, v1.CreateTdfNoteResponse] + getTdfNote *connect.Client[v1.GetTdfNoteRequest, v1.GetTdfNoteResponse] + queryTdfNotes *connect.Client[v1.QueryTdfNotesRequest, v1.QueryTdfNotesResponse] + streamTdfNotes *connect.Client[v1.StreamTdfNotesRequest, v1.StreamTdfNotesResponse] +} + +// CreateTdfNote calls tdf_notes.v1.TdfNoteService.CreateTdfNote. +func (c *tdfNoteServiceClient) CreateTdfNote(ctx context.Context, req *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) { + return c.createTdfNote.CallUnary(ctx, req) +} + +// GetTdfNote calls tdf_notes.v1.TdfNoteService.GetTdfNote. +func (c *tdfNoteServiceClient) GetTdfNote(ctx context.Context, req *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) { + return c.getTdfNote.CallUnary(ctx, req) +} + +// QueryTdfNotes calls tdf_notes.v1.TdfNoteService.QueryTdfNotes. +func (c *tdfNoteServiceClient) QueryTdfNotes(ctx context.Context, req *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) { + return c.queryTdfNotes.CallUnary(ctx, req) +} + +// StreamTdfNotes calls tdf_notes.v1.TdfNoteService.StreamTdfNotes. +func (c *tdfNoteServiceClient) StreamTdfNotes(ctx context.Context, req *connect.Request[v1.StreamTdfNotesRequest]) (*connect.ServerStreamForClient[v1.StreamTdfNotesResponse], error) { + return c.streamTdfNotes.CallServerStream(ctx, req) +} + +// TdfNoteServiceHandler is an implementation of the tdf_notes.v1.TdfNoteService service. +type TdfNoteServiceHandler interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest], *connect.ServerStream[v1.StreamTdfNotesResponse]) error +} + +// NewTdfNoteServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewTdfNoteServiceHandler(svc TdfNoteServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + tdfNoteServiceMethods := v1.File_tdf_note_v1_tdf_note_proto.Services().ByName("TdfNoteService").Methods() + tdfNoteServiceCreateTdfNoteHandler := connect.NewUnaryHandler( + TdfNoteServiceCreateTdfNoteProcedure, + svc.CreateTdfNote, + connect.WithSchema(tdfNoteServiceMethods.ByName("CreateTdfNote")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceGetTdfNoteHandler := connect.NewUnaryHandler( + TdfNoteServiceGetTdfNoteProcedure, + svc.GetTdfNote, + connect.WithSchema(tdfNoteServiceMethods.ByName("GetTdfNote")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceQueryTdfNotesHandler := connect.NewUnaryHandler( + TdfNoteServiceQueryTdfNotesProcedure, + svc.QueryTdfNotes, + connect.WithSchema(tdfNoteServiceMethods.ByName("QueryTdfNotes")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceStreamTdfNotesHandler := connect.NewServerStreamHandler( + TdfNoteServiceStreamTdfNotesProcedure, + svc.StreamTdfNotes, + connect.WithSchema(tdfNoteServiceMethods.ByName("StreamTdfNotes")), + connect.WithHandlerOptions(opts...), + ) + return "/tdf_notes.v1.TdfNoteService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case TdfNoteServiceCreateTdfNoteProcedure: + tdfNoteServiceCreateTdfNoteHandler.ServeHTTP(w, r) + case TdfNoteServiceGetTdfNoteProcedure: + tdfNoteServiceGetTdfNoteHandler.ServeHTTP(w, r) + case TdfNoteServiceQueryTdfNotesProcedure: + tdfNoteServiceQueryTdfNotesHandler.ServeHTTP(w, r) + case TdfNoteServiceStreamTdfNotesProcedure: + tdfNoteServiceStreamTdfNotesHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedTdfNoteServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedTdfNoteServiceHandler struct{} + +func (UnimplementedTdfNoteServiceHandler) CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.CreateTdfNote is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.GetTdfNote is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.QueryTdfNotes is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest], *connect.ServerStream[v1.StreamTdfNotesResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.StreamTdfNotes is not implemented")) +} diff --git a/common-operating-picture/api/proto/tdf_note/v1/tdf_note.pb.go b/common-operating-picture/api/proto/tdf_note/v1/tdf_note.pb.go new file mode 100644 index 0000000..9d0d3ae --- /dev/null +++ b/common-operating-picture/api/proto/tdf_note/v1/tdf_note.pb.go @@ -0,0 +1,969 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v3.21.12 +// source: tdf_note/v1/tdf_note.proto + +package tdf_notev1 + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The StreamEventType enum is reused from the previous schema +type StreamEventType int32 + +const ( + StreamEventType_STREAM_EVENT_TYPE_UNSPECIFIED StreamEventType = 0 + // system events + StreamEventType_STREAM_EVENT_TYPE_STARTUP StreamEventType = 1 + StreamEventType_STREAM_EVENT_TYPE_SHUTDOWN StreamEventType = 2 + StreamEventType_STREAM_EVENT_TYPE_RESTART StreamEventType = 3 + StreamEventType_STREAM_EVENT_TYPE_MAINTENANCE StreamEventType = 4 + // data events + StreamEventType_STREAM_EVENT_TYPE_CONNECTED StreamEventType = 5 + StreamEventType_STREAM_EVENT_TYPE_HEARTBEAT StreamEventType = 6 + // generic events + StreamEventType_STREAM_EVENT_TYPE_GENERIC_ERROR StreamEventType = 10 + StreamEventType_STREAM_EVENT_TYPE_SERVER_ERROR StreamEventType = 11 + StreamEventType_STREAM_EVENT_TYPE_DATA_ERROR StreamEventType = 12 + // tdf_notes stream events + StreamEventType_STREAM_EVENT_TYPE_TDF_NOTES_NEW StreamEventType = 20 +) + +// Enum value maps for StreamEventType. +var ( + StreamEventType_name = map[int32]string{ + 0: "STREAM_EVENT_TYPE_UNSPECIFIED", + 1: "STREAM_EVENT_TYPE_STARTUP", + 2: "STREAM_EVENT_TYPE_SHUTDOWN", + 3: "STREAM_EVENT_TYPE_RESTART", + 4: "STREAM_EVENT_TYPE_MAINTENANCE", + 5: "STREAM_EVENT_TYPE_CONNECTED", + 6: "STREAM_EVENT_TYPE_HEARTBEAT", + 10: "STREAM_EVENT_TYPE_GENERIC_ERROR", + 11: "STREAM_EVENT_TYPE_SERVER_ERROR", + 12: "STREAM_EVENT_TYPE_DATA_ERROR", + 20: "STREAM_EVENT_TYPE_TDF_NOTES_NEW", + } + StreamEventType_value = map[string]int32{ + "STREAM_EVENT_TYPE_UNSPECIFIED": 0, + "STREAM_EVENT_TYPE_STARTUP": 1, + "STREAM_EVENT_TYPE_SHUTDOWN": 2, + "STREAM_EVENT_TYPE_RESTART": 3, + "STREAM_EVENT_TYPE_MAINTENANCE": 4, + "STREAM_EVENT_TYPE_CONNECTED": 5, + "STREAM_EVENT_TYPE_HEARTBEAT": 6, + "STREAM_EVENT_TYPE_GENERIC_ERROR": 10, + "STREAM_EVENT_TYPE_SERVER_ERROR": 11, + "STREAM_EVENT_TYPE_DATA_ERROR": 12, + "STREAM_EVENT_TYPE_TDF_NOTES_NEW": 20, + } +) + +func (x StreamEventType) Enum() *StreamEventType { + p := new(StreamEventType) + *p = x + return p +} + +func (x StreamEventType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StreamEventType) Descriptor() protoreflect.EnumDescriptor { + return file_tdf_note_v1_tdf_note_proto_enumTypes[0].Descriptor() +} + +func (StreamEventType) Type() protoreflect.EnumType { + return &file_tdf_note_v1_tdf_note_proto_enumTypes[0] +} + +func (x StreamEventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StreamEventType.Descriptor instead. +func (StreamEventType) EnumDescriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{0} +} + +// Represents a note associated with a TDF object +type TdfNote struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the note + Ts *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=ts,proto3" json:"ts,omitempty"` // Timestamp of the note creation + ParentId string `protobuf:"bytes,3,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` // Plaintext JSON search index for searching notes + TdfBlob []byte `protobuf:"bytes,5,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // Binary TDF data for the note + TdfUri string `protobuf:"bytes,6,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` // URI pointing to the note data + XCreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=_created_at,json=CreatedAt,proto3" json:"_created_at,omitempty"` // Timestamp of when the note was created + XCreatedBy string `protobuf:"bytes,8,opt,name=_created_by,json=CreatedBy,proto3" json:"_created_by,omitempty"` // Who created the note +} + +func (x *TdfNote) Reset() { + *x = TdfNote{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TdfNote) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TdfNote) ProtoMessage() {} + +func (x *TdfNote) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TdfNote.ProtoReflect.Descriptor instead. +func (*TdfNote) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{0} +} + +func (x *TdfNote) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TdfNote) GetTs() *timestamppb.Timestamp { + if x != nil { + return x.Ts + } + return nil +} + +func (x *TdfNote) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *TdfNote) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *TdfNote) GetTdfBlob() []byte { + if x != nil { + return x.TdfBlob + } + return nil +} + +func (x *TdfNote) GetTdfUri() string { + if x != nil { + return x.TdfUri + } + return "" +} + +func (x *TdfNote) GetXCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.XCreatedAt + } + return nil +} + +func (x *TdfNote) GetXCreatedBy() string { + if x != nil { + return x.XCreatedBy + } + return "" +} + +// Request message for creating a new note +type CreateTdfNoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentId string `protobuf:"bytes,1,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + Search string `protobuf:"bytes,2,opt,name=search,proto3" json:"search,omitempty"` // Plaintext JSON search index for searching notes + TdfBlob []byte `protobuf:"bytes,3,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // Binary TDF data for the note + TdfUri string `protobuf:"bytes,4,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` // URI pointing to the note data + Ts *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=ts,proto3" json:"ts,omitempty"` // Timestamp of the note +} + +func (x *CreateTdfNoteRequest) Reset() { + *x = CreateTdfNoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTdfNoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTdfNoteRequest) ProtoMessage() {} + +func (x *CreateTdfNoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTdfNoteRequest.ProtoReflect.Descriptor instead. +func (*CreateTdfNoteRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateTdfNoteRequest) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *CreateTdfNoteRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *CreateTdfNoteRequest) GetTdfBlob() []byte { + if x != nil { + return x.TdfBlob + } + return nil +} + +func (x *CreateTdfNoteRequest) GetTdfUri() string { + if x != nil { + return x.TdfUri + } + return "" +} + +func (x *CreateTdfNoteRequest) GetTs() *timestamppb.Timestamp { + if x != nil { + return x.Ts + } + return nil +} + +// Response message for creating a new note +type CreateTdfNoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier of the newly created note +} + +func (x *CreateTdfNoteResponse) Reset() { + *x = CreateTdfNoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTdfNoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTdfNoteResponse) ProtoMessage() {} + +func (x *CreateTdfNoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateTdfNoteResponse.ProtoReflect.Descriptor instead. +func (*CreateTdfNoteResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateTdfNoteResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// Request message to retrieve a note by ID +type GetTdfNoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The ID of the note to retrieve +} + +func (x *GetTdfNoteRequest) Reset() { + *x = GetTdfNoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTdfNoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTdfNoteRequest) ProtoMessage() {} + +func (x *GetTdfNoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTdfNoteRequest.ProtoReflect.Descriptor instead. +func (*GetTdfNoteRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{3} +} + +func (x *GetTdfNoteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// Response message for retrieving a note by ID +type GetTdfNoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TdfNote *TdfNote `protobuf:"bytes,1,opt,name=tdf_note,json=tdfNote,proto3" json:"tdf_note,omitempty"` // The note object +} + +func (x *GetTdfNoteResponse) Reset() { + *x = GetTdfNoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTdfNoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTdfNoteResponse) ProtoMessage() {} + +func (x *GetTdfNoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTdfNoteResponse.ProtoReflect.Descriptor instead. +func (*GetTdfNoteResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{4} +} + +func (x *GetTdfNoteResponse) GetTdfNote() *TdfNote { + if x != nil { + return x.TdfNote + } + return nil +} + +// Request message for querying notes associated with a TDF object +type QueryTdfNotesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentId string `protobuf:"bytes,1,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` // Parent TDF object ID (foreign key to tdf_objects) + StartTs *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` // Start timestamp for querying notes + EndTs *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_ts,json=endTs,proto3" json:"end_ts,omitempty"` // End timestamp for querying notes + Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` // Search query for filtering notes +} + +func (x *QueryTdfNotesRequest) Reset() { + *x = QueryTdfNotesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryTdfNotesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryTdfNotesRequest) ProtoMessage() {} + +func (x *QueryTdfNotesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryTdfNotesRequest.ProtoReflect.Descriptor instead. +func (*QueryTdfNotesRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{5} +} + +func (x *QueryTdfNotesRequest) GetParentId() string { + if x != nil { + return x.ParentId + } + return "" +} + +func (x *QueryTdfNotesRequest) GetStartTs() *timestamppb.Timestamp { + if x != nil { + return x.StartTs + } + return nil +} + +func (x *QueryTdfNotesRequest) GetEndTs() *timestamppb.Timestamp { + if x != nil { + return x.EndTs + } + return nil +} + +func (x *QueryTdfNotesRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +// Response message for querying notes associated with a TDF object +type QueryTdfNotesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TdfNotes []*TdfNote `protobuf:"bytes,1,rep,name=tdf_notes,json=tdfNotes,proto3" json:"tdf_notes,omitempty"` // List of notes associated with the parent TDF object +} + +func (x *QueryTdfNotesResponse) Reset() { + *x = QueryTdfNotesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryTdfNotesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryTdfNotesResponse) ProtoMessage() {} + +func (x *QueryTdfNotesResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryTdfNotesResponse.ProtoReflect.Descriptor instead. +func (*QueryTdfNotesResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryTdfNotesResponse) GetTdfNotes() []*TdfNote { + if x != nil { + return x.TdfNotes + } + return nil +} + +type StreamTdfNotesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StreamTdfNotesRequest) Reset() { + *x = StreamTdfNotesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamTdfNotesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamTdfNotesRequest) ProtoMessage() {} + +func (x *StreamTdfNotesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamTdfNotesRequest.ProtoReflect.Descriptor instead. +func (*StreamTdfNotesRequest) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{7} +} + +// Stream response for streaming note events (similar to streaming TDF objects) +type StreamTdfNotesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventType StreamEventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=tdf_notes.v1.StreamEventType" json:"event_type,omitempty"` // Type of stream event (e.g., new note) + EventDetail string `protobuf:"bytes,2,opt,name=event_detail,json=eventDetail,proto3" json:"event_detail,omitempty"` // Details about the event + TdfNotes []*TdfNote `protobuf:"bytes,6,rep,name=tdf_notes,json=tdfNotes,proto3" json:"tdf_notes,omitempty"` // List of notes being streamed +} + +func (x *StreamTdfNotesResponse) Reset() { + *x = StreamTdfNotesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamTdfNotesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamTdfNotesResponse) ProtoMessage() {} + +func (x *StreamTdfNotesResponse) ProtoReflect() protoreflect.Message { + mi := &file_tdf_note_v1_tdf_note_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamTdfNotesResponse.ProtoReflect.Descriptor instead. +func (*StreamTdfNotesResponse) Descriptor() ([]byte, []int) { + return file_tdf_note_v1_tdf_note_proto_rawDescGZIP(), []int{8} +} + +func (x *StreamTdfNotesResponse) GetEventType() StreamEventType { + if x != nil { + return x.EventType + } + return StreamEventType_STREAM_EVENT_TYPE_UNSPECIFIED +} + +func (x *StreamTdfNotesResponse) GetEventDetail() string { + if x != nil { + return x.EventDetail + } + return "" +} + +func (x *StreamTdfNotesResponse) GetTdfNotes() []*TdfNote { + if x != nil { + return x.TdfNotes + } + return nil +} + +var File_tdf_note_v1_tdf_note_proto protoreflect.FileDescriptor + +var file_tdf_note_v1_tdf_note_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8a, 0x02, 0x0a, 0x07, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x02, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, + 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, + 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x3a, 0x0a, 0x0b, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, 0x62, 0x6c, + 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, + 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x74, 0x64, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x07, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x22, 0xb5, 0x01, 0x0a, + 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x65, 0x6e, 0x64, 0x54, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x22, 0x4b, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, + 0x09, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x08, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, + 0x73, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xbf, 0x01, 0x0a, 0x16, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x32, 0x0a, 0x09, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, + 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, + 0x52, 0x08, 0x74, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, + 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x2a, 0x87, 0x03, 0x0a, + 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, + 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e, + 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, + 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, + 0x43, 0x45, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, + 0x42, 0x45, 0x41, 0x54, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, + 0x52, 0x49, 0x43, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x22, 0x0a, 0x1e, 0x53, + 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0b, 0x12, + 0x20, 0x0a, 0x1c, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x44, 0x46, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x53, + 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x14, 0x32, 0xf4, 0x02, 0x0a, 0x0e, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x74, 0x64, 0x66, + 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, + 0x65, 0x12, 0x1f, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, + 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, + 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, + 0x12, 0x23, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x41, 0x5a, + 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x69, 0x72, 0x74, + 0x72, 0x75, 0x2d, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x64, 0x73, 0x70, 0x2d, 0x63, 0x6f, 0x70, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, + 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x74, 0x64, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_tdf_note_v1_tdf_note_proto_rawDescOnce sync.Once + file_tdf_note_v1_tdf_note_proto_rawDescData = file_tdf_note_v1_tdf_note_proto_rawDesc +) + +func file_tdf_note_v1_tdf_note_proto_rawDescGZIP() []byte { + file_tdf_note_v1_tdf_note_proto_rawDescOnce.Do(func() { + file_tdf_note_v1_tdf_note_proto_rawDescData = protoimpl.X.CompressGZIP(file_tdf_note_v1_tdf_note_proto_rawDescData) + }) + return file_tdf_note_v1_tdf_note_proto_rawDescData +} + +var file_tdf_note_v1_tdf_note_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tdf_note_v1_tdf_note_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_tdf_note_v1_tdf_note_proto_goTypes = []interface{}{ + (StreamEventType)(0), // 0: tdf_notes.v1.StreamEventType + (*TdfNote)(nil), // 1: tdf_notes.v1.TdfNote + (*CreateTdfNoteRequest)(nil), // 2: tdf_notes.v1.CreateTdfNoteRequest + (*CreateTdfNoteResponse)(nil), // 3: tdf_notes.v1.CreateTdfNoteResponse + (*GetTdfNoteRequest)(nil), // 4: tdf_notes.v1.GetTdfNoteRequest + (*GetTdfNoteResponse)(nil), // 5: tdf_notes.v1.GetTdfNoteResponse + (*QueryTdfNotesRequest)(nil), // 6: tdf_notes.v1.QueryTdfNotesRequest + (*QueryTdfNotesResponse)(nil), // 7: tdf_notes.v1.QueryTdfNotesResponse + (*StreamTdfNotesRequest)(nil), // 8: tdf_notes.v1.StreamTdfNotesRequest + (*StreamTdfNotesResponse)(nil), // 9: tdf_notes.v1.StreamTdfNotesResponse + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp +} +var file_tdf_note_v1_tdf_note_proto_depIdxs = []int32{ + 10, // 0: tdf_notes.v1.TdfNote.ts:type_name -> google.protobuf.Timestamp + 10, // 1: tdf_notes.v1.TdfNote._created_at:type_name -> google.protobuf.Timestamp + 10, // 2: tdf_notes.v1.CreateTdfNoteRequest.ts:type_name -> google.protobuf.Timestamp + 1, // 3: tdf_notes.v1.GetTdfNoteResponse.tdf_note:type_name -> tdf_notes.v1.TdfNote + 10, // 4: tdf_notes.v1.QueryTdfNotesRequest.start_ts:type_name -> google.protobuf.Timestamp + 10, // 5: tdf_notes.v1.QueryTdfNotesRequest.end_ts:type_name -> google.protobuf.Timestamp + 1, // 6: tdf_notes.v1.QueryTdfNotesResponse.tdf_notes:type_name -> tdf_notes.v1.TdfNote + 0, // 7: tdf_notes.v1.StreamTdfNotesResponse.event_type:type_name -> tdf_notes.v1.StreamEventType + 1, // 8: tdf_notes.v1.StreamTdfNotesResponse.tdf_notes:type_name -> tdf_notes.v1.TdfNote + 2, // 9: tdf_notes.v1.TdfNoteService.CreateTdfNote:input_type -> tdf_notes.v1.CreateTdfNoteRequest + 4, // 10: tdf_notes.v1.TdfNoteService.GetTdfNote:input_type -> tdf_notes.v1.GetTdfNoteRequest + 6, // 11: tdf_notes.v1.TdfNoteService.QueryTdfNotes:input_type -> tdf_notes.v1.QueryTdfNotesRequest + 8, // 12: tdf_notes.v1.TdfNoteService.StreamTdfNotes:input_type -> tdf_notes.v1.StreamTdfNotesRequest + 3, // 13: tdf_notes.v1.TdfNoteService.CreateTdfNote:output_type -> tdf_notes.v1.CreateTdfNoteResponse + 5, // 14: tdf_notes.v1.TdfNoteService.GetTdfNote:output_type -> tdf_notes.v1.GetTdfNoteResponse + 7, // 15: tdf_notes.v1.TdfNoteService.QueryTdfNotes:output_type -> tdf_notes.v1.QueryTdfNotesResponse + 9, // 16: tdf_notes.v1.TdfNoteService.StreamTdfNotes:output_type -> tdf_notes.v1.StreamTdfNotesResponse + 13, // [13:17] is the sub-list for method output_type + 9, // [9:13] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_tdf_note_v1_tdf_note_proto_init() } +func file_tdf_note_v1_tdf_note_proto_init() { + if File_tdf_note_v1_tdf_note_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_tdf_note_v1_tdf_note_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TdfNote); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateTdfNoteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateTdfNoteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTdfNoteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTdfNoteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryTdfNotesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryTdfNotesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamTdfNotesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tdf_note_v1_tdf_note_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamTdfNotesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_tdf_note_v1_tdf_note_proto_rawDesc, + NumEnums: 1, + NumMessages: 9, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_tdf_note_v1_tdf_note_proto_goTypes, + DependencyIndexes: file_tdf_note_v1_tdf_note_proto_depIdxs, + EnumInfos: file_tdf_note_v1_tdf_note_proto_enumTypes, + MessageInfos: file_tdf_note_v1_tdf_note_proto_msgTypes, + }.Build() + File_tdf_note_v1_tdf_note_proto = out.File + file_tdf_note_v1_tdf_note_proto_rawDesc = nil + file_tdf_note_v1_tdf_note_proto_goTypes = nil + file_tdf_note_v1_tdf_note_proto_depIdxs = nil +} diff --git a/common-operating-picture/api/proto/tdf_note/v1/tdf_note_grpc.pb.go b/common-operating-picture/api/proto/tdf_note/v1/tdf_note_grpc.pb.go new file mode 100644 index 0000000..098e4e7 --- /dev/null +++ b/common-operating-picture/api/proto/tdf_note/v1/tdf_note_grpc.pb.go @@ -0,0 +1,257 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.21.12 +// source: tdf_note/v1/tdf_note.proto + +package tdf_notev1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + TdfNoteService_CreateTdfNote_FullMethodName = "/tdf_notes.v1.TdfNoteService/CreateTdfNote" + TdfNoteService_GetTdfNote_FullMethodName = "/tdf_notes.v1.TdfNoteService/GetTdfNote" + TdfNoteService_QueryTdfNotes_FullMethodName = "/tdf_notes.v1.TdfNoteService/QueryTdfNotes" + TdfNoteService_StreamTdfNotes_FullMethodName = "/tdf_notes.v1.TdfNoteService/StreamTdfNotes" +) + +// TdfNoteServiceClient is the client API for TdfNoteService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type TdfNoteServiceClient interface { + // RPC for creating a new TDF note + CreateTdfNote(ctx context.Context, in *CreateTdfNoteRequest, opts ...grpc.CallOption) (*CreateTdfNoteResponse, error) + // RPC for retrieving a TDF note by ID + GetTdfNote(ctx context.Context, in *GetTdfNoteRequest, opts ...grpc.CallOption) (*GetTdfNoteResponse, error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(ctx context.Context, in *QueryTdfNotesRequest, opts ...grpc.CallOption) (*QueryTdfNotesResponse, error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(ctx context.Context, in *StreamTdfNotesRequest, opts ...grpc.CallOption) (TdfNoteService_StreamTdfNotesClient, error) +} + +type tdfNoteServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewTdfNoteServiceClient(cc grpc.ClientConnInterface) TdfNoteServiceClient { + return &tdfNoteServiceClient{cc} +} + +func (c *tdfNoteServiceClient) CreateTdfNote(ctx context.Context, in *CreateTdfNoteRequest, opts ...grpc.CallOption) (*CreateTdfNoteResponse, error) { + out := new(CreateTdfNoteResponse) + err := c.cc.Invoke(ctx, TdfNoteService_CreateTdfNote_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) GetTdfNote(ctx context.Context, in *GetTdfNoteRequest, opts ...grpc.CallOption) (*GetTdfNoteResponse, error) { + out := new(GetTdfNoteResponse) + err := c.cc.Invoke(ctx, TdfNoteService_GetTdfNote_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) QueryTdfNotes(ctx context.Context, in *QueryTdfNotesRequest, opts ...grpc.CallOption) (*QueryTdfNotesResponse, error) { + out := new(QueryTdfNotesResponse) + err := c.cc.Invoke(ctx, TdfNoteService_QueryTdfNotes_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tdfNoteServiceClient) StreamTdfNotes(ctx context.Context, in *StreamTdfNotesRequest, opts ...grpc.CallOption) (TdfNoteService_StreamTdfNotesClient, error) { + stream, err := c.cc.NewStream(ctx, &TdfNoteService_ServiceDesc.Streams[0], TdfNoteService_StreamTdfNotes_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &tdfNoteServiceStreamTdfNotesClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type TdfNoteService_StreamTdfNotesClient interface { + Recv() (*StreamTdfNotesResponse, error) + grpc.ClientStream +} + +type tdfNoteServiceStreamTdfNotesClient struct { + grpc.ClientStream +} + +func (x *tdfNoteServiceStreamTdfNotesClient) Recv() (*StreamTdfNotesResponse, error) { + m := new(StreamTdfNotesResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// TdfNoteServiceServer is the server API for TdfNoteService service. +// All implementations must embed UnimplementedTdfNoteServiceServer +// for forward compatibility +type TdfNoteServiceServer interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *CreateTdfNoteRequest) (*CreateTdfNoteResponse, error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *GetTdfNoteRequest) (*GetTdfNoteResponse, error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *QueryTdfNotesRequest) (*QueryTdfNotesResponse, error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(*StreamTdfNotesRequest, TdfNoteService_StreamTdfNotesServer) error + mustEmbedUnimplementedTdfNoteServiceServer() +} + +// UnimplementedTdfNoteServiceServer must be embedded to have forward compatible implementations. +type UnimplementedTdfNoteServiceServer struct { +} + +func (UnimplementedTdfNoteServiceServer) CreateTdfNote(context.Context, *CreateTdfNoteRequest) (*CreateTdfNoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateTdfNote not implemented") +} +func (UnimplementedTdfNoteServiceServer) GetTdfNote(context.Context, *GetTdfNoteRequest) (*GetTdfNoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTdfNote not implemented") +} +func (UnimplementedTdfNoteServiceServer) QueryTdfNotes(context.Context, *QueryTdfNotesRequest) (*QueryTdfNotesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryTdfNotes not implemented") +} +func (UnimplementedTdfNoteServiceServer) StreamTdfNotes(*StreamTdfNotesRequest, TdfNoteService_StreamTdfNotesServer) error { + return status.Errorf(codes.Unimplemented, "method StreamTdfNotes not implemented") +} +func (UnimplementedTdfNoteServiceServer) mustEmbedUnimplementedTdfNoteServiceServer() {} + +// UnsafeTdfNoteServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to TdfNoteServiceServer will +// result in compilation errors. +type UnsafeTdfNoteServiceServer interface { + mustEmbedUnimplementedTdfNoteServiceServer() +} + +func RegisterTdfNoteServiceServer(s grpc.ServiceRegistrar, srv TdfNoteServiceServer) { + s.RegisterService(&TdfNoteService_ServiceDesc, srv) +} + +func _TdfNoteService_CreateTdfNote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateTdfNoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).CreateTdfNote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_CreateTdfNote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).CreateTdfNote(ctx, req.(*CreateTdfNoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_GetTdfNote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTdfNoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).GetTdfNote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_GetTdfNote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).GetTdfNote(ctx, req.(*GetTdfNoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_QueryTdfNotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTdfNotesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TdfNoteServiceServer).QueryTdfNotes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TdfNoteService_QueryTdfNotes_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TdfNoteServiceServer).QueryTdfNotes(ctx, req.(*QueryTdfNotesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TdfNoteService_StreamTdfNotes_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StreamTdfNotesRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TdfNoteServiceServer).StreamTdfNotes(m, &tdfNoteServiceStreamTdfNotesServer{stream}) +} + +type TdfNoteService_StreamTdfNotesServer interface { + Send(*StreamTdfNotesResponse) error + grpc.ServerStream +} + +type tdfNoteServiceStreamTdfNotesServer struct { + grpc.ServerStream +} + +func (x *tdfNoteServiceStreamTdfNotesServer) Send(m *StreamTdfNotesResponse) error { + return x.ServerStream.SendMsg(m) +} + +// TdfNoteService_ServiceDesc is the grpc.ServiceDesc for TdfNoteService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var TdfNoteService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "tdf_notes.v1.TdfNoteService", + HandlerType: (*TdfNoteServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateTdfNote", + Handler: _TdfNoteService_CreateTdfNote_Handler, + }, + { + MethodName: "GetTdfNote", + Handler: _TdfNoteService_GetTdfNote_Handler, + }, + { + MethodName: "QueryTdfNotes", + Handler: _TdfNoteService_QueryTdfNotes_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "StreamTdfNotes", + Handler: _TdfNoteService_StreamTdfNotes_Handler, + ServerStreams: true, + }, + }, + Metadata: "tdf_note/v1/tdf_note.proto", +} diff --git a/common-operating-picture/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go b/common-operating-picture/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go new file mode 100644 index 0000000..17308ab --- /dev/null +++ b/common-operating-picture/api/proto/tdf_note/v1/tdf_notev1connect/tdf_note.connect.go @@ -0,0 +1,206 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: tdf_note/v1/tdf_note.proto + +package tdf_notev1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + v1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1" + + connect "connectrpc.com/connect" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // TdfNoteServiceName is the fully-qualified name of the TdfNoteService service. + TdfNoteServiceName = "tdf_notes.v1.TdfNoteService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // TdfNoteServiceCreateTdfNoteProcedure is the fully-qualified name of the TdfNoteService's + // CreateTdfNote RPC. + TdfNoteServiceCreateTdfNoteProcedure = "/tdf_notes.v1.TdfNoteService/CreateTdfNote" + // TdfNoteServiceGetTdfNoteProcedure is the fully-qualified name of the TdfNoteService's GetTdfNote + // RPC. + TdfNoteServiceGetTdfNoteProcedure = "/tdf_notes.v1.TdfNoteService/GetTdfNote" + // TdfNoteServiceQueryTdfNotesProcedure is the fully-qualified name of the TdfNoteService's + // QueryTdfNotes RPC. + TdfNoteServiceQueryTdfNotesProcedure = "/tdf_notes.v1.TdfNoteService/QueryTdfNotes" + // TdfNoteServiceStreamTdfNotesProcedure is the fully-qualified name of the TdfNoteService's + // StreamTdfNotes RPC. + TdfNoteServiceStreamTdfNotesProcedure = "/tdf_notes.v1.TdfNoteService/StreamTdfNotes" +) + +// TdfNoteServiceClient is a client for the tdf_notes.v1.TdfNoteService service. +type TdfNoteServiceClient interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest]) (*connect.ServerStreamForClient[v1.StreamTdfNotesResponse], error) +} + +// NewTdfNoteServiceClient constructs a client for the tdf_notes.v1.TdfNoteService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewTdfNoteServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) TdfNoteServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + tdfNoteServiceMethods := v1.File_tdf_note_v1_tdf_note_proto.Services().ByName("TdfNoteService").Methods() + return &tdfNoteServiceClient{ + createTdfNote: connect.NewClient[v1.CreateTdfNoteRequest, v1.CreateTdfNoteResponse]( + httpClient, + baseURL+TdfNoteServiceCreateTdfNoteProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("CreateTdfNote")), + connect.WithClientOptions(opts...), + ), + getTdfNote: connect.NewClient[v1.GetTdfNoteRequest, v1.GetTdfNoteResponse]( + httpClient, + baseURL+TdfNoteServiceGetTdfNoteProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("GetTdfNote")), + connect.WithClientOptions(opts...), + ), + queryTdfNotes: connect.NewClient[v1.QueryTdfNotesRequest, v1.QueryTdfNotesResponse]( + httpClient, + baseURL+TdfNoteServiceQueryTdfNotesProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("QueryTdfNotes")), + connect.WithClientOptions(opts...), + ), + streamTdfNotes: connect.NewClient[v1.StreamTdfNotesRequest, v1.StreamTdfNotesResponse]( + httpClient, + baseURL+TdfNoteServiceStreamTdfNotesProcedure, + connect.WithSchema(tdfNoteServiceMethods.ByName("StreamTdfNotes")), + connect.WithClientOptions(opts...), + ), + } +} + +// tdfNoteServiceClient implements TdfNoteServiceClient. +type tdfNoteServiceClient struct { + createTdfNote *connect.Client[v1.CreateTdfNoteRequest, v1.CreateTdfNoteResponse] + getTdfNote *connect.Client[v1.GetTdfNoteRequest, v1.GetTdfNoteResponse] + queryTdfNotes *connect.Client[v1.QueryTdfNotesRequest, v1.QueryTdfNotesResponse] + streamTdfNotes *connect.Client[v1.StreamTdfNotesRequest, v1.StreamTdfNotesResponse] +} + +// CreateTdfNote calls tdf_notes.v1.TdfNoteService.CreateTdfNote. +func (c *tdfNoteServiceClient) CreateTdfNote(ctx context.Context, req *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) { + return c.createTdfNote.CallUnary(ctx, req) +} + +// GetTdfNote calls tdf_notes.v1.TdfNoteService.GetTdfNote. +func (c *tdfNoteServiceClient) GetTdfNote(ctx context.Context, req *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) { + return c.getTdfNote.CallUnary(ctx, req) +} + +// QueryTdfNotes calls tdf_notes.v1.TdfNoteService.QueryTdfNotes. +func (c *tdfNoteServiceClient) QueryTdfNotes(ctx context.Context, req *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) { + return c.queryTdfNotes.CallUnary(ctx, req) +} + +// StreamTdfNotes calls tdf_notes.v1.TdfNoteService.StreamTdfNotes. +func (c *tdfNoteServiceClient) StreamTdfNotes(ctx context.Context, req *connect.Request[v1.StreamTdfNotesRequest]) (*connect.ServerStreamForClient[v1.StreamTdfNotesResponse], error) { + return c.streamTdfNotes.CallServerStream(ctx, req) +} + +// TdfNoteServiceHandler is an implementation of the tdf_notes.v1.TdfNoteService service. +type TdfNoteServiceHandler interface { + // RPC for creating a new TDF note + CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) + // RPC for retrieving a TDF note by ID + GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) + // RPC for querying notes associated with a TDF object + QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) + // RPC for streaming TDF notes (e.g., for real-time updates) + StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest], *connect.ServerStream[v1.StreamTdfNotesResponse]) error +} + +// NewTdfNoteServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewTdfNoteServiceHandler(svc TdfNoteServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + tdfNoteServiceMethods := v1.File_tdf_note_v1_tdf_note_proto.Services().ByName("TdfNoteService").Methods() + tdfNoteServiceCreateTdfNoteHandler := connect.NewUnaryHandler( + TdfNoteServiceCreateTdfNoteProcedure, + svc.CreateTdfNote, + connect.WithSchema(tdfNoteServiceMethods.ByName("CreateTdfNote")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceGetTdfNoteHandler := connect.NewUnaryHandler( + TdfNoteServiceGetTdfNoteProcedure, + svc.GetTdfNote, + connect.WithSchema(tdfNoteServiceMethods.ByName("GetTdfNote")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceQueryTdfNotesHandler := connect.NewUnaryHandler( + TdfNoteServiceQueryTdfNotesProcedure, + svc.QueryTdfNotes, + connect.WithSchema(tdfNoteServiceMethods.ByName("QueryTdfNotes")), + connect.WithHandlerOptions(opts...), + ) + tdfNoteServiceStreamTdfNotesHandler := connect.NewServerStreamHandler( + TdfNoteServiceStreamTdfNotesProcedure, + svc.StreamTdfNotes, + connect.WithSchema(tdfNoteServiceMethods.ByName("StreamTdfNotes")), + connect.WithHandlerOptions(opts...), + ) + return "/tdf_notes.v1.TdfNoteService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case TdfNoteServiceCreateTdfNoteProcedure: + tdfNoteServiceCreateTdfNoteHandler.ServeHTTP(w, r) + case TdfNoteServiceGetTdfNoteProcedure: + tdfNoteServiceGetTdfNoteHandler.ServeHTTP(w, r) + case TdfNoteServiceQueryTdfNotesProcedure: + tdfNoteServiceQueryTdfNotesHandler.ServeHTTP(w, r) + case TdfNoteServiceStreamTdfNotesProcedure: + tdfNoteServiceStreamTdfNotesHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedTdfNoteServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedTdfNoteServiceHandler struct{} + +func (UnimplementedTdfNoteServiceHandler) CreateTdfNote(context.Context, *connect.Request[v1.CreateTdfNoteRequest]) (*connect.Response[v1.CreateTdfNoteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.CreateTdfNote is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) GetTdfNote(context.Context, *connect.Request[v1.GetTdfNoteRequest]) (*connect.Response[v1.GetTdfNoteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.GetTdfNote is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) QueryTdfNotes(context.Context, *connect.Request[v1.QueryTdfNotesRequest]) (*connect.Response[v1.QueryTdfNotesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.QueryTdfNotes is not implemented")) +} + +func (UnimplementedTdfNoteServiceHandler) StreamTdfNotes(context.Context, *connect.Request[v1.StreamTdfNotesRequest], *connect.ServerStream[v1.StreamTdfNotesResponse]) error { + return connect.NewError(connect.CodeUnimplemented, errors.New("tdf_notes.v1.TdfNoteService.StreamTdfNotes is not implemented")) +} diff --git a/common-operating-picture/api/proto/tdf_object/v1/tdf_object.pb.go b/common-operating-picture/api/proto/tdf_object/v1/tdf_object.pb.go index 768946e..84a2219 100644 --- a/common-operating-picture/api/proto/tdf_object/v1/tdf_object.pb.go +++ b/common-operating-picture/api/proto/tdf_object/v1/tdf_object.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc (unknown) -// source: tdf_object/v1/tdf_object.proto +// protoc v3.21.12 +// source: proto/tdf_object/v1/tdf_object.proto package tdf_objectv1 @@ -12,6 +12,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -84,11 +85,11 @@ func (x StreamEventType) String() string { } func (StreamEventType) Descriptor() protoreflect.EnumDescriptor { - return file_tdf_object_v1_tdf_object_proto_enumTypes[0].Descriptor() + return file_proto_tdf_object_v1_tdf_object_proto_enumTypes[0].Descriptor() } func (StreamEventType) Type() protoreflect.EnumType { - return &file_tdf_object_v1_tdf_object_proto_enumTypes[0] + return &file_proto_tdf_object_v1_tdf_object_proto_enumTypes[0] } func (x StreamEventType) Number() protoreflect.EnumNumber { @@ -97,7 +98,7 @@ func (x StreamEventType) Number() protoreflect.EnumNumber { // Deprecated: Use StreamEventType.Descriptor instead. func (StreamEventType) EnumDescriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{0} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{0} } type TdfObject struct { @@ -114,16 +115,18 @@ type TdfObject struct { Geo string `protobuf:"bytes,4,opt,name=geo,proto3" json:"geo,omitempty"` // plaintext json search index Search string `protobuf:"bytes,5,opt,name=search,proto3" json:"search,omitempty"` + // plaintext json metadata index + Metadata string `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` // tdf bytes - TdfBlob []byte `protobuf:"bytes,6,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` + TdfBlob []byte `protobuf:"bytes,7,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // tdf data uri - TdfUri string `protobuf:"bytes,7,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` + TdfUri string `protobuf:"bytes,8,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` } func (x *TdfObject) Reset() { *x = TdfObject{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[0] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -136,7 +139,7 @@ func (x *TdfObject) String() string { func (*TdfObject) ProtoMessage() {} func (x *TdfObject) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[0] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -149,7 +152,7 @@ func (x *TdfObject) ProtoReflect() protoreflect.Message { // Deprecated: Use TdfObject.ProtoReflect.Descriptor instead. func (*TdfObject) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{0} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{0} } func (x *TdfObject) GetId() string { @@ -187,6 +190,13 @@ func (x *TdfObject) GetSearch() string { return "" } +func (x *TdfObject) GetMetadata() string { + if x != nil { + return x.Metadata + } + return "" +} + func (x *TdfObject) GetTdfBlob() []byte { if x != nil { return x.TdfBlob @@ -214,7 +224,7 @@ type SrcTypeUiSchemaFieldConfig struct { func (x *SrcTypeUiSchemaFieldConfig) Reset() { *x = SrcTypeUiSchemaFieldConfig{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[1] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -227,7 +237,7 @@ func (x *SrcTypeUiSchemaFieldConfig) String() string { func (*SrcTypeUiSchemaFieldConfig) ProtoMessage() {} func (x *SrcTypeUiSchemaFieldConfig) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[1] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -240,7 +250,7 @@ func (x *SrcTypeUiSchemaFieldConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeUiSchemaFieldConfig.ProtoReflect.Descriptor instead. func (*SrcTypeUiSchemaFieldConfig) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{1} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{1} } func (x *SrcTypeUiSchemaFieldConfig) GetPlaceholder() string { @@ -276,7 +286,7 @@ type SrcTypeUiSchema struct { func (x *SrcTypeUiSchema) Reset() { *x = SrcTypeUiSchema{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[2] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -289,7 +299,7 @@ func (x *SrcTypeUiSchema) String() string { func (*SrcTypeUiSchema) ProtoMessage() {} func (x *SrcTypeUiSchema) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[2] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -302,7 +312,7 @@ func (x *SrcTypeUiSchema) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeUiSchema.ProtoReflect.Descriptor instead. func (*SrcTypeUiSchema) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{2} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{2} } func (x *SrcTypeUiSchema) GetOrder() []string { @@ -331,7 +341,7 @@ type SrcTypeMetadataDisplayFields struct { func (x *SrcTypeMetadataDisplayFields) Reset() { *x = SrcTypeMetadataDisplayFields{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[3] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -344,7 +354,7 @@ func (x *SrcTypeMetadataDisplayFields) String() string { func (*SrcTypeMetadataDisplayFields) ProtoMessage() {} func (x *SrcTypeMetadataDisplayFields) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[3] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -357,7 +367,7 @@ func (x *SrcTypeMetadataDisplayFields) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeMetadataDisplayFields.ProtoReflect.Descriptor instead. func (*SrcTypeMetadataDisplayFields) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{3} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{3} } func (x *SrcTypeMetadataDisplayFields) GetHeader() string { @@ -386,7 +396,7 @@ type SrcTypeMetadataMapFieldConfig struct { func (x *SrcTypeMetadataMapFieldConfig) Reset() { *x = SrcTypeMetadataMapFieldConfig{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[4] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -399,7 +409,7 @@ func (x *SrcTypeMetadataMapFieldConfig) String() string { func (*SrcTypeMetadataMapFieldConfig) ProtoMessage() {} func (x *SrcTypeMetadataMapFieldConfig) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[4] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -412,7 +422,7 @@ func (x *SrcTypeMetadataMapFieldConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeMetadataMapFieldConfig.ProtoReflect.Descriptor instead. func (*SrcTypeMetadataMapFieldConfig) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{4} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{4} } func (x *SrcTypeMetadataMapFieldConfig) GetField() string { @@ -443,7 +453,7 @@ type SrcTypeMetadataMapFields struct { func (x *SrcTypeMetadataMapFields) Reset() { *x = SrcTypeMetadataMapFields{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[5] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +466,7 @@ func (x *SrcTypeMetadataMapFields) String() string { func (*SrcTypeMetadataMapFields) ProtoMessage() {} func (x *SrcTypeMetadataMapFields) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[5] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,7 +479,7 @@ func (x *SrcTypeMetadataMapFields) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeMetadataMapFields.ProtoReflect.Descriptor instead. func (*SrcTypeMetadataMapFields) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{5} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{5} } func (x *SrcTypeMetadataMapFields) GetIconDefault() string { @@ -516,7 +526,7 @@ type SrcTypeMetadata struct { func (x *SrcTypeMetadata) Reset() { *x = SrcTypeMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[6] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -529,7 +539,7 @@ func (x *SrcTypeMetadata) String() string { func (*SrcTypeMetadata) ProtoMessage() {} func (x *SrcTypeMetadata) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[6] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -542,7 +552,7 @@ func (x *SrcTypeMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcTypeMetadata.ProtoReflect.Descriptor instead. func (*SrcTypeMetadata) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{6} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{6} } func (x *SrcTypeMetadata) GetGeoField() string { @@ -601,7 +611,7 @@ type SrcType struct { func (x *SrcType) Reset() { *x = SrcType{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[7] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -614,7 +624,7 @@ func (x *SrcType) String() string { func (*SrcType) ProtoMessage() {} func (x *SrcType) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[7] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -627,7 +637,7 @@ func (x *SrcType) ProtoReflect() protoreflect.Message { // Deprecated: Use SrcType.ProtoReflect.Descriptor instead. func (*SrcType) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{7} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{7} } func (x *SrcType) GetId() string { @@ -670,7 +680,7 @@ type TimestampSelector struct { func (x *TimestampSelector) Reset() { *x = TimestampSelector{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[8] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -683,7 +693,7 @@ func (x *TimestampSelector) String() string { func (*TimestampSelector) ProtoMessage() {} func (x *TimestampSelector) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[8] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -696,7 +706,7 @@ func (x *TimestampSelector) ProtoReflect() protoreflect.Message { // Deprecated: Use TimestampSelector.ProtoReflect.Descriptor instead. func (*TimestampSelector) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{8} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{8} } func (x *TimestampSelector) GetGreaterOrEqualTo() *timestamppb.Timestamp { @@ -724,18 +734,20 @@ type CreateTdfObjectRequest struct { Geo string `protobuf:"bytes,2,opt,name=geo,proto3" json:"geo,omitempty"` // plaintext json search index Search string `protobuf:"bytes,3,opt,name=search,proto3" json:"search,omitempty"` + // plaintext json metadata index + Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` // tdf bytes - TdfBlob []byte `protobuf:"bytes,4,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` + TdfBlob []byte `protobuf:"bytes,5,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` // tdf data uri - TdfUri string `protobuf:"bytes,5,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` + TdfUri string `protobuf:"bytes,6,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` // timestamp of data - Ts *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=ts,proto3" json:"ts,omitempty"` + Ts *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=ts,proto3" json:"ts,omitempty"` } func (x *CreateTdfObjectRequest) Reset() { *x = CreateTdfObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[9] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -748,7 +760,7 @@ func (x *CreateTdfObjectRequest) String() string { func (*CreateTdfObjectRequest) ProtoMessage() {} func (x *CreateTdfObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[9] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -761,7 +773,7 @@ func (x *CreateTdfObjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTdfObjectRequest.ProtoReflect.Descriptor instead. func (*CreateTdfObjectRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{9} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{9} } func (x *CreateTdfObjectRequest) GetSrcType() string { @@ -785,6 +797,13 @@ func (x *CreateTdfObjectRequest) GetSearch() string { return "" } +func (x *CreateTdfObjectRequest) GetMetadata() string { + if x != nil { + return x.Metadata + } + return "" +} + func (x *CreateTdfObjectRequest) GetTdfBlob() []byte { if x != nil { return x.TdfBlob @@ -817,7 +836,7 @@ type CreateTdfObjectResponse struct { func (x *CreateTdfObjectResponse) Reset() { *x = CreateTdfObjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[10] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -830,7 +849,7 @@ func (x *CreateTdfObjectResponse) String() string { func (*CreateTdfObjectResponse) ProtoMessage() {} func (x *CreateTdfObjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[10] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -843,7 +862,7 @@ func (x *CreateTdfObjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTdfObjectResponse.ProtoReflect.Descriptor instead. func (*CreateTdfObjectResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{10} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{10} } func (x *CreateTdfObjectResponse) GetId() string { @@ -853,6 +872,164 @@ func (x *CreateTdfObjectResponse) GetId() string { return "" } +// Uses wrappers to enable optional fields +type UpdateTdfObjectRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // source type of data (MARS? what else?) + SrcType *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=src_type,json=srcType,proto3" json:"src_type,omitempty"` + // geospatial data of location of data + Geo *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=geo,proto3" json:"geo,omitempty"` + // plaintext json search index + Search *wrapperspb.StringValue `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` + // plaintext json metadata index + Metadata *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` + // tdf bytes + TdfBlob *wrapperspb.BytesValue `protobuf:"bytes,6,opt,name=tdf_blob,json=tdfBlob,proto3" json:"tdf_blob,omitempty"` + // tdf data uri + TdfUri *wrapperspb.StringValue `protobuf:"bytes,7,opt,name=tdf_uri,json=tdfUri,proto3" json:"tdf_uri,omitempty"` + // timestamp of data + Ts *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=ts,proto3" json:"ts,omitempty"` +} + +func (x *UpdateTdfObjectRequest) Reset() { + *x = UpdateTdfObjectRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateTdfObjectRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTdfObjectRequest) ProtoMessage() {} + +func (x *UpdateTdfObjectRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTdfObjectRequest.ProtoReflect.Descriptor instead. +func (*UpdateTdfObjectRequest) Descriptor() ([]byte, []int) { + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{11} +} + +func (x *UpdateTdfObjectRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UpdateTdfObjectRequest) GetSrcType() *wrapperspb.StringValue { + if x != nil { + return x.SrcType + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetGeo() *wrapperspb.StringValue { + if x != nil { + return x.Geo + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetSearch() *wrapperspb.StringValue { + if x != nil { + return x.Search + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetMetadata() *wrapperspb.StringValue { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetTdfBlob() *wrapperspb.BytesValue { + if x != nil { + return x.TdfBlob + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetTdfUri() *wrapperspb.StringValue { + if x != nil { + return x.TdfUri + } + return nil +} + +func (x *UpdateTdfObjectRequest) GetTs() *timestamppb.Timestamp { + if x != nil { + return x.Ts + } + return nil +} + +type UpdateTdfObjectResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *UpdateTdfObjectResponse) Reset() { + *x = UpdateTdfObjectResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateTdfObjectResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTdfObjectResponse) ProtoMessage() {} + +func (x *UpdateTdfObjectResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateTdfObjectResponse.ProtoReflect.Descriptor instead. +func (*UpdateTdfObjectResponse) Descriptor() ([]byte, []int) { + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateTdfObjectResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + type GetTdfObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -864,7 +1041,7 @@ type GetTdfObjectRequest struct { func (x *GetTdfObjectRequest) Reset() { *x = GetTdfObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[11] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -877,7 +1054,7 @@ func (x *GetTdfObjectRequest) String() string { func (*GetTdfObjectRequest) ProtoMessage() {} func (x *GetTdfObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[11] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -890,7 +1067,7 @@ func (x *GetTdfObjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTdfObjectRequest.ProtoReflect.Descriptor instead. func (*GetTdfObjectRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{11} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{13} } func (x *GetTdfObjectRequest) GetId() string { @@ -911,7 +1088,7 @@ type GetTdfObjectResponse struct { func (x *GetTdfObjectResponse) Reset() { *x = GetTdfObjectResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[12] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -924,7 +1101,7 @@ func (x *GetTdfObjectResponse) String() string { func (*GetTdfObjectResponse) ProtoMessage() {} func (x *GetTdfObjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[12] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -937,7 +1114,7 @@ func (x *GetTdfObjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTdfObjectResponse.ProtoReflect.Descriptor instead. func (*GetTdfObjectResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{12} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{14} } func (x *GetTdfObjectResponse) GetTdfObject() *TdfObject { @@ -956,12 +1133,13 @@ type QueryTdfObjectsRequest struct { SrcType string `protobuf:"bytes,2,opt,name=src_type,json=srcType,proto3" json:"src_type,omitempty"` GeoLocation string `protobuf:"bytes,3,opt,name=geo_location,json=geoLocation,proto3" json:"geo_location,omitempty"` Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` + Metadata string `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` } func (x *QueryTdfObjectsRequest) Reset() { *x = QueryTdfObjectsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[13] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -974,7 +1152,7 @@ func (x *QueryTdfObjectsRequest) String() string { func (*QueryTdfObjectsRequest) ProtoMessage() {} func (x *QueryTdfObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[13] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -987,7 +1165,7 @@ func (x *QueryTdfObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryTdfObjectsRequest.ProtoReflect.Descriptor instead. func (*QueryTdfObjectsRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{13} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{15} } func (x *QueryTdfObjectsRequest) GetTsRange() *TimestampSelector { @@ -1018,6 +1196,13 @@ func (x *QueryTdfObjectsRequest) GetSearch() string { return "" } +func (x *QueryTdfObjectsRequest) GetMetadata() string { + if x != nil { + return x.Metadata + } + return "" +} + type QueryTdfObjectsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1029,7 +1214,7 @@ type QueryTdfObjectsResponse struct { func (x *QueryTdfObjectsResponse) Reset() { *x = QueryTdfObjectsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[14] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1042,7 +1227,7 @@ func (x *QueryTdfObjectsResponse) String() string { func (*QueryTdfObjectsResponse) ProtoMessage() {} func (x *QueryTdfObjectsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[14] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1055,7 +1240,7 @@ func (x *QueryTdfObjectsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryTdfObjectsResponse.ProtoReflect.Descriptor instead. func (*QueryTdfObjectsResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{14} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{16} } func (x *QueryTdfObjectsResponse) GetTdfObjects() []*TdfObject { @@ -1074,7 +1259,7 @@ type StreamTdfObjectsRequest struct { func (x *StreamTdfObjectsRequest) Reset() { *x = StreamTdfObjectsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[15] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1087,7 +1272,7 @@ func (x *StreamTdfObjectsRequest) String() string { func (*StreamTdfObjectsRequest) ProtoMessage() {} func (x *StreamTdfObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[15] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1100,7 +1285,7 @@ func (x *StreamTdfObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamTdfObjectsRequest.ProtoReflect.Descriptor instead. func (*StreamTdfObjectsRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{15} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{17} } type StreamTdfObjectsResponse struct { @@ -1116,7 +1301,7 @@ type StreamTdfObjectsResponse struct { func (x *StreamTdfObjectsResponse) Reset() { *x = StreamTdfObjectsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[16] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1129,7 +1314,7 @@ func (x *StreamTdfObjectsResponse) String() string { func (*StreamTdfObjectsResponse) ProtoMessage() {} func (x *StreamTdfObjectsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[16] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1142,7 +1327,7 @@ func (x *StreamTdfObjectsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamTdfObjectsResponse.ProtoReflect.Descriptor instead. func (*StreamTdfObjectsResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{16} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{18} } func (x *StreamTdfObjectsResponse) GetEventType() StreamEventType { @@ -1175,7 +1360,7 @@ type ListSrcTypesRequest struct { func (x *ListSrcTypesRequest) Reset() { *x = ListSrcTypesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[17] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1188,7 +1373,7 @@ func (x *ListSrcTypesRequest) String() string { func (*ListSrcTypesRequest) ProtoMessage() {} func (x *ListSrcTypesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[17] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1201,7 +1386,7 @@ func (x *ListSrcTypesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSrcTypesRequest.ProtoReflect.Descriptor instead. func (*ListSrcTypesRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{17} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{19} } type ListSrcTypesResponse struct { @@ -1215,7 +1400,7 @@ type ListSrcTypesResponse struct { func (x *ListSrcTypesResponse) Reset() { *x = ListSrcTypesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[18] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1228,7 +1413,7 @@ func (x *ListSrcTypesResponse) String() string { func (*ListSrcTypesResponse) ProtoMessage() {} func (x *ListSrcTypesResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[18] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1241,7 +1426,7 @@ func (x *ListSrcTypesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSrcTypesResponse.ProtoReflect.Descriptor instead. func (*ListSrcTypesResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{18} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{20} } func (x *ListSrcTypesResponse) GetSrcTypes() []string { @@ -1262,7 +1447,7 @@ type GetSrcTypeRequest struct { func (x *GetSrcTypeRequest) Reset() { *x = GetSrcTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[19] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1275,7 +1460,7 @@ func (x *GetSrcTypeRequest) String() string { func (*GetSrcTypeRequest) ProtoMessage() {} func (x *GetSrcTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[19] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1288,7 +1473,7 @@ func (x *GetSrcTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrcTypeRequest.ProtoReflect.Descriptor instead. func (*GetSrcTypeRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{19} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{21} } func (x *GetSrcTypeRequest) GetSrcType() string { @@ -1309,7 +1494,7 @@ type GetSrcTypeResponse struct { func (x *GetSrcTypeResponse) Reset() { *x = GetSrcTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[20] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1322,7 +1507,7 @@ func (x *GetSrcTypeResponse) String() string { func (*GetSrcTypeResponse) ProtoMessage() {} func (x *GetSrcTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[20] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1335,7 +1520,7 @@ func (x *GetSrcTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrcTypeResponse.ProtoReflect.Descriptor instead. func (*GetSrcTypeResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{20} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{22} } func (x *GetSrcTypeResponse) GetSrcType() *SrcType { @@ -1354,7 +1539,7 @@ type GetEntitlementsRequest struct { func (x *GetEntitlementsRequest) Reset() { *x = GetEntitlementsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[21] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1552,7 @@ func (x *GetEntitlementsRequest) String() string { func (*GetEntitlementsRequest) ProtoMessage() {} func (x *GetEntitlementsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[21] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1565,7 @@ func (x *GetEntitlementsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEntitlementsRequest.ProtoReflect.Descriptor instead. func (*GetEntitlementsRequest) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{21} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{23} } type GetEntitlementsResponse struct { @@ -1394,7 +1579,7 @@ type GetEntitlementsResponse struct { func (x *GetEntitlementsResponse) Reset() { *x = GetEntitlementsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[22] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1407,7 +1592,7 @@ func (x *GetEntitlementsResponse) String() string { func (*GetEntitlementsResponse) ProtoMessage() {} func (x *GetEntitlementsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tdf_object_v1_tdf_object_proto_msgTypes[22] + mi := &file_proto_tdf_object_v1_tdf_object_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1420,7 +1605,7 @@ func (x *GetEntitlementsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEntitlementsResponse.ProtoReflect.Descriptor instead. func (*GetEntitlementsResponse) Descriptor() ([]byte, []int) { - return file_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{22} + return file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP(), []int{24} } func (x *GetEntitlementsResponse) GetEntitlements() map[string]bool { @@ -1430,142 +1615,177 @@ func (x *GetEntitlementsResponse) GetEntitlements() map[string]bool { return nil } -var File_tdf_object_v1_tdf_object_proto protoreflect.FileDescriptor - -var file_tdf_object_v1_tdf_object_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x2f, - 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0d, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x1a, - 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x01, 0x0a, 0x09, - 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, - 0x65, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, - 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, - 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x22, 0x72, - 0x0a, 0x1a, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x0f, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0c, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0x69, 0x0a, 0x10, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1c, 0x53, - 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xca, 0x01, - 0x0a, 0x1d, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x56, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, - 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, +var File_proto_tdf_object_v1_tdf_object_proto protoreflect.FileDescriptor + +var file_proto_tdf_object_v1_tdf_object_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xdc, 0x01, 0x0a, 0x09, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, + 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x64, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, + 0x72, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, + 0x22, 0x72, 0x0a, 0x1a, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x0f, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, + 0x55, 0x69, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x52, + 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x69, 0x0a, 0x10, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, + 0x69, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, + 0x1c, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0xca, 0x01, 0x0a, 0x1d, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x56, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x4d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, + 0x3b, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, + 0x18, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x63, 0x6f, + 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x69, 0x63, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x0a, 0x69, + 0x63, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, + 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x69, + 0x63, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xab, 0x02, + 0x0a, 0x0f, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x65, 0x6f, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x65, 0x6f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x52, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x3b, 0x0a, - 0x0d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, 0x18, 0x53, - 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, - 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x63, 0x6f, 0x6e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x63, - 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x0a, 0x69, 0x63, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, - 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x69, 0x63, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6f, 0x72, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x52, 0x09, 0x6d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x07, + 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x3b, 0x0a, 0x09, 0x75, 0x69, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x75, 0x69, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3a, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xab, 0x02, 0x0a, 0x0f, - 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1b, 0x0a, 0x09, 0x67, 0x65, 0x6f, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x67, 0x65, 0x6f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x52, 0x0a, - 0x0e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x09, - 0x6d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x07, 0x53, 0x72, - 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, - 0x3b, 0x0a, 0x09, 0x75, 0x69, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x55, 0x69, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x08, 0x75, 0x69, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3a, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x51, - 0x0a, 0x13, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x65, 0x71, 0x75, - 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x10, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x54, - 0x6f, 0x12, 0x47, 0x0a, 0x12, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x65, - 0x71, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x51, 0x0a, 0x13, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x72, 0x5f, 0x65, + 0x71, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6c, 0x65, 0x73, 0x73, 0x65, - 0x72, 0x4f, 0x72, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x54, 0x6f, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x10, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x45, 0x71, 0x75, 0x61, + 0x6c, 0x54, 0x6f, 0x12, 0x47, 0x0a, 0x12, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x72, + 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6c, 0x65, 0x73, + 0x73, 0x65, 0x72, 0x4f, 0x72, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x54, 0x6f, 0x22, 0xe1, 0x01, 0x0a, + 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x64, + 0x66, 0x55, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x73, + 0x22, 0x29, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xa4, 0x03, 0x0a, 0x16, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x37, + 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, + 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x38, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x08, 0x74, 0x64, 0x66, 0x5f, 0x62, + 0x6c, 0x6f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x74, 0x64, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, + 0x35, 0x0a, 0x07, 0x74, 0x64, 0x66, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, + 0x74, 0x64, 0x66, 0x55, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, - 0x74, 0x73, 0x22, 0x29, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, + 0x74, 0x73, 0x22, 0x29, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, @@ -1575,7 +1795,7 @@ var file_tdf_object_v1_tdf_object_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x09, 0x74, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xbb, 0x01, + 0x63, 0x74, 0x52, 0x09, 0x74, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x74, 0x73, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x64, 0x66, @@ -1587,84 +1807,92 @@ var file_tdf_object_v1_tdf_object_proto_rawDesc = []byte{ 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x65, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x54, 0x0a, 0x17, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x64, - 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x74, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc9, 0x01, 0x0a, - 0x18, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x39, 0x0a, 0x0b, 0x74, - 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x74, 0x64, 0x66, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, - 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x33, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x72, 0x63, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x72, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x72, 0x63, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x08, 0x73, 0x72, 0x63, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x22, 0x47, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x72, - 0x63, 0x54, 0x79, 0x70, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xb8, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x89, 0x03, 0x0a, 0x0f, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, - 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, 0x10, 0x01, - 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, - 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x03, 0x12, - 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, - 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, - 0x44, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, - 0x41, 0x54, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, - 0x43, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x52, - 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0b, 0x12, 0x20, 0x0a, - 0x1c, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0c, 0x12, - 0x25, 0x0a, 0x21, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x44, 0x46, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, - 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x14, 0x32, 0xb2, 0x05, 0x0a, 0x10, 0x54, 0x64, 0x66, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, - 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x54, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x0a, 0x74, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x19, 0x0a, + 0x17, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc9, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x64, 0x66, 0x5f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x64, 0x66, 0x5f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x64, 0x66, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x74, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, + 0x08, 0x05, 0x10, 0x06, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x72, 0x63, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x33, 0x0a, 0x14, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x22, 0x36, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x22, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, + 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x72, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x72, 0x63, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb8, 0x01, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x89, 0x03, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, + 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, + 0x19, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, + 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, + 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, + 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x04, 0x12, 0x1f, + 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, + 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x06, + 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0b, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, + 0x41, 0x54, 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0c, 0x12, 0x25, 0x0a, 0x21, 0x53, + 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x44, 0x46, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x4e, 0x45, 0x57, + 0x10, 0x14, 0x32, 0x96, 0x06, 0x0a, 0x10, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x74, 0x64, 0x66, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, + 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, + 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x64, 0x66, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x22, 0x2e, 0x74, 0x64, 0x66, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, @@ -1710,20 +1938,20 @@ var file_tdf_object_v1_tdf_object_proto_rawDesc = []byte{ } var ( - file_tdf_object_v1_tdf_object_proto_rawDescOnce sync.Once - file_tdf_object_v1_tdf_object_proto_rawDescData = file_tdf_object_v1_tdf_object_proto_rawDesc + file_proto_tdf_object_v1_tdf_object_proto_rawDescOnce sync.Once + file_proto_tdf_object_v1_tdf_object_proto_rawDescData = file_proto_tdf_object_v1_tdf_object_proto_rawDesc ) -func file_tdf_object_v1_tdf_object_proto_rawDescGZIP() []byte { - file_tdf_object_v1_tdf_object_proto_rawDescOnce.Do(func() { - file_tdf_object_v1_tdf_object_proto_rawDescData = protoimpl.X.CompressGZIP(file_tdf_object_v1_tdf_object_proto_rawDescData) +func file_proto_tdf_object_v1_tdf_object_proto_rawDescGZIP() []byte { + file_proto_tdf_object_v1_tdf_object_proto_rawDescOnce.Do(func() { + file_proto_tdf_object_v1_tdf_object_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_tdf_object_v1_tdf_object_proto_rawDescData) }) - return file_tdf_object_v1_tdf_object_proto_rawDescData + return file_proto_tdf_object_v1_tdf_object_proto_rawDescData } -var file_tdf_object_v1_tdf_object_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_tdf_object_v1_tdf_object_proto_msgTypes = make([]protoimpl.MessageInfo, 26) -var file_tdf_object_v1_tdf_object_proto_goTypes = []interface{}{ +var file_proto_tdf_object_v1_tdf_object_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_proto_tdf_object_v1_tdf_object_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_proto_tdf_object_v1_tdf_object_proto_goTypes = []interface{}{ (StreamEventType)(0), // 0: tdf_object.v1.StreamEventType (*TdfObject)(nil), // 1: tdf_object.v1.TdfObject (*SrcTypeUiSchemaFieldConfig)(nil), // 2: tdf_object.v1.SrcTypeUiSchemaFieldConfig @@ -1736,74 +1964,87 @@ var file_tdf_object_v1_tdf_object_proto_goTypes = []interface{}{ (*TimestampSelector)(nil), // 9: tdf_object.v1.TimestampSelector (*CreateTdfObjectRequest)(nil), // 10: tdf_object.v1.CreateTdfObjectRequest (*CreateTdfObjectResponse)(nil), // 11: tdf_object.v1.CreateTdfObjectResponse - (*GetTdfObjectRequest)(nil), // 12: tdf_object.v1.GetTdfObjectRequest - (*GetTdfObjectResponse)(nil), // 13: tdf_object.v1.GetTdfObjectResponse - (*QueryTdfObjectsRequest)(nil), // 14: tdf_object.v1.QueryTdfObjectsRequest - (*QueryTdfObjectsResponse)(nil), // 15: tdf_object.v1.QueryTdfObjectsResponse - (*StreamTdfObjectsRequest)(nil), // 16: tdf_object.v1.StreamTdfObjectsRequest - (*StreamTdfObjectsResponse)(nil), // 17: tdf_object.v1.StreamTdfObjectsResponse - (*ListSrcTypesRequest)(nil), // 18: tdf_object.v1.ListSrcTypesRequest - (*ListSrcTypesResponse)(nil), // 19: tdf_object.v1.ListSrcTypesResponse - (*GetSrcTypeRequest)(nil), // 20: tdf_object.v1.GetSrcTypeRequest - (*GetSrcTypeResponse)(nil), // 21: tdf_object.v1.GetSrcTypeResponse - (*GetEntitlementsRequest)(nil), // 22: tdf_object.v1.GetEntitlementsRequest - (*GetEntitlementsResponse)(nil), // 23: tdf_object.v1.GetEntitlementsResponse - nil, // 24: tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry - nil, // 25: tdf_object.v1.SrcTypeMetadataMapFieldConfig.ValueMapEntry - nil, // 26: tdf_object.v1.GetEntitlementsResponse.EntitlementsEntry - (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp - (*structpb.Struct)(nil), // 28: google.protobuf.Struct -} -var file_tdf_object_v1_tdf_object_proto_depIdxs = []int32{ - 27, // 0: tdf_object.v1.TdfObject.ts:type_name -> google.protobuf.Timestamp - 24, // 1: tdf_object.v1.SrcTypeUiSchema.field_config:type_name -> tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry - 25, // 2: tdf_object.v1.SrcTypeMetadataMapFieldConfig.valueMap:type_name -> tdf_object.v1.SrcTypeMetadataMapFieldConfig.ValueMapEntry + (*UpdateTdfObjectRequest)(nil), // 12: tdf_object.v1.UpdateTdfObjectRequest + (*UpdateTdfObjectResponse)(nil), // 13: tdf_object.v1.UpdateTdfObjectResponse + (*GetTdfObjectRequest)(nil), // 14: tdf_object.v1.GetTdfObjectRequest + (*GetTdfObjectResponse)(nil), // 15: tdf_object.v1.GetTdfObjectResponse + (*QueryTdfObjectsRequest)(nil), // 16: tdf_object.v1.QueryTdfObjectsRequest + (*QueryTdfObjectsResponse)(nil), // 17: tdf_object.v1.QueryTdfObjectsResponse + (*StreamTdfObjectsRequest)(nil), // 18: tdf_object.v1.StreamTdfObjectsRequest + (*StreamTdfObjectsResponse)(nil), // 19: tdf_object.v1.StreamTdfObjectsResponse + (*ListSrcTypesRequest)(nil), // 20: tdf_object.v1.ListSrcTypesRequest + (*ListSrcTypesResponse)(nil), // 21: tdf_object.v1.ListSrcTypesResponse + (*GetSrcTypeRequest)(nil), // 22: tdf_object.v1.GetSrcTypeRequest + (*GetSrcTypeResponse)(nil), // 23: tdf_object.v1.GetSrcTypeResponse + (*GetEntitlementsRequest)(nil), // 24: tdf_object.v1.GetEntitlementsRequest + (*GetEntitlementsResponse)(nil), // 25: tdf_object.v1.GetEntitlementsResponse + nil, // 26: tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry + nil, // 27: tdf_object.v1.SrcTypeMetadataMapFieldConfig.ValueMapEntry + nil, // 28: tdf_object.v1.GetEntitlementsResponse.EntitlementsEntry + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp + (*structpb.Struct)(nil), // 30: google.protobuf.Struct + (*wrapperspb.StringValue)(nil), // 31: google.protobuf.StringValue + (*wrapperspb.BytesValue)(nil), // 32: google.protobuf.BytesValue +} +var file_proto_tdf_object_v1_tdf_object_proto_depIdxs = []int32{ + 29, // 0: tdf_object.v1.TdfObject.ts:type_name -> google.protobuf.Timestamp + 26, // 1: tdf_object.v1.SrcTypeUiSchema.field_config:type_name -> tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry + 27, // 2: tdf_object.v1.SrcTypeMetadataMapFieldConfig.valueMap:type_name -> tdf_object.v1.SrcTypeMetadataMapFieldConfig.ValueMapEntry 5, // 3: tdf_object.v1.SrcTypeMetadataMapFields.iconConfig:type_name -> tdf_object.v1.SrcTypeMetadataMapFieldConfig 5, // 4: tdf_object.v1.SrcTypeMetadataMapFields.colorConfig:type_name -> tdf_object.v1.SrcTypeMetadataMapFieldConfig 4, // 5: tdf_object.v1.SrcTypeMetadata.display_fields:type_name -> tdf_object.v1.SrcTypeMetadataDisplayFields 6, // 6: tdf_object.v1.SrcTypeMetadata.map_fields:type_name -> tdf_object.v1.SrcTypeMetadataMapFields - 28, // 7: tdf_object.v1.SrcType.form_schema:type_name -> google.protobuf.Struct + 30, // 7: tdf_object.v1.SrcType.form_schema:type_name -> google.protobuf.Struct 3, // 8: tdf_object.v1.SrcType.ui_schema:type_name -> tdf_object.v1.SrcTypeUiSchema 7, // 9: tdf_object.v1.SrcType.metadata:type_name -> tdf_object.v1.SrcTypeMetadata - 27, // 10: tdf_object.v1.TimestampSelector.greater_or_equal_to:type_name -> google.protobuf.Timestamp - 27, // 11: tdf_object.v1.TimestampSelector.lesser_or_equal_to:type_name -> google.protobuf.Timestamp - 27, // 12: tdf_object.v1.CreateTdfObjectRequest.ts:type_name -> google.protobuf.Timestamp - 1, // 13: tdf_object.v1.GetTdfObjectResponse.tdf_object:type_name -> tdf_object.v1.TdfObject - 9, // 14: tdf_object.v1.QueryTdfObjectsRequest.ts_range:type_name -> tdf_object.v1.TimestampSelector - 1, // 15: tdf_object.v1.QueryTdfObjectsResponse.tdf_objects:type_name -> tdf_object.v1.TdfObject - 0, // 16: tdf_object.v1.StreamTdfObjectsResponse.event_type:type_name -> tdf_object.v1.StreamEventType - 1, // 17: tdf_object.v1.StreamTdfObjectsResponse.tdf_objects:type_name -> tdf_object.v1.TdfObject - 8, // 18: tdf_object.v1.GetSrcTypeResponse.src_type:type_name -> tdf_object.v1.SrcType - 26, // 19: tdf_object.v1.GetEntitlementsResponse.entitlements:type_name -> tdf_object.v1.GetEntitlementsResponse.EntitlementsEntry - 2, // 20: tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry.value:type_name -> tdf_object.v1.SrcTypeUiSchemaFieldConfig - 10, // 21: tdf_object.v1.TdfObjectService.CreateTdfObject:input_type -> tdf_object.v1.CreateTdfObjectRequest - 12, // 22: tdf_object.v1.TdfObjectService.GetTdfObject:input_type -> tdf_object.v1.GetTdfObjectRequest - 14, // 23: tdf_object.v1.TdfObjectService.QueryTdfObjects:input_type -> tdf_object.v1.QueryTdfObjectsRequest - 16, // 24: tdf_object.v1.TdfObjectService.StreamTdfObjects:input_type -> tdf_object.v1.StreamTdfObjectsRequest - 20, // 25: tdf_object.v1.TdfObjectService.GetSrcType:input_type -> tdf_object.v1.GetSrcTypeRequest - 18, // 26: tdf_object.v1.TdfObjectService.ListSrcTypes:input_type -> tdf_object.v1.ListSrcTypesRequest - 22, // 27: tdf_object.v1.TdfObjectService.GetEntitlements:input_type -> tdf_object.v1.GetEntitlementsRequest - 11, // 28: tdf_object.v1.TdfObjectService.CreateTdfObject:output_type -> tdf_object.v1.CreateTdfObjectResponse - 13, // 29: tdf_object.v1.TdfObjectService.GetTdfObject:output_type -> tdf_object.v1.GetTdfObjectResponse - 15, // 30: tdf_object.v1.TdfObjectService.QueryTdfObjects:output_type -> tdf_object.v1.QueryTdfObjectsResponse - 17, // 31: tdf_object.v1.TdfObjectService.StreamTdfObjects:output_type -> tdf_object.v1.StreamTdfObjectsResponse - 21, // 32: tdf_object.v1.TdfObjectService.GetSrcType:output_type -> tdf_object.v1.GetSrcTypeResponse - 19, // 33: tdf_object.v1.TdfObjectService.ListSrcTypes:output_type -> tdf_object.v1.ListSrcTypesResponse - 23, // 34: tdf_object.v1.TdfObjectService.GetEntitlements:output_type -> tdf_object.v1.GetEntitlementsResponse - 28, // [28:35] is the sub-list for method output_type - 21, // [21:28] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name -} - -func init() { file_tdf_object_v1_tdf_object_proto_init() } -func file_tdf_object_v1_tdf_object_proto_init() { - if File_tdf_object_v1_tdf_object_proto != nil { + 29, // 10: tdf_object.v1.TimestampSelector.greater_or_equal_to:type_name -> google.protobuf.Timestamp + 29, // 11: tdf_object.v1.TimestampSelector.lesser_or_equal_to:type_name -> google.protobuf.Timestamp + 29, // 12: tdf_object.v1.CreateTdfObjectRequest.ts:type_name -> google.protobuf.Timestamp + 31, // 13: tdf_object.v1.UpdateTdfObjectRequest.src_type:type_name -> google.protobuf.StringValue + 31, // 14: tdf_object.v1.UpdateTdfObjectRequest.geo:type_name -> google.protobuf.StringValue + 31, // 15: tdf_object.v1.UpdateTdfObjectRequest.search:type_name -> google.protobuf.StringValue + 31, // 16: tdf_object.v1.UpdateTdfObjectRequest.metadata:type_name -> google.protobuf.StringValue + 32, // 17: tdf_object.v1.UpdateTdfObjectRequest.tdf_blob:type_name -> google.protobuf.BytesValue + 31, // 18: tdf_object.v1.UpdateTdfObjectRequest.tdf_uri:type_name -> google.protobuf.StringValue + 29, // 19: tdf_object.v1.UpdateTdfObjectRequest.ts:type_name -> google.protobuf.Timestamp + 1, // 20: tdf_object.v1.GetTdfObjectResponse.tdf_object:type_name -> tdf_object.v1.TdfObject + 9, // 21: tdf_object.v1.QueryTdfObjectsRequest.ts_range:type_name -> tdf_object.v1.TimestampSelector + 1, // 22: tdf_object.v1.QueryTdfObjectsResponse.tdf_objects:type_name -> tdf_object.v1.TdfObject + 0, // 23: tdf_object.v1.StreamTdfObjectsResponse.event_type:type_name -> tdf_object.v1.StreamEventType + 1, // 24: tdf_object.v1.StreamTdfObjectsResponse.tdf_objects:type_name -> tdf_object.v1.TdfObject + 8, // 25: tdf_object.v1.GetSrcTypeResponse.src_type:type_name -> tdf_object.v1.SrcType + 28, // 26: tdf_object.v1.GetEntitlementsResponse.entitlements:type_name -> tdf_object.v1.GetEntitlementsResponse.EntitlementsEntry + 2, // 27: tdf_object.v1.SrcTypeUiSchema.FieldConfigEntry.value:type_name -> tdf_object.v1.SrcTypeUiSchemaFieldConfig + 10, // 28: tdf_object.v1.TdfObjectService.CreateTdfObject:input_type -> tdf_object.v1.CreateTdfObjectRequest + 12, // 29: tdf_object.v1.TdfObjectService.UpdateTdfObject:input_type -> tdf_object.v1.UpdateTdfObjectRequest + 14, // 30: tdf_object.v1.TdfObjectService.GetTdfObject:input_type -> tdf_object.v1.GetTdfObjectRequest + 16, // 31: tdf_object.v1.TdfObjectService.QueryTdfObjects:input_type -> tdf_object.v1.QueryTdfObjectsRequest + 18, // 32: tdf_object.v1.TdfObjectService.StreamTdfObjects:input_type -> tdf_object.v1.StreamTdfObjectsRequest + 22, // 33: tdf_object.v1.TdfObjectService.GetSrcType:input_type -> tdf_object.v1.GetSrcTypeRequest + 20, // 34: tdf_object.v1.TdfObjectService.ListSrcTypes:input_type -> tdf_object.v1.ListSrcTypesRequest + 24, // 35: tdf_object.v1.TdfObjectService.GetEntitlements:input_type -> tdf_object.v1.GetEntitlementsRequest + 11, // 36: tdf_object.v1.TdfObjectService.CreateTdfObject:output_type -> tdf_object.v1.CreateTdfObjectResponse + 13, // 37: tdf_object.v1.TdfObjectService.UpdateTdfObject:output_type -> tdf_object.v1.UpdateTdfObjectResponse + 15, // 38: tdf_object.v1.TdfObjectService.GetTdfObject:output_type -> tdf_object.v1.GetTdfObjectResponse + 17, // 39: tdf_object.v1.TdfObjectService.QueryTdfObjects:output_type -> tdf_object.v1.QueryTdfObjectsResponse + 19, // 40: tdf_object.v1.TdfObjectService.StreamTdfObjects:output_type -> tdf_object.v1.StreamTdfObjectsResponse + 23, // 41: tdf_object.v1.TdfObjectService.GetSrcType:output_type -> tdf_object.v1.GetSrcTypeResponse + 21, // 42: tdf_object.v1.TdfObjectService.ListSrcTypes:output_type -> tdf_object.v1.ListSrcTypesResponse + 25, // 43: tdf_object.v1.TdfObjectService.GetEntitlements:output_type -> tdf_object.v1.GetEntitlementsResponse + 36, // [36:44] is the sub-list for method output_type + 28, // [28:36] is the sub-list for method input_type + 28, // [28:28] is the sub-list for extension type_name + 28, // [28:28] is the sub-list for extension extendee + 0, // [0:28] is the sub-list for field type_name +} + +func init() { file_proto_tdf_object_v1_tdf_object_proto_init() } +func file_proto_tdf_object_v1_tdf_object_proto_init() { + if File_proto_tdf_object_v1_tdf_object_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_tdf_object_v1_tdf_object_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TdfObject); i { case 0: return &v.state @@ -1815,7 +2056,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeUiSchemaFieldConfig); i { case 0: return &v.state @@ -1827,7 +2068,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeUiSchema); i { case 0: return &v.state @@ -1839,7 +2080,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeMetadataDisplayFields); i { case 0: return &v.state @@ -1851,7 +2092,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeMetadataMapFieldConfig); i { case 0: return &v.state @@ -1863,7 +2104,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeMetadataMapFields); i { case 0: return &v.state @@ -1875,7 +2116,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcTypeMetadata); i { case 0: return &v.state @@ -1887,7 +2128,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SrcType); i { case 0: return &v.state @@ -1899,7 +2140,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimestampSelector); i { case 0: return &v.state @@ -1911,7 +2152,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateTdfObjectRequest); i { case 0: return &v.state @@ -1923,7 +2164,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateTdfObjectResponse); i { case 0: return &v.state @@ -1935,7 +2176,31 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateTdfObjectRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateTdfObjectResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTdfObjectRequest); i { case 0: return &v.state @@ -1947,7 +2212,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTdfObjectResponse); i { case 0: return &v.state @@ -1959,7 +2224,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryTdfObjectsRequest); i { case 0: return &v.state @@ -1971,7 +2236,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryTdfObjectsResponse); i { case 0: return &v.state @@ -1983,7 +2248,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamTdfObjectsRequest); i { case 0: return &v.state @@ -1995,7 +2260,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamTdfObjectsResponse); i { case 0: return &v.state @@ -2007,7 +2272,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListSrcTypesRequest); i { case 0: return &v.state @@ -2019,7 +2284,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListSrcTypesResponse); i { case 0: return &v.state @@ -2031,7 +2296,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSrcTypeRequest); i { case 0: return &v.state @@ -2043,7 +2308,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSrcTypeResponse); i { case 0: return &v.state @@ -2055,7 +2320,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEntitlementsRequest); i { case 0: return &v.state @@ -2067,7 +2332,7 @@ func file_tdf_object_v1_tdf_object_proto_init() { return nil } } - file_tdf_object_v1_tdf_object_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_proto_tdf_object_v1_tdf_object_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEntitlementsResponse); i { case 0: return &v.state @@ -2084,19 +2349,19 @@ func file_tdf_object_v1_tdf_object_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_tdf_object_v1_tdf_object_proto_rawDesc, + RawDescriptor: file_proto_tdf_object_v1_tdf_object_proto_rawDesc, NumEnums: 1, - NumMessages: 26, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_tdf_object_v1_tdf_object_proto_goTypes, - DependencyIndexes: file_tdf_object_v1_tdf_object_proto_depIdxs, - EnumInfos: file_tdf_object_v1_tdf_object_proto_enumTypes, - MessageInfos: file_tdf_object_v1_tdf_object_proto_msgTypes, + GoTypes: file_proto_tdf_object_v1_tdf_object_proto_goTypes, + DependencyIndexes: file_proto_tdf_object_v1_tdf_object_proto_depIdxs, + EnumInfos: file_proto_tdf_object_v1_tdf_object_proto_enumTypes, + MessageInfos: file_proto_tdf_object_v1_tdf_object_proto_msgTypes, }.Build() - File_tdf_object_v1_tdf_object_proto = out.File - file_tdf_object_v1_tdf_object_proto_rawDesc = nil - file_tdf_object_v1_tdf_object_proto_goTypes = nil - file_tdf_object_v1_tdf_object_proto_depIdxs = nil + File_proto_tdf_object_v1_tdf_object_proto = out.File + file_proto_tdf_object_v1_tdf_object_proto_rawDesc = nil + file_proto_tdf_object_v1_tdf_object_proto_goTypes = nil + file_proto_tdf_object_v1_tdf_object_proto_depIdxs = nil } diff --git a/common-operating-picture/api/proto/tdf_object/v1/tdf_objectv1connect/tdf_object.connect.go b/common-operating-picture/api/proto/tdf_object/v1/tdf_objectv1connect/tdf_object.connect.go index ca3220c..a06e039 100644 --- a/common-operating-picture/api/proto/tdf_object/v1/tdf_objectv1connect/tdf_object.connect.go +++ b/common-operating-picture/api/proto/tdf_object/v1/tdf_objectv1connect/tdf_object.connect.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-connect-go. DO NOT EDIT. // -// Source: tdf_object/v1/tdf_object.proto +// Source: proto/tdf_object/v1/tdf_object.proto package tdf_objectv1connect @@ -36,6 +36,9 @@ const ( // TdfObjectServiceCreateTdfObjectProcedure is the fully-qualified name of the TdfObjectService's // CreateTdfObject RPC. TdfObjectServiceCreateTdfObjectProcedure = "/tdf_object.v1.TdfObjectService/CreateTdfObject" + // TdfObjectServiceUpdateTdfObjectProcedure is the fully-qualified name of the TdfObjectService's + // UpdateTdfObject RPC. + TdfObjectServiceUpdateTdfObjectProcedure = "/tdf_object.v1.TdfObjectService/UpdateTdfObject" // TdfObjectServiceGetTdfObjectProcedure is the fully-qualified name of the TdfObjectService's // GetTdfObject RPC. TdfObjectServiceGetTdfObjectProcedure = "/tdf_object.v1.TdfObjectService/GetTdfObject" @@ -58,8 +61,9 @@ const ( // These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. var ( - tdfObjectServiceServiceDescriptor = v1.File_tdf_object_v1_tdf_object_proto.Services().ByName("TdfObjectService") + tdfObjectServiceServiceDescriptor = v1.File_proto_tdf_object_v1_tdf_object_proto.Services().ByName("TdfObjectService") tdfObjectServiceCreateTdfObjectMethodDescriptor = tdfObjectServiceServiceDescriptor.Methods().ByName("CreateTdfObject") + tdfObjectServiceUpdateTdfObjectMethodDescriptor = tdfObjectServiceServiceDescriptor.Methods().ByName("UpdateTdfObject") tdfObjectServiceGetTdfObjectMethodDescriptor = tdfObjectServiceServiceDescriptor.Methods().ByName("GetTdfObject") tdfObjectServiceQueryTdfObjectsMethodDescriptor = tdfObjectServiceServiceDescriptor.Methods().ByName("QueryTdfObjects") tdfObjectServiceStreamTdfObjectsMethodDescriptor = tdfObjectServiceServiceDescriptor.Methods().ByName("StreamTdfObjects") @@ -71,6 +75,7 @@ var ( // TdfObjectServiceClient is a client for the tdf_object.v1.TdfObjectService service. type TdfObjectServiceClient interface { CreateTdfObject(context.Context, *connect.Request[v1.CreateTdfObjectRequest]) (*connect.Response[v1.CreateTdfObjectResponse], error) + UpdateTdfObject(context.Context, *connect.Request[v1.UpdateTdfObjectRequest]) (*connect.Response[v1.UpdateTdfObjectResponse], error) GetTdfObject(context.Context, *connect.Request[v1.GetTdfObjectRequest]) (*connect.Response[v1.GetTdfObjectResponse], error) QueryTdfObjects(context.Context, *connect.Request[v1.QueryTdfObjectsRequest]) (*connect.Response[v1.QueryTdfObjectsResponse], error) StreamTdfObjects(context.Context, *connect.Request[v1.StreamTdfObjectsRequest]) (*connect.ServerStreamForClient[v1.StreamTdfObjectsResponse], error) @@ -95,6 +100,12 @@ func NewTdfObjectServiceClient(httpClient connect.HTTPClient, baseURL string, op connect.WithSchema(tdfObjectServiceCreateTdfObjectMethodDescriptor), connect.WithClientOptions(opts...), ), + updateTdfObject: connect.NewClient[v1.UpdateTdfObjectRequest, v1.UpdateTdfObjectResponse]( + httpClient, + baseURL+TdfObjectServiceUpdateTdfObjectProcedure, + connect.WithSchema(tdfObjectServiceUpdateTdfObjectMethodDescriptor), + connect.WithClientOptions(opts...), + ), getTdfObject: connect.NewClient[v1.GetTdfObjectRequest, v1.GetTdfObjectResponse]( httpClient, baseURL+TdfObjectServiceGetTdfObjectProcedure, @@ -137,6 +148,7 @@ func NewTdfObjectServiceClient(httpClient connect.HTTPClient, baseURL string, op // tdfObjectServiceClient implements TdfObjectServiceClient. type tdfObjectServiceClient struct { createTdfObject *connect.Client[v1.CreateTdfObjectRequest, v1.CreateTdfObjectResponse] + updateTdfObject *connect.Client[v1.UpdateTdfObjectRequest, v1.UpdateTdfObjectResponse] getTdfObject *connect.Client[v1.GetTdfObjectRequest, v1.GetTdfObjectResponse] queryTdfObjects *connect.Client[v1.QueryTdfObjectsRequest, v1.QueryTdfObjectsResponse] streamTdfObjects *connect.Client[v1.StreamTdfObjectsRequest, v1.StreamTdfObjectsResponse] @@ -150,6 +162,11 @@ func (c *tdfObjectServiceClient) CreateTdfObject(ctx context.Context, req *conne return c.createTdfObject.CallUnary(ctx, req) } +// UpdateTdfObject calls tdf_object.v1.TdfObjectService.UpdateTdfObject. +func (c *tdfObjectServiceClient) UpdateTdfObject(ctx context.Context, req *connect.Request[v1.UpdateTdfObjectRequest]) (*connect.Response[v1.UpdateTdfObjectResponse], error) { + return c.updateTdfObject.CallUnary(ctx, req) +} + // GetTdfObject calls tdf_object.v1.TdfObjectService.GetTdfObject. func (c *tdfObjectServiceClient) GetTdfObject(ctx context.Context, req *connect.Request[v1.GetTdfObjectRequest]) (*connect.Response[v1.GetTdfObjectResponse], error) { return c.getTdfObject.CallUnary(ctx, req) @@ -183,6 +200,7 @@ func (c *tdfObjectServiceClient) GetEntitlements(ctx context.Context, req *conne // TdfObjectServiceHandler is an implementation of the tdf_object.v1.TdfObjectService service. type TdfObjectServiceHandler interface { CreateTdfObject(context.Context, *connect.Request[v1.CreateTdfObjectRequest]) (*connect.Response[v1.CreateTdfObjectResponse], error) + UpdateTdfObject(context.Context, *connect.Request[v1.UpdateTdfObjectRequest]) (*connect.Response[v1.UpdateTdfObjectResponse], error) GetTdfObject(context.Context, *connect.Request[v1.GetTdfObjectRequest]) (*connect.Response[v1.GetTdfObjectResponse], error) QueryTdfObjects(context.Context, *connect.Request[v1.QueryTdfObjectsRequest]) (*connect.Response[v1.QueryTdfObjectsResponse], error) StreamTdfObjects(context.Context, *connect.Request[v1.StreamTdfObjectsRequest], *connect.ServerStream[v1.StreamTdfObjectsResponse]) error @@ -203,6 +221,12 @@ func NewTdfObjectServiceHandler(svc TdfObjectServiceHandler, opts ...connect.Han connect.WithSchema(tdfObjectServiceCreateTdfObjectMethodDescriptor), connect.WithHandlerOptions(opts...), ) + tdfObjectServiceUpdateTdfObjectHandler := connect.NewUnaryHandler( + TdfObjectServiceUpdateTdfObjectProcedure, + svc.UpdateTdfObject, + connect.WithSchema(tdfObjectServiceUpdateTdfObjectMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) tdfObjectServiceGetTdfObjectHandler := connect.NewUnaryHandler( TdfObjectServiceGetTdfObjectProcedure, svc.GetTdfObject, @@ -243,6 +267,8 @@ func NewTdfObjectServiceHandler(svc TdfObjectServiceHandler, opts ...connect.Han switch r.URL.Path { case TdfObjectServiceCreateTdfObjectProcedure: tdfObjectServiceCreateTdfObjectHandler.ServeHTTP(w, r) + case TdfObjectServiceUpdateTdfObjectProcedure: + tdfObjectServiceUpdateTdfObjectHandler.ServeHTTP(w, r) case TdfObjectServiceGetTdfObjectProcedure: tdfObjectServiceGetTdfObjectHandler.ServeHTTP(w, r) case TdfObjectServiceQueryTdfObjectsProcedure: @@ -268,6 +294,10 @@ func (UnimplementedTdfObjectServiceHandler) CreateTdfObject(context.Context, *co return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_object.v1.TdfObjectService.CreateTdfObject is not implemented")) } +func (UnimplementedTdfObjectServiceHandler) UpdateTdfObject(context.Context, *connect.Request[v1.UpdateTdfObjectRequest]) (*connect.Response[v1.UpdateTdfObjectResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_object.v1.TdfObjectService.UpdateTdfObject is not implemented")) +} + func (UnimplementedTdfObjectServiceHandler) GetTdfObject(context.Context, *connect.Request[v1.GetTdfObjectRequest]) (*connect.Response[v1.GetTdfObjectResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("tdf_object.v1.TdfObjectService.GetTdfObject is not implemented")) } diff --git a/common-operating-picture/api/server.go b/common-operating-picture/api/server.go index 1d003b6..1678630 100644 --- a/common-operating-picture/api/server.go +++ b/common-operating-picture/api/server.go @@ -21,6 +21,7 @@ import ( "github.com/jackc/pgx/v5/pgxpool" "github.com/opentdf/platform/sdk" "github.com/rs/cors" + "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1/tdf_notev1connect" "github.com/virtru-corp/dsp-cop/api/proto/tdf_object/v1/tdf_objectv1connect" "github.com/virtru-corp/dsp-cop/db" activeclients "github.com/virtru-corp/dsp-cop/pkg/activeClients" @@ -208,7 +209,7 @@ func createStaticServer(c *config.Config, staticFs fs.FS) *http.Server { func createGrpcServer(server *TdfObjectServer) *http.Server { mux := http.NewServeMux() - // Register reflection service on gRPC server. + // Register reflection service on gRPC server for TdfObjectService. reflector := grpcreflect.NewStaticReflector( "tdf_object.v1.TdfObjectService", ) @@ -220,8 +221,6 @@ func createGrpcServer(server *TdfObjectServer) *http.Server { server, connect.WithInterceptors(getInterceptors()...), ) - - // Create a new CORS middleware mux.Handle(path, cors.New(cors.Options{ AllowedOrigins: []string{server.Config.Service.CORSOrigin}, AllowedMethods: connectcors.AllowedMethods(), @@ -230,6 +229,21 @@ func createGrpcServer(server *TdfObjectServer) *http.Server { MaxAge: 7200, // 2 hours in seconds }).Handler(handler)) + // Register TdfNoteService on gRPC server. + // Ensure you're using the correct handler generated for the TdfNoteService + pathNote, handlerNote := tdf_notev1connect.NewTdfNoteServiceHandler( + server, // your service implementation here + connect.WithInterceptors(getInterceptors()...), // apply any interceptors you need + ) + mux.Handle(pathNote, cors.New(cors.Options{ + AllowedOrigins: []string{server.Config.Service.CORSOrigin}, + AllowedMethods: connectcors.AllowedMethods(), + AllowedHeaders: append(connectcors.AllowedHeaders(), "Authorization"), + ExposedHeaders: connectcors.ExposedHeaders(), + MaxAge: 7200, // 2 hours in seconds + }).Handler(handlerNote)) + + // Return the HTTP server with the mux return &http.Server{ Addr: ":" + server.Config.Service.GrpcPort, Handler: h2c.NewHandler(mux, &http2.Server{}), diff --git a/common-operating-picture/api/tdfobjectserver.go b/common-operating-picture/api/tdfobjectserver.go index 3a42381..df5f10e 100644 --- a/common-operating-picture/api/tdfobjectserver.go +++ b/common-operating-picture/api/tdfobjectserver.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "log" "log/slog" "strings" "time" @@ -15,6 +16,7 @@ import ( "github.com/opentdf/platform/sdk" geos "github.com/twpayne/go-geos" + tdf_notev1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1" tdf_objectv1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_object/v1" "github.com/virtru-corp/dsp-cop/db" activeclients "github.com/virtru-corp/dsp-cop/pkg/activeClients" @@ -32,6 +34,146 @@ type TdfObjectServer struct { cache *ristretto.Cache } +func (s *TdfObjectServer) CreateTdfNote( + ctx context.Context, + req *connect.Request[tdf_notev1.CreateTdfNoteRequest], +) (*connect.Response[tdf_notev1.CreateTdfNoteResponse], error) { + + /*COMMENT ON TABLE tdf_notes IS 'stream of tdf data'; + COMMENT ON COLUMN tdf_notes.id IS 'uuid primary key generated by the database'; + COMMENT ON COLUMN tdf_notes.ts IS 'timestamp generated by the database'; + COMMENT ON COLUMN tdf_notes.search IS 'plaintext json search index'; + COMMENT ON COLUMN tdf_notes.tdf_blob IS 'tdf data blob'; + COMMENT ON COLUMN tdf_notes.parent_id IS 'foreign key, corresponds to primary key id of tdf_objects entry'; + COMMENT ON COLUMN tdf_notes.tdf_uri IS 'tdf data uri'; + */ + var ts pgtype.Timestamp + if req.Msg.Ts != nil { + ts = pgtype.Timestamp{Time: req.Msg.GetTs().AsTime().UTC(), Valid: true} + } else { + ts = pgtype.Timestamp{Time: time.Now().UTC(), Valid: true} + } + + search := []byte(req.Msg.Search) + if len(search) == 0 { + // todo: figure out how to use with NULL db type + search = []byte("{}") + } + + // Convert the string to uuid.UUID + parentUUID, err := uuid.Parse(req.Msg.ParentId) + if err != nil { + log.Fatalf("invalid UUID: %v", err) + } + var newId uuid.UUID + var respErr *connect.Error + s.DBQueries.CreateNoteObject(ctx, []db.CreateNoteObjectParams{ + { + ParentID: parentUUID, + Ts: ts, + Search: search, + TdfBlob: req.Msg.TdfBlob, + }, + }).QueryRow(func(i int, id uuid.UUID, err error) { + if err != nil { + slog.ErrorContext(ctx, "Error inserting record", slog.String("error", err.Error())) + // TODO: log better exception / err than related parent's id + respErr = db.StatusifyError(err, db.ErrCreateFailure, slog.String("tdfNote: ", req.Msg.ParentId)) + } + newId = id + }) + + if respErr != nil { + return nil, respErr + } + + res := connect.NewResponse(&tdf_notev1.CreateTdfNoteResponse{ + Id: newId.String(), + }) + res.Header().Set("TdfNote-Version", "v1") + + return res, nil +} + +func (s *TdfObjectServer) UpdateTdfObject( + ctx context.Context, + req *connect.Request[tdf_objectv1.UpdateTdfObjectRequest], +) (*connect.Response[tdf_objectv1.UpdateTdfObjectResponse], error) { + + // Validate UUID input for updating TDF Object + objUUID, err := uuid.Parse(req.Msg.Id) + if err != nil { + return nil, fmt.Errorf("invalid ID format: %w", err) + } + + // Build query parameters, UUID added at initialization as it is required + params := db.UpdateTdfObjectParams{ + ID: objUUID, + } + + // Ts is optional but if not provided set it to current time + if req.Msg.Ts != nil { + params.Ts = pgtype.Timestamp{Time: req.Msg.GetTs().AsTime().UTC(), Valid: true} + } else { + params.Ts = pgtype.Timestamp{Time: time.Now().UTC(), Valid: true} + } + + // SrcTpe, Geo, Search, TdfBlob, TdfUri are all optional fields + if req.Msg.SrcType != nil { + params.SrcType = pgtype.Text{ + String: strings.ToLower(req.Msg.SrcType.GetValue()), + Valid: true, + } + } + + if req.Msg.Geo != nil { + geo, err := geos.NewGeomFromGeoJSON(req.Msg.Geo.GetValue()) + if err != nil { + return nil, fmt.Errorf("error creating geometry from GeoJSON: %w", err) + } + params.Geo = geo + } + + if req.Msg.Search != nil { + params.Search = []byte(req.Msg.Search.GetValue()) + } + + if req.Msg.Metadata != nil { + params.Metadata = []byte(req.Msg.Metadata.GetValue()) + } + + if req.Msg.TdfBlob != nil { + params.TdfBlob = req.Msg.TdfBlob.GetValue() + } + + if req.Msg.TdfUri != nil { + params.TdfUri = pgtype.Text{ + String: req.Msg.TdfUri.GetValue(), + Valid: true, + } + } + + // Call update function and passing the update parameters + var respErr *connect.Error + updatedObject, err := s.DBQueries.UpdateTdfObject(ctx, params) + + if err != nil { + respErr = connect.NewError(connect.CodeInternal, fmt.Errorf("database update failed: %w", err)) + } + + if respErr != nil { + slog.ErrorContext(ctx, "Error updating record", slog.String("id", req.Msg.Id), slog.String("error", err.Error())) + return nil, respErr + } + + res := connect.NewResponse(&tdf_objectv1.UpdateTdfObjectResponse{ + Id: updatedObject.ID.String(), + }) + res.Header().Set("TdfObject-Version", "v1") + + return res, nil +} + func (s *TdfObjectServer) CreateTdfObject( ctx context.Context, req *connect.Request[tdf_objectv1.CreateTdfObjectRequest], @@ -66,6 +208,11 @@ func (s *TdfObjectServer) CreateTdfObject( search = []byte("null") } + metadata := []byte(req.Msg.Metadata) + if len(metadata) == 0 { + metadata = []byte("{}") + } + var ts pgtype.Timestamp if req.Msg.Ts != nil { ts = pgtype.Timestamp{Time: req.Msg.GetTs().AsTime().UTC(), Valid: true} @@ -81,6 +228,7 @@ func (s *TdfObjectServer) CreateTdfObject( Ts: ts, Geo: geo, Search: search, + Metadata: metadata, TdfBlob: req.Msg.TdfBlob, }, }).QueryRow(func(i int, id uuid.UUID, err error) { @@ -103,6 +251,36 @@ func (s *TdfObjectServer) CreateTdfObject( return res, nil } +func (s *TdfObjectServer) GetTdfNote( + ctx context.Context, + req *connect.Request[tdf_notev1.GetTdfNoteRequest], +) (*connect.Response[tdf_notev1.GetTdfNoteResponse], error) { + + uuid, err := uuid.Parse(req.Msg.Id) + if err != nil { + return nil, err + } + + tdfObject, err := s.DBQueries.GetNoteByID(ctx, uuid) + if err != nil { + return nil, err + } + + res := connect.NewResponse(&tdf_notev1.GetTdfNoteResponse{ + TdfNote: prepNoteForResponse(db.TdfNote{ + ID: uuid, + Ts: tdfObject.Ts, + ParentID: tdfObject.ParentID, + Search: tdfObject.Search, + TdfBlob: tdfObject.TdfBlob, + TdfUri: tdfObject.TdfUri, + }), + }) + res.Header().Set("TdfNote-Version", "v1") + + return res, nil +} + func (s *TdfObjectServer) GetTdfObject( ctx context.Context, req *connect.Request[tdf_objectv1.GetTdfObjectRequest], @@ -171,33 +349,38 @@ func (s *TdfObjectServer) getEntitlements(token string) (dspClient.Entitlements, return entitlements.(dspClient.Entitlements), nil } -func (s *TdfObjectServer) QueryTdfObjects( +func (s *TdfObjectServer) QueryTdfNotes( ctx context.Context, - req *connect.Request[tdf_objectv1.QueryTdfObjectsRequest], -) (*connect.Response[tdf_objectv1.QueryTdfObjectsResponse], error) { + req *connect.Request[tdf_notev1.QueryTdfNotesRequest], +) (*connect.Response[tdf_notev1.QueryTdfNotesResponse], error) { token := req.Header().Get("Authorization") entitlements, err := s.getEntitlements(token) if err != nil { return nil, err } + uuid, err := uuid.Parse(req.Msg.GetParentId()) + if err != nil { + return nil, err + } - tdfObjects, err := queryTdfObjectSwitch(ctx, s.DBQueries, req.Msg) + tdfNotes, err := s.DBQueries.GetNotesFromPar(ctx, uuid) if err != nil { return nil, err } // TODO: additional work is needed here to get the attributes for the TDFs // filter out TDFs that the user does not have access to - filteredTdfObjects := make([]*tdf_objectv1.TdfObject, 0, len(tdfObjects)) - for _, t := range tdfObjects { - if t.Search != "" { - // unmarshal the search string into a map + filteredTdfObjects := make([]*tdf_notev1.TdfNote, 0, len(tdfNotes)) + for _, t := range tdfNotes { + if len(t.Search) > 0 { + // Unmarshal the search string into a map var searchAttributes util.TDFObjectSearchAttributes if err := json.Unmarshal([]byte(t.Search), &searchAttributes); err != nil { + // TODO: diagnose conflict w/ current search setup causing this err to proc. slog.Error("error unmarshalling search string", slog.String("error", err.Error())) continue } - // remove plaintext from results to reduce risk of leaking sensitive data + // Remove plaintext from results to reduce risk of leaking sensitive data if v, err := util.TrimTDFVisibility(searchAttributes, entitlements); !v { if err != nil { slog.Error("error trimming TDF visibility", slog.String("error", err.Error())) @@ -206,8 +389,86 @@ func (s *TdfObjectServer) QueryTdfObjects( } } - // remove search string from results to reduce risk of leaking sensitive data - t.Search = "" + // Clear the Search field to avoid leaking sensitive data + // ignoring for now as only contains classification + // t.Search = []byte{} + + // Convert db.GetNotesFromParRow (t) to *tdf_notev1.TdfNote + tdfNote := &tdf_notev1.TdfNote{ + // Populate fields of tdf_notev1.TdfNote from db.GetNotesFromParRow (t) + // aka which fields to return up + Id: t.ID.String(), + ParentId: t.ParentID.String(), + Search: string(t.Search), + TdfBlob: t.TdfBlob, + } + + // Append the newly created TdfNote to the filtered list + filteredTdfObjects = append(filteredTdfObjects, tdfNote) + } + + res := connect.NewResponse(&tdf_notev1.QueryTdfNotesResponse{ + TdfNotes: filteredTdfObjects, + }) + //res.Header().Set("TdfObject-Version", "v1") + res.Header().Set("TdfNotes-Version", "v1") + + return res, nil +} + +func (s *TdfObjectServer) QueryTdfObjects( + ctx context.Context, + req *connect.Request[tdf_objectv1.QueryTdfObjectsRequest], +) (*connect.Response[tdf_objectv1.QueryTdfObjectsResponse], error) { + token := req.Header().Get("Authorization") + entitlements, err := s.getEntitlements(token) + if err != nil { + return nil, err + } + + tdfObjects, err := queryTdfObjectSwitch(ctx, s.DBQueries, req.Msg) + if err != nil { + return nil, err + } + // TODO: additional work is needed here to get the attributes for the TDFs + // filter out TDFs that the user does not have access to + filteredTdfObjects := make([]*tdf_objectv1.TdfObject, 0, len(tdfObjects)) + for _, t := range tdfObjects { + if t.Search == "" { + slog.Warn("Empty search field in DB", "id", t.Id) + filteredTdfObjects = append(filteredTdfObjects, t) + continue + } + // unmarshal the search string into a map + var searchAttributes util.TDFObjectSearchAttributes + if err := json.Unmarshal([]byte(t.Search), &searchAttributes); err != nil { + slog.Error("error unmarshalling search string", slog.String("error", err.Error())) + continue + } + + // remove plaintext from results to reduce risk of leaking sensitive data + canSee, err := util.TrimTDFVisibility(searchAttributes, entitlements) + if err != nil { + slog.Error("error trimming TDF visibility", slog.String("error", err.Error())) + } + if !canSee { + continue + } + + prunedAttributes := map[string]interface{}{ + "attrRelTo": searchAttributes.RelTo, + "attrNeedToKnow": searchAttributes.NeedToKnow, + "attrClassification": searchAttributes.Classification, + } + + prunedJSON, err := json.Marshal(prunedAttributes) + if err != nil { + slog.Error("error re-marshalling pruned attributes", slog.String("error", err.Error())) + t.Search = "{}" + } else { + t.Search = string(prunedJSON) + } + filteredTdfObjects = append(filteredTdfObjects, t) } @@ -219,6 +480,53 @@ func (s *TdfObjectServer) QueryTdfObjects( return res, nil } +func (s *TdfObjectServer) StreamTdfNotes( + ctx context.Context, + req *connect.Request[tdf_notev1.StreamTdfNotesRequest], + stream *connect.ServerStream[tdf_notev1.StreamTdfNotesResponse], +) error { + // generate a unique ID for the client + clientId := uuid.New() + + slog.InfoContext(ctx, "StreamTdfNotes request received", + slog.Any("client_id", clientId.String()), + ) + + slog.InfoContext(ctx, "client connected to StreamTdfObjects", slog.Any("client_id", clientId.String())) + s.ActiveClients.AddNote(clientId.String(), req.Peer(), stream) + + // remove client from activeClients when context is done (aka client disconnects) + go func() { + <-ctx.Done() + slog.InfoContext(ctx, "client disconnected from StreamTdfObjects", slog.Any("client_id", clientId.String())) + s.ActiveClients.Remove(clientId.String()) + }() + + stream.ResponseHeader().Set("TdfObject-Version", "v1") + s.ActiveClients.Emit( + clientId.String(), + tdf_objectv1.StreamEventType_STREAM_EVENT_TYPE_CONNECTED, + "connected on "+time.Now().String(), + ) + + // endless loop to keep the stream open + startTime := time.Now() + for { + // TODO maybe make the sleep time configurable + time.Sleep(1 * time.Second) + + // send heartbeat to client + if int(time.Since(startTime).Seconds())%s.Config.Service.StreamHeartbeatInterval == 0 { + s.ActiveClients.Emit( + clientId.String(), tdf_objectv1.StreamEventType_STREAM_EVENT_TYPE_HEARTBEAT, + "alive:"+time.Since(startTime).String(), + ) + } + // TODO maybe check if we want to force the client to reconnect + // TODO enhance the stream proto to support messages to the client to force a reconnect + } +} + func (s *TdfObjectServer) StreamTdfObjects( ctx context.Context, req *connect.Request[tdf_objectv1.StreamTdfObjectsRequest], diff --git a/common-operating-picture/api/util.go b/common-operating-picture/api/util.go index 2370568..29eb77f 100644 --- a/common-operating-picture/api/util.go +++ b/common-operating-picture/api/util.go @@ -9,6 +9,7 @@ import ( "github.com/jackc/pgx/v5/pgtype" "github.com/mitchellh/mapstructure" geos "github.com/twpayne/go-geos" + tdf_notev1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1" tdf_objectv1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_object/v1" "github.com/virtru-corp/dsp-cop/db" "google.golang.org/protobuf/types/known/structpb" @@ -22,12 +23,26 @@ func prepObjForResponse(in db.TdfObject) *tdf_objectv1.TdfObject { } return &tdf_objectv1.TdfObject{ - Id: in.ID.String(), - Ts: timestamppb.New(in.Ts.Time), - SrcType: in.SrcType, - Geo: geo, - TdfBlob: in.TdfBlob, - TdfUri: in.TdfUri.String, + Id: in.ID.String(), + Ts: timestamppb.New(in.Ts.Time), + SrcType: in.SrcType, + Geo: geo, + Search: string(in.Search), + Metadata: string(in.Metadata), + TdfBlob: in.TdfBlob, + TdfUri: in.TdfUri.String, + } +} + +func prepNoteForResponse(in db.TdfNote) *tdf_notev1.TdfNote { + + return &tdf_notev1.TdfNote{ + Id: in.ID.String(), + Ts: timestamppb.New(in.Ts.Time), + ParentId: in.ParentID.String(), + Search: string(in.Search), + TdfBlob: in.TdfBlob, + TdfUri: in.TdfUri.String, } } @@ -90,11 +105,13 @@ func dbQuerySearchAndGeo(ctx context.Context, query *db.Queries, params db.ListT objs := make([]*tdf_objectv1.TdfObject, 0, len(items)) for _, item := range items { objs = append(objs, prepObjForResponse(db.TdfObject{ - ID: item.ID, - Ts: item.Ts, - SrcType: item.SrcType, - Geo: item.Geo.(*geos.Geom), - TdfBlob: item.TdfBlob, + ID: item.ID, + Ts: item.Ts, + SrcType: item.SrcType, + Geo: item.Geo.(*geos.Geom), + Search: item.Search, + Metadata: item.Metadata, + TdfBlob: item.TdfBlob, })) } return objs, nil @@ -108,11 +125,13 @@ func dbQuerySearch(ctx context.Context, query *db.Queries, params db.ListTdfObje objs := make([]*tdf_objectv1.TdfObject, 0, len(items)) for _, item := range items { objs = append(objs, prepObjForResponse(db.TdfObject{ - ID: item.ID, - Ts: item.Ts, - SrcType: item.SrcType, - Geo: item.Geo.(*geos.Geom), - TdfBlob: item.TdfBlob, + ID: item.ID, + Ts: item.Ts, + SrcType: item.SrcType, + Search: item.Search, + Metadata: item.Metadata, + Geo: item.Geo.(*geos.Geom), + TdfBlob: item.TdfBlob, })) } return objs, nil @@ -126,11 +145,13 @@ func dbQueryGeo(ctx context.Context, query *db.Queries, params db.ListTdfObjects objs := make([]*tdf_objectv1.TdfObject, 0, len(items)) for _, item := range items { objs = append(objs, prepObjForResponse(db.TdfObject{ - ID: item.ID, - Ts: item.Ts, - SrcType: item.SrcType, - Geo: item.Geo.(*geos.Geom), - TdfBlob: item.TdfBlob, + ID: item.ID, + Ts: item.Ts, + SrcType: item.SrcType, + Search: item.Search, + Metadata: item.Metadata, + Geo: item.Geo.(*geos.Geom), + TdfBlob: item.TdfBlob, })) } return objs, nil @@ -144,11 +165,13 @@ func dbQuery(ctx context.Context, query *db.Queries, params db.ListTdfObjectsPar objs := make([]*tdf_objectv1.TdfObject, 0, len(items)) for _, item := range items { objs = append(objs, prepObjForResponse(db.TdfObject{ - ID: item.ID, - Ts: item.Ts, - SrcType: item.SrcType, - Geo: item.Geo.(*geos.Geom), - TdfBlob: item.TdfBlob, + ID: item.ID, + Ts: item.Ts, + SrcType: item.SrcType, + Search: item.Search, + Metadata: item.Metadata, + Geo: item.Geo.(*geos.Geom), + TdfBlob: item.TdfBlob, })) } return objs, nil @@ -167,10 +190,10 @@ type dbSrcTypeMetadata struct { Details []string `json:"details,omitempty"` } `json:"displayFields,omitempty"` MapFields struct { - IconDefault string `json:"iconDefault"` - IconConfig []dbSrcTypeMapFieldConfig `json:"iconConfig,omitempty"` - ColorDefault string `json:"colorDefault"` - ColorConfig []dbSrcTypeMapFieldConfig `json:"colorConfig,omitempty"` + IconDefault string `json:"iconDefault"` + IconConfig []dbSrcTypeMapFieldConfig `json:"iconConfig,omitempty"` + ColorDefault string `json:"colorDefault"` + ColorConfig []dbSrcTypeMapFieldConfig `json:"colorConfig,omitempty"` } `json:"mapFields,omitempty"` } @@ -251,7 +274,7 @@ func dbQuerySrcType(ctx context.Context, query *db.Queries, srcTypeId string) (* var colorConfigs []*tdf_objectv1.SrcTypeMetadataMapFieldConfig for _, v := range metadata.MapFields.ColorConfig { colorConfigs = append(colorConfigs, &tdf_objectv1.SrcTypeMetadataMapFieldConfig{ - Field: v.Field, + Field: v.Field, ValueMap: v.ValueMap, }) } @@ -259,12 +282,11 @@ func dbQuerySrcType(ctx context.Context, query *db.Queries, srcTypeId string) (* var iconConfigs []*tdf_objectv1.SrcTypeMetadataMapFieldConfig for _, v := range metadata.MapFields.IconConfig { iconConfigs = append(iconConfigs, &tdf_objectv1.SrcTypeMetadataMapFieldConfig{ - Field: v.Field, + Field: v.Field, ValueMap: v.ValueMap, }) } - protoSrcType := &tdf_objectv1.SrcType{ Id: srcType.ID, FormSchema: formSchemaStruct, @@ -279,10 +301,10 @@ func dbQuerySrcType(ctx context.Context, query *db.Queries, srcTypeId string) (* Details: metadata.DisplayFields.Details, }, MapFields: &tdf_objectv1.SrcTypeMetadataMapFields{ - IconDefault: metadata.MapFields.IconDefault, - IconConfig: iconConfigs, + IconDefault: metadata.MapFields.IconDefault, + IconConfig: iconConfigs, ColorDefault: metadata.MapFields.ColorDefault, - ColorConfig: colorConfigs, + ColorConfig: colorConfigs, }, }, } diff --git a/common-operating-picture/charts/assets/schema.sql b/common-operating-picture/charts/assets/schema.sql deleted file mode 120000 index c3e2f96..0000000 --- a/common-operating-picture/charts/assets/schema.sql +++ /dev/null @@ -1 +0,0 @@ -../../db/schema.sql \ No newline at end of file diff --git a/common-operating-picture/charts/assets/seed.sql b/common-operating-picture/charts/assets/seed.sql deleted file mode 120000 index 71d49d4..0000000 --- a/common-operating-picture/charts/assets/seed.sql +++ /dev/null @@ -1 +0,0 @@ -../../db/seed.sql \ No newline at end of file diff --git a/common-operating-picture/cmd/startCmd.go b/common-operating-picture/cmd/startCmd.go index 8a748f9..1c652c7 100644 --- a/common-operating-picture/cmd/startCmd.go +++ b/common-operating-picture/cmd/startCmd.go @@ -1,6 +1,8 @@ package cmd import ( + "log/slog" + "github.com/spf13/cobra" "github.com/virtru-corp/dsp-cop/api" ) @@ -12,6 +14,8 @@ var ( Short: "Start the DSP COP server", Long: "Start the Virtru Data Security Platform COP server", Run: func(cmd *cobra.Command, args []string) { + slog.Info("Starting the DSP COP Server") + server := api.NewCopServer(cfg, staticDir) server.Start() defer server.Stop() diff --git a/common-operating-picture/compose/docker-compose.cop-db.yaml b/common-operating-picture/compose/docker-compose.cop-db.yaml index fd740d4..620cd5d 100644 --- a/common-operating-picture/compose/docker-compose.cop-db.yaml +++ b/common-operating-picture/compose/docker-compose.cop-db.yaml @@ -21,7 +21,6 @@ services: start_period: 20s ports: - 15432:5432 - #- 15433:5432 #================================================================ # Setup the COP database @@ -31,6 +30,7 @@ services: # https://github.com/ImreSamu/docker-postgis#debian---bookworm--recommended # Switching the docker runtime to x86_64 arch will break the Keycloak image, which stopped supporting that architecture in version 20. image: imresamu/postgis:16-3.4 + restart: on-failure user: postgres command: | bash -c ' \ diff --git a/common-operating-picture/compose/docker-compose.cop-web-server.yaml b/common-operating-picture/compose/docker-compose.cop-web-server.yaml index cb521e2..9ec1e3b 100644 --- a/common-operating-picture/compose/docker-compose.cop-web-server.yaml +++ b/common-operating-picture/compose/docker-compose.cop-web-server.yaml @@ -1,10 +1,11 @@ services: cop-web-server: - build: + build: context: ../ dockerfile: ./cop.Dockerfile image: virtru-dsp-cop-web-server:dev + restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: changeme @@ -18,7 +19,7 @@ services: VITE_DSP_KC_DIRECT_AUTH: false VITE_FORM_SUBMIT_NANO_TDF: true volumes: - - ../config.docker.yaml:/etc/dsp-cop/config.yaml + - ../config.yaml:/etc/dsp-cop/config.yaml - ../dsp-keys/rootCA.pem:/etc/ssl/certs/ca-certificates.crt - ../dsp-keys/local-dsp.virtru.com.pem:/dsp-keys/local-dsp.virtru.com.pem - ../dsp-keys/local-dsp.virtru.com.key.pem:/dsp-keys/local-dsp.virtru.com.key.pem @@ -32,4 +33,5 @@ services: condition: service_healthy restart: true extra_hosts: - - "local-dsp.virtru.com:host-gateway" #host and ip + - "local-dsp.virtru.com:172.17.0.1" #host and ip + #- "host.docker.internal:host-gateway" diff --git a/common-operating-picture/compose/docker-compose.dsp.yaml b/common-operating-picture/compose/docker-compose.dsp.yaml index dea719e..7705987 100644 --- a/common-operating-picture/compose/docker-compose.dsp.yaml +++ b/common-operating-picture/compose/docker-compose.dsp.yaml @@ -70,7 +70,10 @@ services: restart: true healthcheck: test: - ['CMD-SHELL', 'curl -fkSs --max-time 5 https://local-dsp.virtru.com:8080/healthz >/dev/null || exit 1'] + [ + 'CMD-SHELL', + 'curl -fkSs --max-time 5 https://local-dsp.virtru.com:8080/healthz >/dev/null || exit 1', + ] interval: 60s timeout: 10s retries: 10 diff --git a/common-operating-picture/compose/docker-compose.keycloak.yaml b/common-operating-picture/compose/docker-compose.keycloak.yaml index a636346..d9cf6ce 100644 --- a/common-operating-picture/compose/docker-compose.keycloak.yaml +++ b/common-operating-picture/compose/docker-compose.keycloak.yaml @@ -4,7 +4,6 @@ services: #---------------------------------------------------------------- keycloak: # This is kc 24.0.1 with opentdf protocol mapper on board - #image: us-docker.pkg.dev/prj-infra-automation-ktbz/remote-proxy-dockerhub/keycloak/keycloak:24.0.5 #Access Denied, Requires Creds image: keycloak/keycloak:25.0 restart: always command: ['start-dev'] @@ -50,4 +49,4 @@ services: # - ../dsp-keys/local-dsp.virtru.com.truststore.jks:/etc/x509/https/local-dsp.virtru.com.truststore.jks ### END x509/PKI Authentication network_mode: host - + diff --git a/common-operating-picture/compose/docker-compose.tagging.yaml b/common-operating-picture/compose/docker-compose.tagging.yaml index fec34dc..dfa7e89 100644 --- a/common-operating-picture/compose/docker-compose.tagging.yaml +++ b/common-operating-picture/compose/docker-compose.tagging.yaml @@ -8,11 +8,6 @@ services: tagging: image: ${TAGGING_IMAGE} restart: on-failure -# Not sure why the below works sometimes and not others...esp with a secondary docker compose up after initial start -# depends_on: -# dsp: -# condition: service_healthy -# restart: true ports: - "9001:8080" @@ -28,7 +23,7 @@ services: - TAGGINGPDP_ADDITIONAL_TRUSTED_CERT_DIR=/tagging-pdp/truststore - TAGGINGPDP_AUTH_ENABLED=false volumes: - - ../sample.tagging.yaml/:/tagging-pdp/config/tagging_config.yaml + - ../fed-config.go.yaml/:/tagging-pdp/config/tagging_config.yaml - ../truststore:/tagging-pdp/truststore # mounts truststore extra_hosts: - "local-dsp.virtru.com:172.17.0.1" #host and ip \ No newline at end of file diff --git a/common-operating-picture/config.example.yaml b/common-operating-picture/config.example.yaml index 8e77549..59c57eb 100644 --- a/common-operating-picture/config.example.yaml +++ b/common-operating-picture/config.example.yaml @@ -40,11 +40,8 @@ log_level: INFO # Service configuration service: # The public hosts for use in the web UI when the server is behind a reverse proxy - public_server_host: https://local-dsp.virtru.com:5002 - public_static_host: https://local-dsp.virtru.com:5001 - #public_server_host: local-dsp.virtru.com:5002 - #public_static_host: local-dsp.virtru.com:5001 - + public_server_host: local-dsp.virtru.com:5002 + public_static_host: local-dsp.virtru.com:5001 # gRPC config grpc_port: 5002 @@ -71,4 +68,4 @@ ui: tile_server_url: https://tile.openstreetmap.org/{z}/{x}/{y}.png # Override TDF3/ZTDF default and encrypt submitted forms as NanoTDFs - form_submit_nano_tdf: true + form_submit_nano_tdf: true \ No newline at end of file diff --git a/common-operating-picture/config.yaml b/common-operating-picture/config.yaml new file mode 100644 index 0000000..01429e1 --- /dev/null +++ b/common-operating-picture/config.yaml @@ -0,0 +1,70 @@ +# __ ___ _ _____ _____ _____ _____ ____ _____ +# \ \ / (_) | | | __ \ / ____| __ \ / ____/ __ \| __ \ +# \ \ / / _ _ __| |_ _ __ _ _ | | | | (___ | |__) | | | | | | | |__) | +# \ \/ / | | '__| __| '__| | | | | | | |\___ \| ___/ | | | | | | ___/ +# \ / | | | | |_| | | |_| | | |__| |____) | | | |___| |__| | | +# \/ |_|_| \__|_| \__,_| |_____/|_____/|_| \_____\____/|_| + +############################################ +# Required +############################################ + +# The URL of the database to connect to (e.g. postgres://user:password@host:port/database) +# https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING +# Pool settings https://pkg.go.dev/github.com/jackc/pgx/v5@v5.5.5/pgxpool#ParseConfig +db_url: postgres://postgres:changeme@local-dsp.virtru.com:15432/postgres +## DSP platform endpoint +platform_endpoint: https://local-dsp.virtru.com:8080 + +## Used to identify the OIDC client for the server which uses the client credentials flow +oidc_client_id_for_server: dsp-cop +oidc_client_secret_for_server: 12345678-1234-1234-1234-123456789012 + +## Used to identify the OIDC client for the Web UI which uses the password flow +oidc_client_id_for_web_password_flow: dsp-cop-client + +## Used to identify KAS URL in the Web UI will be replaced by DSP well-known endpoint +deprecated_kas_url: https://local-dsp.virtru.com:8080/kas + +## Used to connect to the IdP within the Web UI will be replaced by DSP well-known endpoint +deprecated_idp_url: https://local-dsp.virtru.com:8443/auth/realms/opentdf + +############################################ +# Optional +############################################ + +# The log level to use (e.g. DEBUG, INFO, WARNING, ERROR, CRITICAL) +log_level: INFO + +# Service configuration +service: + # The public hosts for use in the web UI when the server is behind a reverse proxy + public_server_host: https://local-dsp.virtru.com:5002 + public_static_host: https://local-dsp.virtru.com:5001 + + # gRPC config + grpc_port: 5002 + grpc_write_timeout: 60 + grpc_read_timeout: 60 + + # Static config + static_port: 5001 + static_write_timeout: 60 + static_read_timeout: 60 + + # CORS config + # This should be set to the origin of the web UI + cors_origin: "*" # Allow all origins for development + + # TLS + tls: + enabled: true + key_file: dsp-keys/local-dsp.virtru.com.key.pem + cert_file: dsp-keys/local-dsp.virtru.com.pem + +ui: + # Tile server URL for the map + tile_server_url: https://tile.openstreetmap.org/{z}/{x}/{y}.png + +# Override TDF3/ZTDF default and encrypt submitted forms as NanoTDFs + form_submit_nano_tdf: true diff --git a/common-operating-picture/cop.Dockerfile b/common-operating-picture/cop.Dockerfile index aadb57a..823f72b 100644 --- a/common-operating-picture/cop.Dockerfile +++ b/common-operating-picture/cop.Dockerfile @@ -1,7 +1,6 @@ # check=skip=SecretsUsedInArgOrEnv # Node 22.2.0 -FROM cgr.dev/chainguard/node@sha256:c9f5d50b07504754da0140e0dc0a39c7ab9b55cf35dff827ff6d0876d054e7e7 AS ui-builder - +FROM node:22-alpine AS ui-builder # Define frontend Vite build args and read them in from the environment ARG VITE_TILE_SERVER_URL ARG VITE_GRPC_SERVER_URL @@ -12,6 +11,7 @@ ARG VITE_DSP_KC_CLIENT_ID ARG VITE_DSP_KC_DIRECT_AUTH ENV VITE_TILE_SERVER_URL=$VITE_TILE_SERVER_URL +#ENV VITE_GRPC_SERVER_URL=https://local-dsp.virtru.com:5002 ENV VITE_GRPC_SERVER_URL=$VITE_GRPC_SERVER_URL ENV VITE_DSP_BASE_URL=$VITE_DSP_BASE_URL ENV VITE_DSP_KAS_URL=$VITE_DSP_KAS_URL @@ -30,7 +30,7 @@ RUN npm run build # Geos builder libgeos-dev FROM cgr.dev/chainguard/wolfi-base@sha256:c519d1c81a18a5c752f701bc59ceddfa4bf1a44e9bb605c73856cef216f69f7b AS geos-builder -RUN apk add --no-cache geos=3.13.1-r3 geos-dev=3.13.1-r3 +RUN apk add --no-cache geos geos-dev # Go 1.24.2 FROM cgr.dev/chainguard/go@sha256:dc53da3597aa89079c0bd3f402738bf910f2aa635f23d42f29b7e534a61e8149 AS go-setup @@ -71,6 +71,8 @@ COPY --from=geos-builder /usr/include/geos_c.h /usr/include/ COPY --from=geos-builder /usr/include/geos.h /usr/include/ COPY --from=geos-builder /usr/lib/pkgconfig/geos.pc /usr/lib/pkgconfig/geos.pc +COPY --from=builder /app /app + COPY --from=builder /app/dsp-cop /usr/bin/ ENTRYPOINT ["/usr/bin/dsp-cop", "serve"] diff --git a/common-operating-picture/db/batch.go b/common-operating-picture/db/batch.go index 7d58257..b5d177a 100644 --- a/common-operating-picture/db/batch.go +++ b/common-operating-picture/db/batch.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.26.0 +// sqlc v1.30.0 // source: batch.go package db @@ -19,9 +19,73 @@ var ( ErrBatchAlreadyClosed = errors.New("batch already closed") ) +const createNoteObject = `-- name: CreateNoteObject :batchone +INSERT INTO tdf_notes (ts, parent_id, search, tdf_blob, tdf_uri) +VALUES ($1, $2, $3, $4, $5) +RETURNING id +` + +type CreateNoteObjectBatchResults struct { + br pgx.BatchResults + tot int + closed bool +} + +type CreateNoteObjectParams struct { + Ts pgtype.Timestamp `json:"ts"` + ParentID uuid.UUID `json:"parent_id"` + Search []byte `json:"search"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` +} + +// CreateNoteObject +// +// INSERT INTO tdf_notes (ts, parent_id, search, tdf_blob, tdf_uri) +// VALUES ($1, $2, $3, $4, $5) +// RETURNING id +func (q *Queries) CreateNoteObject(ctx context.Context, arg []CreateNoteObjectParams) *CreateNoteObjectBatchResults { + batch := &pgx.Batch{} + for _, a := range arg { + vals := []interface{}{ + a.Ts, + a.ParentID, + a.Search, + a.TdfBlob, + a.TdfUri, + } + batch.Queue(createNoteObject, vals...) + } + br := q.db.SendBatch(ctx, batch) + return &CreateNoteObjectBatchResults{br, len(arg), false} +} + +func (b *CreateNoteObjectBatchResults) QueryRow(f func(int, uuid.UUID, error)) { + defer b.br.Close() + for t := 0; t < b.tot; t++ { + var id uuid.UUID + if b.closed { + if f != nil { + f(t, id, ErrBatchAlreadyClosed) + } + continue + } + row := b.br.QueryRow() + err := row.Scan(&id) + if f != nil { + f(t, id, err) + } + } +} + +func (b *CreateNoteObjectBatchResults) Close() error { + b.closed = true + return b.br.Close() +} + const createTdfObjects = `-- name: CreateTdfObjects :batchone -INSERT INTO tdf_objects (ts, src_type, geo, search, tdf_blob, tdf_uri) -VALUES ($1, $2, $3, $4, $5, $6) +INSERT INTO tdf_objects (ts, src_type, geo, search, metadata, tdf_blob, tdf_uri) +VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id ` @@ -32,18 +96,19 @@ type CreateTdfObjectsBatchResults struct { } type CreateTdfObjectsParams struct { - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo *geos.Geom `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo *geos.Geom `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // CreateTdfObjects // -// INSERT INTO tdf_objects (ts, src_type, geo, search, tdf_blob, tdf_uri) -// VALUES ($1, $2, $3, $4, $5, $6) +// INSERT INTO tdf_objects (ts, src_type, geo, search, metadata, tdf_blob, tdf_uri) +// VALUES ($1, $2, $3, $4, $5, $6, $7) // RETURNING id func (q *Queries) CreateTdfObjects(ctx context.Context, arg []CreateTdfObjectsParams) *CreateTdfObjectsBatchResults { batch := &pgx.Batch{} @@ -53,6 +118,7 @@ func (q *Queries) CreateTdfObjects(ctx context.Context, arg []CreateTdfObjectsPa a.SrcType, a.Geo, a.Search, + a.Metadata, a.TdfBlob, a.TdfUri, } diff --git a/common-operating-picture/db/db.go b/common-operating-picture/db/db.go index 3475e3e..696f228 100644 --- a/common-operating-picture/db/db.go +++ b/common-operating-picture/db/db.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.26.0 +// sqlc v1.30.0 package db diff --git a/common-operating-picture/db/entityRelationshipDiagram.md b/common-operating-picture/db/entityRelationshipDiagram.md index c293d04..ba05e3f 100644 --- a/common-operating-picture/db/entityRelationshipDiagram.md +++ b/common-operating-picture/db/entityRelationshipDiagram.md @@ -8,6 +8,7 @@ erDiagram TEXT src_type "source type of the data, loosely coupled to src_types.id" GEOMETRY geo "geospatial data" JSONB search "plaintext json search index" + JSONB metadata "plaintext json metadata index" BYTEA tdf_blob "tdf data blob" TEXT tdf_uri "tdf data uri" TIMESTAMP _created_at "timestamp of creation" diff --git a/common-operating-picture/db/models.go b/common-operating-picture/db/models.go index c4375e7..adb0955 100644 --- a/common-operating-picture/db/models.go +++ b/common-operating-picture/db/models.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.26.0 +// sqlc v1.30.0 package db @@ -17,6 +17,24 @@ type SrcType struct { Metadata []byte `json:"metadata"` } +// stream of tdf data +type TdfNote struct { + // uuid primary key generated by the database + ID uuid.UUID `json:"id"` + // timestamp generated by the database + Ts pgtype.Timestamp `json:"ts"` + // foreign key, corresponds to primary key id of tdf_objects entry + ParentID uuid.UUID `json:"parent_id"` + // plaintext json search index + Search []byte `json:"search"` + // tdf data blob + TdfBlob []byte `json:"tdf_blob"` + // tdf data uri + TdfUri pgtype.Text `json:"tdf_uri"` + CreatedAt pgtype.Timestamp `json:"_created_at"` + CreatedBy pgtype.Text `json:"_created_by"` +} + // stream of tdf data type TdfObject struct { // uuid primary key generated by the database @@ -29,6 +47,8 @@ type TdfObject struct { Geo *geos.Geom `json:"geo"` // plaintext json search index Search []byte `json:"search"` + // plaintext metadata json index + Metadata []byte `json:"metadata"` // tdf data blob TdfBlob []byte `json:"tdf_blob"` // tdf data uri diff --git a/common-operating-picture/db/query.sql b/common-operating-picture/db/query.sql index 79c75cb..19367e7 100644 --- a/common-operating-picture/db/query.sql +++ b/common-operating-picture/db/query.sql @@ -1,16 +1,17 @@ -- name: CreateTdfObjects :batchone -INSERT INTO tdf_objects (ts, src_type, geo, search, tdf_blob, tdf_uri) -VALUES ($1, $2, $3, $4, $5, $6) +INSERT INTO tdf_objects (ts, src_type, geo, search, metadata, tdf_blob, tdf_uri) +VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id; -- name: UpdateTdfObject :one UPDATE tdf_objects -SET ts = $2, - src_type = $3, - geo = $4, - search = $5, - tdf_blob = $6, - tdf_uri = $7 +SET ts = COALESCE(sqlc.narg('ts'), ts), + src_type = COALESCE(sqlc.narg('src_type'), src_type), + geo = COALESCE(sqlc.narg('geo'), geo), + search = COALESCE(sqlc.narg('search'), search), + metadata = COALESCE(sqlc.narg('metadata'), metadata), + tdf_blob = COALESCE(sqlc.narg('tdf_blob'), tdf_blob), + tdf_uri = COALESCE(sqlc.narg('tdf_uri'), tdf_uri) WHERE id = $1 RETURNING id, src_type, ts; @@ -20,34 +21,41 @@ WHERE id = $1 RETURNING *; -- name: GetTdfObject :one -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri -FROM tdf_objects +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri +FROM tdf_objects WHERE id = $1 LIMIT 1; -- name: ListTdfObjects :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = sqlc.arg('SourceType')::TEXT AND ts >= sqlc.arg('StartTime')::TIMESTAMP AND ts <= sqlc.arg('EndTime')::TIMESTAMP ORDER BY ts DESC; -- name: ListTdfObjectsWithGeo :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = sqlc.arg('SourceType')::TEXT AND ts >= sqlc.arg('StartTime')::TIMESTAMP AND ts <= sqlc.arg('EndTime')::TIMESTAMP AND ST_Within(geo, sqlc.arg('Geometry')::GEOMETRY) ORDER BY ts DESC; -- name: ListTdfObjectsWithSearch :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = sqlc.arg('SourceType')::TEXT AND ts >= sqlc.arg('StartTime')::TIMESTAMP AND ts <= sqlc.arg('EndTime')::TIMESTAMP AND search @> sqlc.arg('Search')::JSONB ORDER BY ts DESC; +-- name: ListTdfObjectsWithMetadata :many +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri +FROM tdf_objects +WHERE src_type = sqlc.arg('SourceType')::TEXT AND ts >= sqlc.arg('StartTime')::TIMESTAMP AND ts <= sqlc.arg('EndTime')::TIMESTAMP + AND metadata @> sqlc.arg('Metadata')::JSONB +ORDER BY ts DESC; + -- name: ListTdfObjectsWithSearchAndGeo :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = sqlc.arg('SourceType')::TEXT AND ts >= sqlc.arg('StartTime')::TIMESTAMP AND ts <= sqlc.arg('EndTime')::TIMESTAMP AND search @> sqlc.arg('Search')::JSONB @@ -59,6 +67,27 @@ SELECT id, form_schema, ui_schema, metadata FROM src_types WHERE id = $1; +-- name: GetNotesFromPar :many +SELECT id, ts, parent_id, search, tdf_blob, tdf_uri +FROM tdf_notes +WHERE parent_id = $1; + -- name: ListSrcTypes :many SELECT id FROM src_types; + +-- name: getNotesByParent :many +SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +FROM tdf_notes +WHERE parent_id = $1 +ORDER BY ts DESC; + +-- name: GetNoteByID :one +SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +FROM tdf_notes +where id = $1; + +-- name: CreateNoteObject :batchone +INSERT INTO tdf_notes (ts, parent_id, search, tdf_blob, tdf_uri) +VALUES ($1, $2, $3, $4, $5) +RETURNING id; diff --git a/common-operating-picture/db/query.sql.go b/common-operating-picture/db/query.sql.go index 9a3321e..bff30c8 100644 --- a/common-operating-picture/db/query.sql.go +++ b/common-operating-picture/db/query.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.26.0 +// sqlc v1.30.0 // source: query.sql package db @@ -16,14 +16,14 @@ import ( const deleteTdfObject = `-- name: DeleteTdfObject :one DELETE FROM tdf_objects WHERE id = $1 -RETURNING id, ts, src_type, geo, search, tdf_blob, tdf_uri, _created_at, _created_by +RETURNING id, ts, src_type, geo, search, metadata, tdf_blob, tdf_uri, _created_at, _created_by ` // DeleteTdfObject // // DELETE FROM tdf_objects // WHERE id = $1 -// RETURNING id, ts, src_type, geo, search, tdf_blob, tdf_uri, _created_at, _created_by +// RETURNING id, ts, src_type, geo, search, metadata, tdf_blob, tdf_uri, _created_at, _created_by func (q *Queries) DeleteTdfObject(ctx context.Context, id uuid.UUID) (TdfObject, error) { row := q.db.QueryRow(ctx, deleteTdfObject, id) var i TdfObject @@ -33,6 +33,7 @@ func (q *Queries) DeleteTdfObject(ctx context.Context, id uuid.UUID) (TdfObject, &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, &i.CreatedAt, @@ -41,6 +42,87 @@ func (q *Queries) DeleteTdfObject(ctx context.Context, id uuid.UUID) (TdfObject, return i, err } +const getNoteByID = `-- name: GetNoteByID :one +SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +FROM tdf_notes +where id = $1 +` + +type GetNoteByIDRow struct { + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + ParentID uuid.UUID `json:"parent_id"` + TdfBlob []byte `json:"tdf_blob"` + Search []byte `json:"search"` + TdfUri pgtype.Text `json:"tdf_uri"` +} + +// GetNoteByID +// +// SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +// FROM tdf_notes +// where id = $1 +func (q *Queries) GetNoteByID(ctx context.Context, id uuid.UUID) (GetNoteByIDRow, error) { + row := q.db.QueryRow(ctx, getNoteByID, id) + var i GetNoteByIDRow + err := row.Scan( + &i.ID, + &i.Ts, + &i.ParentID, + &i.TdfBlob, + &i.Search, + &i.TdfUri, + ) + return i, err +} + +const getNotesFromPar = `-- name: GetNotesFromPar :many +SELECT id, ts, parent_id, search, tdf_blob, tdf_uri +FROM tdf_notes +WHERE parent_id = $1 +` + +type GetNotesFromParRow struct { + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + ParentID uuid.UUID `json:"parent_id"` + Search []byte `json:"search"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` +} + +// GetNotesFromPar +// +// SELECT id, ts, parent_id, search, tdf_blob, tdf_uri +// FROM tdf_notes +// WHERE parent_id = $1 +func (q *Queries) GetNotesFromPar(ctx context.Context, parentID uuid.UUID) ([]GetNotesFromParRow, error) { + rows, err := q.db.Query(ctx, getNotesFromPar, parentID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetNotesFromParRow + for rows.Next() { + var i GetNotesFromParRow + if err := rows.Scan( + &i.ID, + &i.Ts, + &i.ParentID, + &i.Search, + &i.TdfBlob, + &i.TdfUri, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getSrcType = `-- name: GetSrcType :one SELECT id, form_schema, ui_schema, metadata FROM src_types @@ -65,26 +147,27 @@ func (q *Queries) GetSrcType(ctx context.Context, id string) (SrcType, error) { } const getTdfObject = `-- name: GetTdfObject :one -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri -FROM tdf_objects +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri +FROM tdf_objects WHERE id = $1 LIMIT 1 ` type GetTdfObjectRow struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo interface{} `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // GetTdfObject // -// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri // FROM tdf_objects // WHERE // id = $1 @@ -98,6 +181,7 @@ func (q *Queries) GetTdfObject(ctx context.Context, id uuid.UUID) (GetTdfObjectR &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, ) @@ -134,7 +218,7 @@ func (q *Queries) ListSrcTypes(ctx context.Context) ([]string, error) { } const listTdfObjects = `-- name: ListTdfObjects :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP ORDER BY ts DESC @@ -147,18 +231,19 @@ type ListTdfObjectsParams struct { } type ListTdfObjectsRow struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo interface{} `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // ListTdfObjects // -// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri // FROM tdf_objects // WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP // ORDER BY ts DESC @@ -177,6 +262,7 @@ func (q *Queries) ListTdfObjects(ctx context.Context, arg ListTdfObjectsParams) &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, ); err != nil { @@ -191,7 +277,7 @@ func (q *Queries) ListTdfObjects(ctx context.Context, arg ListTdfObjectsParams) } const listTdfObjectsWithGeo = `-- name: ListTdfObjectsWithGeo :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP AND ST_Within(geo, $4::GEOMETRY) @@ -206,18 +292,19 @@ type ListTdfObjectsWithGeoParams struct { } type ListTdfObjectsWithGeoRow struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo interface{} `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // ListTdfObjectsWithGeo // -// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri // FROM tdf_objects // WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP // AND ST_Within(geo, $4::GEOMETRY) @@ -242,6 +329,74 @@ func (q *Queries) ListTdfObjectsWithGeo(ctx context.Context, arg ListTdfObjectsW &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, + &i.TdfBlob, + &i.TdfUri, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listTdfObjectsWithMetadata = `-- name: ListTdfObjectsWithMetadata :many +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri +FROM tdf_objects +WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP + AND metadata @> $4::JSONB +ORDER BY ts DESC +` + +type ListTdfObjectsWithMetadataParams struct { + SourceType string `json:"source_type"` + StartTime pgtype.Timestamp `json:"start_time"` + EndTime pgtype.Timestamp `json:"end_time"` + Metadata []byte `json:"metadata"` +} + +type ListTdfObjectsWithMetadataRow struct { + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` +} + +// ListTdfObjectsWithMetadata +// +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri +// FROM tdf_objects +// WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP +// AND metadata @> $4::JSONB +// ORDER BY ts DESC +func (q *Queries) ListTdfObjectsWithMetadata(ctx context.Context, arg ListTdfObjectsWithMetadataParams) ([]ListTdfObjectsWithMetadataRow, error) { + rows, err := q.db.Query(ctx, listTdfObjectsWithMetadata, + arg.SourceType, + arg.StartTime, + arg.EndTime, + arg.Metadata, + ) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListTdfObjectsWithMetadataRow + for rows.Next() { + var i ListTdfObjectsWithMetadataRow + if err := rows.Scan( + &i.ID, + &i.Ts, + &i.SrcType, + &i.Geo, + &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, ); err != nil { @@ -256,7 +411,7 @@ func (q *Queries) ListTdfObjectsWithGeo(ctx context.Context, arg ListTdfObjectsW } const listTdfObjectsWithSearch = `-- name: ListTdfObjectsWithSearch :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP AND search @> $4::JSONB @@ -271,18 +426,19 @@ type ListTdfObjectsWithSearchParams struct { } type ListTdfObjectsWithSearchRow struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo interface{} `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // ListTdfObjectsWithSearch // -// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri // FROM tdf_objects // WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP // AND search @> $4::JSONB @@ -307,6 +463,7 @@ func (q *Queries) ListTdfObjectsWithSearch(ctx context.Context, arg ListTdfObjec &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, ); err != nil { @@ -321,7 +478,7 @@ func (q *Queries) ListTdfObjectsWithSearch(ctx context.Context, arg ListTdfObjec } const listTdfObjectsWithSearchAndGeo = `-- name: ListTdfObjectsWithSearchAndGeo :many -SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri FROM tdf_objects WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP AND search @> $4::JSONB @@ -338,18 +495,19 @@ type ListTdfObjectsWithSearchAndGeoParams struct { } type ListTdfObjectsWithSearchAndGeoRow struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo interface{} `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType string `json:"src_type"` + Geo interface{} `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } // ListTdfObjectsWithSearchAndGeo // -// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, tdf_blob, tdf_uri +// SELECT id, ts, src_type, ST_Centroid(geo)::GEOMETRY AS geo, search, metadata, tdf_blob, tdf_uri // FROM tdf_objects // WHERE src_type = $1::TEXT AND ts >= $2::TIMESTAMP AND ts <= $3::TIMESTAMP // AND search @> $4::JSONB @@ -376,6 +534,7 @@ func (q *Queries) ListTdfObjectsWithSearchAndGeo(ctx context.Context, arg ListTd &i.SrcType, &i.Geo, &i.Search, + &i.Metadata, &i.TdfBlob, &i.TdfUri, ); err != nil { @@ -391,24 +550,26 @@ func (q *Queries) ListTdfObjectsWithSearchAndGeo(ctx context.Context, arg ListTd const updateTdfObject = `-- name: UpdateTdfObject :one UPDATE tdf_objects -SET ts = $2, - src_type = $3, - geo = $4, - search = $5, - tdf_blob = $6, - tdf_uri = $7 +SET ts = COALESCE($2, ts), + src_type = COALESCE($3, src_type), + geo = COALESCE($4, geo), + search = COALESCE($5, search), + metadata = COALESCE($6, metadata), + tdf_blob = COALESCE($7, tdf_blob), + tdf_uri = COALESCE($8, tdf_uri) WHERE id = $1 RETURNING id, src_type, ts ` type UpdateTdfObjectParams struct { - ID uuid.UUID `json:"id"` - Ts pgtype.Timestamp `json:"ts"` - SrcType string `json:"src_type"` - Geo *geos.Geom `json:"geo"` - Search []byte `json:"search"` - TdfBlob []byte `json:"tdf_blob"` - TdfUri pgtype.Text `json:"tdf_uri"` + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + SrcType pgtype.Text `json:"src_type"` + Geo *geos.Geom `json:"geo"` + Search []byte `json:"search"` + Metadata []byte `json:"metadata"` + TdfBlob []byte `json:"tdf_blob"` + TdfUri pgtype.Text `json:"tdf_uri"` } type UpdateTdfObjectRow struct { @@ -420,12 +581,13 @@ type UpdateTdfObjectRow struct { // UpdateTdfObject // // UPDATE tdf_objects -// SET ts = $2, -// src_type = $3, -// geo = $4, -// search = $5, -// tdf_blob = $6, -// tdf_uri = $7 +// SET ts = COALESCE($2, ts), +// src_type = COALESCE($3, src_type), +// geo = COALESCE($4, geo), +// search = COALESCE($5, search), +// metadata = COALESCE($6, metadata), +// tdf_blob = COALESCE($7, tdf_blob), +// tdf_uri = COALESCE($8, tdf_uri) // WHERE id = $1 // RETURNING id, src_type, ts func (q *Queries) UpdateTdfObject(ctx context.Context, arg UpdateTdfObjectParams) (UpdateTdfObjectRow, error) { @@ -435,6 +597,7 @@ func (q *Queries) UpdateTdfObject(ctx context.Context, arg UpdateTdfObjectParams arg.SrcType, arg.Geo, arg.Search, + arg.Metadata, arg.TdfBlob, arg.TdfUri, ) @@ -442,3 +605,52 @@ func (q *Queries) UpdateTdfObject(ctx context.Context, arg UpdateTdfObjectParams err := row.Scan(&i.ID, &i.SrcType, &i.Ts) return i, err } + +const getNotesByParent = `-- name: getNotesByParent :many +SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +FROM tdf_notes +WHERE parent_id = $1 +ORDER BY ts DESC +` + +type getNotesByParentRow struct { + ID uuid.UUID `json:"id"` + Ts pgtype.Timestamp `json:"ts"` + ParentID uuid.UUID `json:"parent_id"` + TdfBlob []byte `json:"tdf_blob"` + Search []byte `json:"search"` + TdfUri pgtype.Text `json:"tdf_uri"` +} + +// getNotesByParent +// +// SELECT id, ts, parent_id, tdf_blob, search, tdf_uri +// FROM tdf_notes +// WHERE parent_id = $1 +// ORDER BY ts DESC +func (q *Queries) getNotesByParent(ctx context.Context, parentID uuid.UUID) ([]getNotesByParentRow, error) { + rows, err := q.db.Query(ctx, getNotesByParent, parentID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []getNotesByParentRow + for rows.Next() { + var i getNotesByParentRow + if err := rows.Scan( + &i.ID, + &i.Ts, + &i.ParentID, + &i.TdfBlob, + &i.Search, + &i.TdfUri, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/common-operating-picture/db/schema.sql b/common-operating-picture/db/schema.sql index 918799f..edba3a9 100644 --- a/common-operating-picture/db/schema.sql +++ b/common-operating-picture/db/schema.sql @@ -25,6 +25,7 @@ CREATE TABLE IF NOT EXISTS tdf_objects ( src_type TEXT NOT NULL, geo GEOMETRY NULL, search JSONB NULL, + metadata JSONB NULL, tdf_blob BYTEA NULL, tdf_uri TEXT NULL, _created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, @@ -37,6 +38,7 @@ COMMENT ON COLUMN tdf_objects.ts IS 'timestamp generated by the database'; COMMENT ON COLUMN tdf_objects.src_type IS 'source type of the data'; COMMENT ON COLUMN tdf_objects.geo IS 'geospatial data'; COMMENT ON COLUMN tdf_objects.search IS 'plaintext json search index'; +COMMENT ON COLUMN tdf_objects.metadata IS 'plaintext metadata json index'; COMMENT ON COLUMN tdf_objects.tdf_blob IS 'tdf data blob'; COMMENT ON COLUMN tdf_objects.tdf_uri IS 'tdf data uri'; @@ -58,3 +60,50 @@ CREATE OR REPLACE TRIGGER notify_tdf_objects_inserted AFTER INSERT ON tdf_objects FOR EACH ROW EXECUTE PROCEDURE notify_tdf_objects_inserted(); + + +/* + ############################################################################# + ### tdf_notes TABLE + ############################################################################# +*/ +CREATE TABLE IF NOT EXISTS tdf_notes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + parent_id UUID NOT NULL, + search JSONB NULL, + tdf_blob BYTEA NULL, + CONSTRAINT parent_id FOREIGN KEY (parent_id) REFERENCES tdf_objects(id) ON DELETE CASCADE, -- Corrected foreign key constraint + + tdf_uri TEXT NULL, + _created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + _created_by TEXT DEFAULT 'anonymous' +); + + +COMMENT ON TABLE tdf_notes IS 'stream of tdf data'; +COMMENT ON COLUMN tdf_notes.id IS 'uuid primary key generated by the database'; +COMMENT ON COLUMN tdf_notes.ts IS 'timestamp generated by the database'; +COMMENT ON COLUMN tdf_notes.search IS 'plaintext json search index'; +COMMENT ON COLUMN tdf_notes.tdf_blob IS 'tdf data blob'; +COMMENT ON COLUMN tdf_notes.parent_id IS 'foreign key, corresponds to primary key id of tdf_objects entry'; +COMMENT ON COLUMN tdf_notes.tdf_uri IS 'tdf data uri'; + +-- Create notification function +CREATE OR REPLACE FUNCTION notify_tdf_note_objects_inserted() + RETURNS trigger AS $$ +DECLARE +BEGIN + PERFORM pg_notify( + CAST('tdf_note_object_inserted' AS text), + row_to_json(NEW)::TEXT + ); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Add trigger to notify on insert +CREATE OR REPLACE TRIGGER notify_tdf_note_objects_inserted + AFTER INSERT ON tdf_notes + FOR EACH ROW + EXECUTE PROCEDURE notify_tdf_note_objects_inserted(); diff --git a/common-operating-picture/db/seed.sql b/common-operating-picture/db/seed.sql index dbd83fd..63d2aa7 100644 --- a/common-operating-picture/db/seed.sql +++ b/common-operating-picture/db/seed.sql @@ -1,24 +1,477 @@ INSERT INTO src_types (id, form_schema, ui_schema, metadata) - VALUES ( - 'employee', - '{"type":"object","definitions":{"countries":{"enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"],"enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}]}},"required":["attrClassification","name","favoriteColor","placeOfBirth"],"default":{"placeOfBirth":null},"properties":{"attrClassification":{"title":"Classification","type":"string","oneOf":[{"title":"UNCLASSIFIED","type":"string","enum":["https://demo.com/attr/classification/value/unclassified"]}]},"name":{"title":"Name","type":"string"},"favoriteColor":{"title":"Favorite Color","type":"string"},"placeOfBirth":{"title":"Place of Birth","$ref":"#/definitions/countries"}}}', - '{"order":["attrClassification","name","favoriteColor","placeOfBirth"],"placeOfBirth":{"widget":"LocationAutocomplete"}}', - '{"geoField":"placeOfBirth","searchFields":["name","favoriteColor"],"attrFields":["attrClassification"],"displayFields":{"header":"name","details":["attrClassification","name","favoriteColor","placeOfBirth.country"]},"mapFields":{"iconDefault":"employee","iconConfig":[{"field":"attrClassification","valueMap":{"topsecret-sci":"topsecret-sci","topsecret":"topsecret","secret":"secret","confidential":"confidential","controlled":"controlled","unclassified":"unclassified"}}],"colorDefault":"employee","colorConfig":[{"field":"favoriteColor","valueMap":{"red":"red","orange":"orange","yellow":"yellow","green":"green","blue":"blue","indigo":"indigo","violet":"violet","black":"black"}}]}}' +VALUES ( + 'employee', + '{ + "type": "object", + "required": ["attrClassification", "name", "favoriteColor", "placeOfBirth"], + "default": {"placeOfBirth": null}, + "definitions": { + "attrClassification": { + "type": "string", + "enum": [ + "https://demo.com/attr/classification/value/topsecret", + "https://demo.com/attr/classification/value/secret", + "https://demo.com/attr/classification/value/confidential", + "https://demo.com/attr/classification/value/unclassified" + ], + "enumNames": [ + "TOPSECRET", + "SECRET", + "CONFIDENTIAL", + "UNCLASSIFIED" + ] + }, + "countries": { + "enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"], + "enum": [{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}] + } + }, + "properties": { + "attrClassification": { + "title": "Classification", + "$ref": "#/definitions/attrClassification" + }, + "name": { + "title": "Name", + "type": "string" + }, + "favoriteColor": { + "title": "Favorite Color", + "type": "string" + }, + "placeOfBirth": { + "title": "Place of Birth", + "$ref": "#/definitions/countries" + } + } + }', + '{ + "order": ["attrClassification", "name", "favoriteColor", "placeOfBirth"], + "attrClassification": { "widget": "AttributeAutocomplete"}, + "placeOfBirth": { "widget": "LocationAutocomplete" }, + "name": { "placeholder": "Enter employee name" }, + "favoriteColor": { "placeholder": "Enter employees favorite color" } + }', + '{ + "geoField": "placeOfBirth", + "searchFields": ["name", "favoriteColor"], + "attrFields": ["attrClassification"], + "displayFields": { + "header": "name", + "details": ["attrClassification", "name", "favoriteColor", "placeOfBirth"] + }, + "mapFields": { + "iconDefault": "employee", + "iconConfig": [{ + "field": "attrClassification", + "valueMap": { + "topsecret-sci": "topsecret-sci", + "topsecret": "topsecret", + "secret": "secret", + "confidential": "confidential", + "controlled": "controlled", + "unclassified": "unclassified" + } + }], + "colorDefault": "employee", + "colorConfig": [{ + "field": "favoriteColor", + "valueMap": { + "red": "red", + "orange": "orange", + "yellow": "yellow", + "green": "green", + "blue": "blue", + "indigo": "indigo", + "violet": "violet", + "black": "black" + } + }] + } + }' +), +( + 'sitrep', + '{ + "type":"object", + "required":["reportType","entryDate","missionName","reporter","reportSignificance","attrClassification","fromLocation","aboutLocation"], + "default":{"reportType":"REGULAR/INCIDENT","reportSignificance":1,"fromLocation":null,"aboutLocation":null,"count":1}, + "definitions": { + "attrClassification": { + "oneOf": [ + {"type":"string","title":"TOPSECRET","enum":["https://demo.com/attr/classification/value/topsecret"]},{"type":"string","title":"SECRET","enum":["https://demo.com/attr/classification/value/secret"]},{"type":"string","title":"CONFIDENTIAL","enum":["https://demo.com/attr/classification/value/confidential"]},{"type":"string","title":"UNCLASSIFIED","enum":["https://demo.com/attr/classification/value/unclassified"]} + ] + }, + "attrNeedToKnow": { + "anyOf": [ + {"type":"string","title":"AAA","enum":["https://demo.com/attr/needtoknow/value/aaa"]},{"type":"string","title":"BBB","enum":["https://demo.com/attr/needtoknow/value/bbb"]},{"type":"string","title":"INT","enum":["https://demo.com/attr/needtoknow/value/int"]},{"type":"string","title":"OPS","enum":["https://demo.com/attr/needtoknow/value/ops"]} + ] + }, + "attributeRelTo": { + "anyOf": [ + {"type":"string","title":"AUSTRALIA","enum":["https://demo.com/attr/relto/value/aus"]},{"type":"string","title":"FRANCE","enum":["https://demo.com/attr/relto/value/fra"]},{"type":"string","title":"FVEY","enum":["https://demo.com/attr/relto/value/fvey"]},{"type":"string","title":"UNITED KINGDOM","enum":["https://demo.com/attr/relto/value/gbr"]},{"type":"string","title":"NATO","enum":["https://demo.com/attr/relto/value/nato"]},{"type":"string","title":"PINK","enum":["https://demo.com/attr/relto/value/pink"]},{"type":"string","title":"UNITED STATES","enum":["https://demo.com/attr/relto/value/usa"]},{"type":"string","title":"ARUBA","enum":["https://demo.com/attr/relto/value/abw"]},{"type":"string","title":"AFGHANISTAN","enum":["https://demo.com/attr/relto/value/afg"]},{"type":"string","title":"ANGOLA","enum":["https://demo.com/attr/relto/value/ago"]},{"type":"string","title":"ANGUILLA","enum":["https://demo.com/attr/relto/value/aia"]},{"type":"string","title":"ALAND ISLANDS","enum":["https://demo.com/attr/relto/value/ala"]},{"type":"string","title":"ALBANIA","enum":["https://demo.com/attr/relto/value/alb"]},{"type":"string","title":"ANDORRA","enum":["https://demo.com/attr/relto/value/and"]},{"type":"string","title":"UNITED ARAB EMIRATES","enum":["https://demo.com/attr/relto/value/are"]},{"type":"string","title":"ARGENTINA","enum":["https://demo.com/attr/relto/value/arg"]},{"type":"string","title":"ARMENIA","enum":["https://demo.com/attr/relto/value/arm"]},{"type":"string","title":"AMERICAN SAMOA","enum":["https://demo.com/attr/relto/value/asm"]},{"type":"string","title":"ANTARCTICA","enum":["https://demo.com/attr/relto/value/ata"]},{"type":"string","title":"FRENCH SOUTHERN AND ANTARCTIC LANDS","enum":["https://demo.com/attr/relto/value/atf"]},{"type":"string","title":"ANTIGUA AND BARBUDA","enum":["https://demo.com/attr/relto/value/atg"]},{"type":"string","title":"AUSTRIA","enum":["https://demo.com/attr/relto/value/aut"]},{"type":"string","title":"AZERBAIJAN","enum":["https://demo.com/attr/relto/value/aze"]},{"type":"string","title":"BURUNDI","enum":["https://demo.com/attr/relto/value/bdi"]},{"type":"string","title":"BELGIUM","enum":["https://demo.com/attr/relto/value/bel"]},{"type":"string","title":"BENIN","enum":["https://demo.com/attr/relto/value/ben"]},{"type":"string","title":"BONAIRE, SINT EUSTATIUS AND SABA","enum":["https://demo.com/attr/relto/value/bes"]},{"type":"string","title":"BURKINA FASO","enum":["https://demo.com/attr/relto/value/bfa"]},{"type":"string","title":"BANGLADESH","enum":["https://demo.com/attr/relto/value/bgd"]},{"type":"string","title":"BULGARIA","enum":["https://demo.com/attr/relto/value/bgr"]},{"type":"string","title":"BAHRAIN","enum":["https://demo.com/attr/relto/value/bhr"]},{"type":"string","title":"BAHAMAS, THE","enum":["https://demo.com/attr/relto/value/bhs"]},{"type":"string","title":"BOSNIA AND HERZEGOVINA","enum":["https://demo.com/attr/relto/value/bih"]},{"type":"string","title":"SAINT BARTHELEMY","enum":["https://demo.com/attr/relto/value/blm"]},{"type":"string","title":"BELARUS","enum":["https://demo.com/attr/relto/value/blr"]},{"type":"string","title":"BELIZE","enum":["https://demo.com/attr/relto/value/blz"]},{"type":"string","title":"BERMUDA","enum":["https://demo.com/attr/relto/value/bmu"]},{"type":"string","title":"BOLIVIA","enum":["https://demo.com/attr/relto/value/bol"]},{"type":"string","title":"BRAZIL","enum":["https://demo.com/attr/relto/value/bra"]},{"type":"string","title":"BARBADOS","enum":["https://demo.com/attr/relto/value/brb"]},{"type":"string","title":"BRUNEI","enum":["https://demo.com/attr/relto/value/brn"]},{"type":"string","title":"BHUTAN","enum":["https://demo.com/attr/relto/value/btn"]},{"type":"string","title":"BOUVET ISLAND","enum":["https://demo.com/attr/relto/value/bvt"]},{"type":"string","title":"BOTSWANA","enum":["https://demo.com/attr/relto/value/bwa"]},{"type":"string","title":"CENTRAL AFRICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/caf"]},{"type":"string","title":"CANADA","enum":["https://demo.com/attr/relto/value/can"]},{"type":"string","title":"COCOS (KEELING) ISLANDS","enum":["https://demo.com/attr/relto/value/cck"]},{"type":"string","title":"SWITZERLAND","enum":["https://demo.com/attr/relto/value/che"]},{"type":"string","title":"CHILE","enum":["https://demo.com/attr/relto/value/chl"]},{"type":"string","title":"CHINA","enum":["https://demo.com/attr/relto/value/chn"]},{"type":"string","title":"CÔTE D''IVOIRE","enum":["https://demo.com/attr/relto/value/civ"]},{"type":"string","title":"CAMEROON","enum":["https://demo.com/attr/relto/value/cmr"]},{"type":"string","title":"CONGO(KINSHASA)","enum":["https://demo.com/attr/relto/value/cod"]},{"type":"string","title":"CONGO (BRAZZAVILLE)","enum":["https://demo.com/attr/relto/value/cog"]},{"type":"string","title":"COOK ISLANDS","enum":["https://demo.com/attr/relto/value/cok"]},{"type":"string","title":"COLOMBIA","enum":["https://demo.com/attr/relto/value/col"]},{"type":"string","title":"COMOROS","enum":["https://demo.com/attr/relto/value/com"]},{"type":"string","title":"CABO VERDE","enum":["https://demo.com/attr/relto/value/cpv"]},{"type":"string","title":"COSTA RICA","enum":["https://demo.com/attr/relto/value/cri"]},{"type":"string","title":"CUBA","enum":["https://demo.com/attr/relto/value/cub"]},{"type":"string","title":"CURAÇAO","enum":["https://demo.com/attr/relto/value/cuw"]},{"type":"string","title":"CHRISTMAS ISLAND","enum":["https://demo.com/attr/relto/value/cxr"]},{"type":"string","title":"CAYMAN ISLANDS","enum":["https://demo.com/attr/relto/value/cym"]},{"type":"string","title":"CYPRUS","enum":["https://demo.com/attr/relto/value/cyp"]},{"type":"string","title":"CZECH REPUBLIC","enum":["https://demo.com/attr/relto/value/cze"]},{"type":"string","title":"GERMANY","enum":["https://demo.com/attr/relto/value/deu"]},{"type":"string","title":"DJIBOUTI","enum":["https://demo.com/attr/relto/value/dji"]},{"type":"string","title":"DOMINICA","enum":["https://demo.com/attr/relto/value/dma"]},{"type":"string","title":"DENMARK","enum":["https://demo.com/attr/relto/value/dnk"]},{"type":"string","title":"DOMINICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/dom"]},{"type":"string","title":"ALGERIA","enum":["https://demo.com/attr/relto/value/dza"]},{"type":"string","title":"ECUADOR","enum":["https://demo.com/attr/relto/value/ecu"]},{"type":"string","title":"EGYPT","enum":["https://demo.com/attr/relto/value/egy"]},{"type":"string","title":"ERITREA","enum":["https://demo.com/attr/relto/value/eri"]},{"type":"string","title":"WESTERN SAHARA","enum":["https://demo.com/attr/relto/value/esh"]},{"type":"string","title":"SPAIN","enum":["https://demo.com/attr/relto/value/esp"]},{"type":"string","title":"ESTONIA","enum":["https://demo.com/attr/relto/value/est"]},{"type":"string","title":"ETHIOPIA","enum":["https://demo.com/attr/relto/value/eth"]},{"type":"string","title":"FINLAND","enum":["https://demo.com/attr/relto/value/fin"]},{"type":"string","title":"FIJI","enum":["https://demo.com/attr/relto/value/fji"]},{"type":"string","title":"FALKLAND ISLANDS (ISLAS MALVINAS)","enum":["https://demo.com/attr/relto/value/flk"]},{"type":"string","title":"FAROE ISLANDS","enum":["https://demo.com/attr/relto/value/fro"]},{"type":"string","title":"MICRONESIA, FEDERATED STATES OF","enum":["https://demo.com/attr/relto/value/fsm"]},{"type":"string","title":"GABON","enum":["https://demo.com/attr/relto/value/gab"]},{"type":"string","title":"GEORGIA","enum":["https://demo.com/attr/relto/value/geo"]},{"type":"string","title":"GUERNSEY","enum":["https://demo.com/attr/relto/value/ggy"]},{"type":"string","title":"GHANA","enum":["https://demo.com/attr/relto/value/gha"]},{"type":"string","title":"GIBRALTAR","enum":["https://demo.com/attr/relto/value/gib"]},{"type":"string","title":"GUINEA","enum":["https://demo.com/attr/relto/value/gin"]},{"type":"string","title":"GUADELOUPE","enum":["https://demo.com/attr/relto/value/glp"]},{"type":"string","title":"GAMBIA, THE","enum":["https://demo.com/attr/relto/value/gmb"]},{"type":"string","title":"GUINEA-BISSAU","enum":["https://demo.com/attr/relto/value/gnb"]},{"type":"string","title":"EQUATORIAL GUINEA","enum":["https://demo.com/attr/relto/value/gnq"]},{"type":"string","title":"GREECE","enum":["https://demo.com/attr/relto/value/grc"]},{"type":"string","title":"GRENADA","enum":["https://demo.com/attr/relto/value/grd"]},{"type":"string","title":"GREENLAND","enum":["https://demo.com/attr/relto/value/grl"]},{"type":"string","title":"GUATEMALA","enum":["https://demo.com/attr/relto/value/gtm"]},{"type":"string","title":"FRENCH GUIANA","enum":["https://demo.com/attr/relto/value/guf"]},{"type":"string","title":"GUAM","enum":["https://demo.com/attr/relto/value/gum"]},{"type":"string","title":"GUYANA","enum":["https://demo.com/attr/relto/value/guy"]},{"type":"string","title":"HONG KONG","enum":["https://demo.com/attr/relto/value/hkg"]},{"type":"string","title":"HEARD ISLAND AND MCDONALD ISLANDS","enum":["https://demo.com/attr/relto/value/hmd"]},{"type":"string","title":"HONDURAS","enum":["https://demo.com/attr/relto/value/hnd"]},{"type":"string","title":"CROATIA","enum":["https://demo.com/attr/relto/value/hrv"]},{"type":"string","title":"HAITI","enum":["https://demo.com/attr/relto/value/hti"]},{"type":"string","title":"HUNGARY","enum":["https://demo.com/attr/relto/value/hun"]},{"type":"string","title":"INDONESIA","enum":["https://demo.com/attr/relto/value/idn"]},{"type":"string","title":"ISLE OF MAN","enum":["https://demo.com/attr/relto/value/imn"]},{"type":"string","title":"INDIA","enum":["https://demo.com/attr/relto/value/ind"]},{"type":"string","title":"BRITISH INDIAN OCEAN TERRITORY","enum":["https://demo.com/attr/relto/value/iot"]},{"type":"string","title":"IRELAND","enum":["https://demo.com/attr/relto/value/irl"]},{"type":"string","title":"IRAN","enum":["https://demo.com/attr/relto/value/irn"]},{"type":"string","title":"IRAQ","enum":["https://demo.com/attr/relto/value/irq"]},{"type":"string","title":"ICELAND","enum":["https://demo.com/attr/relto/value/isl"]},{"type":"string","title":"ISRAEL","enum":["https://demo.com/attr/relto/value/isr"]},{"type":"string","title":"ITALY","enum":["https://demo.com/attr/relto/value/ita"]},{"type":"string","title":"JAMAICA","enum":["https://demo.com/attr/relto/value/jam"]},{"type":"string","title":"JERSEY","enum":["https://demo.com/attr/relto/value/jey"]},{"type":"string","title":"JORDAN","enum":["https://demo.com/attr/relto/value/jor"]},{"type":"string","title":"JAPAN","enum":["https://demo.com/attr/relto/value/jpn"]},{"type":"string","title":"KAZAKHSTAN","enum":["https://demo.com/attr/relto/value/kaz"]},{"type":"string","title":"KENYA","enum":["https://demo.com/attr/relto/value/ken"]},{"type":"string","title":"KYRGYZSTAN","enum":["https://demo.com/attr/relto/value/kgz"]},{"type":"string","title":"CAMBODIA","enum":["https://demo.com/attr/relto/value/khm"]},{"type":"string","title":"KIRIBATI","enum":["https://demo.com/attr/relto/value/kir"]},{"type":"string","title":"SAINT KITTS AND NEVIS","enum":["https://demo.com/attr/relto/value/kna"]},{"type":"string","title":"KOREA, SOUTH","enum":["https://demo.com/attr/relto/value/kor"]},{"type":"string","title":"KUWAIT","enum":["https://demo.com/attr/relto/value/kwt"]},{"type":"string","title":"LAOS","enum":["https://demo.com/attr/relto/value/lao"]},{"type":"string","title":"LEBANON","enum":["https://demo.com/attr/relto/value/lbn"]},{"type":"string","title":"LIBERIA","enum":["https://demo.com/attr/relto/value/lbr"]},{"type":"string","title":"LIBYA","enum":["https://demo.com/attr/relto/value/lby"]},{"type":"string","title":"SAINT LUCIA","enum":["https://demo.com/attr/relto/value/lca"]},{"type":"string","title":"LIECHTENSTEIN","enum":["https://demo.com/attr/relto/value/lie"]},{"type":"string","title":"SRI LANKA","enum":["https://demo.com/attr/relto/value/lka"]},{"type":"string","title":"LESOTHO","enum":["https://demo.com/attr/relto/value/lso"]},{"type":"string","title":"LITHUANIA","enum":["https://demo.com/attr/relto/value/ltu"]},{"type":"string","title":"LUXEMBOURG","enum":["https://demo.com/attr/relto/value/lux"]},{"type":"string","title":"LATVIA","enum":["https://demo.com/attr/relto/value/lva"]},{"type":"string","title":"MACAU","enum":["https://demo.com/attr/relto/value/mac"]},{"type":"string","title":"SAINT MARTIN","enum":["https://demo.com/attr/relto/value/maf"]},{"type":"string","title":"MOROCCO","enum":["https://demo.com/attr/relto/value/mar"]},{"type":"string","title":"MONACO","enum":["https://demo.com/attr/relto/value/mco"]},{"type":"string","title":"MOLDOVA","enum":["https://demo.com/attr/relto/value/mda"]},{"type":"string","title":"MADAGASCAR","enum":["https://demo.com/attr/relto/value/mdg"]},{"type":"string","title":"MALDIVES","enum":["https://demo.com/attr/relto/value/mdv"]},{"type":"string","title":"MEXICO","enum":["https://demo.com/attr/relto/value/mex"]},{"type":"string","title":"MARSHALL ISLANDS","enum":["https://demo.com/attr/relto/value/mhl"]},{"type":"string","title":"MACEDONIA","enum":["https://demo.com/attr/relto/value/mkd"]},{"type":"string","title":"MALI","enum":["https://demo.com/attr/relto/value/mli"]},{"type":"string","title":"MALTA","enum":["https://demo.com/attr/relto/value/mlt"]},{"type":"string","title":"BURMA","enum":["https://demo.com/attr/relto/value/mmr"]},{"type":"string","title":"MONTENEGRO","enum":["https://demo.com/attr/relto/value/mne"]},{"type":"string","title":"MONGOLIA","enum":["https://demo.com/attr/relto/value/mng"]},{"type":"string","title":"NORTHERN MARIANA ISLANDS","enum":["https://demo.com/attr/relto/value/mnp"]},{"type":"string","title":"MOZAMBIQUE","enum":["https://demo.com/attr/relto/value/moz"]},{"type":"string","title":"MAURITANIA","enum":["https://demo.com/attr/relto/value/mrt"]},{"type":"string","title":"MONTSERRAT","enum":["https://demo.com/attr/relto/value/msr"]},{"type":"string","title":"MARTINIQUE","enum":["https://demo.com/attr/relto/value/mtq"]},{"type":"string","title":"MAURITIUS","enum":["https://demo.com/attr/relto/value/mus"]},{"type":"string","title":"MALAWI","enum":["https://demo.com/attr/relto/value/mwi"]},{"type":"string","title":"MALAYSIA","enum":["https://demo.com/attr/relto/value/mys"]},{"type":"string","title":"MAYOTTE","enum":["https://demo.com/attr/relto/value/myt"]},{"type":"string","title":"NAMIBIA","enum":["https://demo.com/attr/relto/value/nam"]},{"type":"string","title":"NEW CALEDONIA","enum":["https://demo.com/attr/relto/value/ncl"]},{"type":"string","title":"NIGER","enum":["https://demo.com/attr/relto/value/ner"]},{"type":"string","title":"NORFOLK ISLAND","enum":["https://demo.com/attr/relto/value/nfk"]},{"type":"string","title":"NIGERIA","enum":["https://demo.com/attr/relto/value/nga"]},{"type":"string","title":"NICARAGUA","enum":["https://demo.com/attr/relto/value/nic"]},{"type":"string","title":"NIUE","enum":["https://demo.com/attr/relto/value/niu"]},{"type":"string","title":"NETHERLANDS","enum":["https://demo.com/attr/relto/value/nld"]},{"type":"string","title":"NORWAY","enum":["https://demo.com/attr/relto/value/nor"]},{"type":"string","title":"NEPAL","enum":["https://demo.com/attr/relto/value/npl"]},{"type":"string","title":"NAURU","enum":["https://demo.com/attr/relto/value/nru"]},{"type":"string","title":"NEW ZEALAND","enum":["https://demo.com/attr/relto/value/nzl"]},{"type":"string","title":"OMAN","enum":["https://demo.com/attr/relto/value/omn"]},{"type":"string","title":"PAKISTAN","enum":["https://demo.com/attr/relto/value/pak"]},{"type":"string","title":"PANAMA","enum":["https://demo.com/attr/relto/value/pan"]},{"type":"string","title":"PITCAIRN ISLANDS","enum":["https://demo.com/attr/relto/value/pcn"]},{"type":"string","title":"PERU","enum":["https://demo.com/attr/relto/value/per"]},{"type":"string","title":"PHILIPPINES","enum":["https://demo.com/attr/relto/value/phl"]},{"type":"string","title":"PALAU","enum":["https://demo.com/attr/relto/value/plw"]},{"type":"string","title":"PAPUA NEW GUINEA","enum":["https://demo.com/attr/relto/value/png"]},{"type":"string","title":"POLAND","enum":["https://demo.com/attr/relto/value/pol"]},{"type":"string","title":"PUERTO RICO","enum":["https://demo.com/attr/relto/value/pri"]},{"type":"string","title":"KOREA, NORTH","enum":["https://demo.com/attr/relto/value/prk"]},{"type":"string","title":"PORTUGAL","enum":["https://demo.com/attr/relto/value/prt"]},{"type":"string","title":"PARAGUAY","enum":["https://demo.com/attr/relto/value/pry"]},{"type":"string","title":"PALESTINE","enum":["https://demo.com/attr/relto/value/pse"]},{"type":"string","title":"FRENCH POLYNESIA","enum":["https://demo.com/attr/relto/value/pyf"]},{"type":"string","title":"QATAR","enum":["https://demo.com/attr/relto/value/qat"]},{"type":"string","title":"REUNION","enum":["https://demo.com/attr/relto/value/reu"]},{"type":"string","title":"ROMANIA","enum":["https://demo.com/attr/relto/value/rou"]},{"type":"string","title":"RUSSIA","enum":["https://demo.com/attr/relto/value/rus"]},{"type":"string","title":"RWANDA","enum":["https://demo.com/attr/relto/value/rwa"]},{"type":"string","title":"SAUDI ARABIA","enum":["https://demo.com/attr/relto/value/sau"]},{"type":"string","title":"SUDAN","enum":["https://demo.com/attr/relto/value/sdn"]},{"type":"string","title":"SENEGAL","enum":["https://demo.com/attr/relto/value/sen"]},{"type":"string","title":"SINGAPORE","enum":["https://demo.com/attr/relto/value/sgp"]},{"type":"string","title":"SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS","enum":["https://demo.com/attr/relto/value/sgs"]},{"type":"string","title":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA","enum":["https://demo.com/attr/relto/value/shn"]},{"type":"string","title":"SVALBARD","enum":["https://demo.com/attr/relto/value/sjm"]},{"type":"string","title":"SOLOMON ISLANDS","enum":["https://demo.com/attr/relto/value/slb"]},{"type":"string","title":"SIERRA LEONE","enum":["https://demo.com/attr/relto/value/sle"]},{"type":"string","title":"EL SALVADOR","enum":["https://demo.com/attr/relto/value/slv"]},{"type":"string","title":"SAN MARINO","enum":["https://demo.com/attr/relto/value/smr"]},{"type":"string","title":"SOMALIA","enum":["https://demo.com/attr/relto/value/som"]},{"type":"string","title":"SAINT PIERRE AND MIQUELON","enum":["https://demo.com/attr/relto/value/spm"]},{"type":"string","title":"SERBIA","enum":["https://demo.com/attr/relto/value/srb"]},{"type":"string","title":"SOUTH SUDAN","enum":["https://demo.com/attr/relto/value/ssd"]},{"type":"string","title":"SAO TOME AND PRINCIPE","enum":["https://demo.com/attr/relto/value/stp"]},{"type":"string","title":"SURINAME","enum":["https://demo.com/attr/relto/value/sur"]},{"type":"string","title":"SLOVAKIA","enum":["https://demo.com/attr/relto/value/svk"]},{"type":"string","title":"SLOVENIA","enum":["https://demo.com/attr/relto/value/svn"]},{"type":"string","title":"SWEDEN","enum":["https://demo.com/attr/relto/value/swe"]},{"type":"string","title":"SWAZILAND","enum":["https://demo.com/attr/relto/value/swz"]},{"type":"string","title":"SINT MAARTEN","enum":["https://demo.com/attr/relto/value/sxm"]},{"type":"string","title":"SEYCHELLES","enum":["https://demo.com/attr/relto/value/syc"]},{"type":"string","title":"SYRIA","enum":["https://demo.com/attr/relto/value/syr"]},{"type":"string","title":"TURKS AND CAICOS ISLANDS","enum":["https://demo.com/attr/relto/value/tca"]},{"type":"string","title":"CHAD","enum":["https://demo.com/attr/relto/value/tcd"]},{"type":"string","title":"TOGO","enum":["https://demo.com/attr/relto/value/tgo"]},{"type":"string","title":"THAILAND","enum":["https://demo.com/attr/relto/value/tha"]},{"type":"string","title":"TAJIKISTAN","enum":["https://demo.com/attr/relto/value/tjk"]},{"type":"string","title":"TOKELAU","enum":["https://demo.com/attr/relto/value/tkl"]},{"type":"string","title":"TURKMENISTAN","enum":["https://demo.com/attr/relto/value/tkm"]},{"type":"string","title":"TIMOR-LESTE","enum":["https://demo.com/attr/relto/value/tls"]},{"type":"string","title":"TONGA","enum":["https://demo.com/attr/relto/value/ton"]},{"type":"string","title":"TRINIDAD AND TOBAGO","enum":["https://demo.com/attr/relto/value/tto"]},{"type":"string","title":"TUNISIA","enum":["https://demo.com/attr/relto/value/tun"]},{"type":"string","title":"TURKEY","enum":["https://demo.com/attr/relto/value/tur"]},{"type":"string","title":"TUVALU","enum":["https://demo.com/attr/relto/value/tuv"]},{"type":"string","title":"TAIWAN","enum":["https://demo.com/attr/relto/value/twn"]},{"type":"string","title":"TANZANIA","enum":["https://demo.com/attr/relto/value/tza"]},{"type":"string","title":"UGANDA","enum":["https://demo.com/attr/relto/value/uga"]},{"type":"string","title":"UKRAINE","enum":["https://demo.com/attr/relto/value/ukr"]},{"type":"string","title":"US MINOR OUTLYING ISLANDS","enum":["https://demo.com/attr/relto/value/umi"]},{"type":"string","title":"URUGUAY","enum":["https://demo.com/attr/relto/value/ury"]},{"type":"string","title":"UZBEKISTAN","enum":["https://demo.com/attr/relto/value/uzb"]},{"type":"string","title":"VATICAN CITY","enum":["https://demo.com/attr/relto/value/vat"]},{"type":"string","title":"SAINT VINCENT AND THE GRENADINES","enum":["https://demo.com/attr/relto/value/vct"]},{"type":"string","title":"VENEZUELA","enum":["https://demo.com/attr/relto/value/ven"]},{"type":"string","title":"VIRGIN ISLANDS, BRITISH","enum":["https://demo.com/attr/relto/value/vgb"]},{"type":"string","title":"VIRGIN ISLANDS, U.S.","enum":["https://demo.com/attr/relto/value/vir"]},{"type":"string","title":"VIETNAM","enum":["https://demo.com/attr/relto/value/vnm"]} + ] + }, + "countries": { + "enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"], + "enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}] + } + }, + "properties": { + "attrClassification": { + "title":"Classification", + "type":"string", + "$ref":"#/definitions/attrClassification" + }, + "attrNeedToKnow": { + "title":"Need To Know", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attrNeedToKnow"} + }, + "attrRelTo": { + "title":"Rel To", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attributeRelTo"} + }, + "reportType": { + "title":"Report Type", + "enum":["REGULAR/INCIDENT","SAR","CONSOLIDATED"], + "default":"REGULAR/INCIDENT" + }, + "entryDate": { + "title":"Entry Date", + "type":"string", + "format":"date" + }, + "reporter": { + "title":"Reporter", + "type":"string", + "minLength":1 + }, + "missionName": { + "title":"Mission Name", + "type":"string", + "minLength":1 + }, + "reportSignificance": { + "title":"Significance", + "type":"number", + "minimum":1 + }, + "fromLocation": { + "title":"From Location", + "$ref":"#/definitions/countries" + }, + "aboutLocation": { + "title":"About Location", + "$ref":"#/definitions/countries" + }, + "count": { + "title":"Count", + "type":"number", + "minimum":1 + }, + "description": { + "title":"Description", + "type":"string", + "minLength":1 + }, + "documentId": { + "title":"Document ID", + "type":"string" + }, + "sourceId": { + "title":"Source ID", + "type":"string" + }, + "stage": { + "title":"Stage", + "type":"string" + }, + "siteId": { + "title":"Site ID", + "type":"string" + } + }, + "allOf":[{"if":{"properties":{"reportType":{"const":"REGULAR/INCIDENT"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":false},"count":{"title":"Count","type":"number","readOnly":false}},"default":{"reportSignificance":1,"count":1},"required":["reportSignificance"]}},{"if":{"properties":{"reportType":{"const":"SAR"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":false},"count":{"title":"Count","type":"number","readOnly":false}},"default":{"reportSignificance":5,"count":1},"required":["reportSignificance"]}},{"if":{"properties":{"reportType":{"const":"CONSOLIDATED"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":false},"count":{"title":"Count","type":"number","minimum":1}},"default":{"reportSignificance":5,"count":1},"required":["reportSignificance","count"]}}]}', + '{ + "order": ["attrClassification","attrNeedToKnow","attrRelTo","reportType","entryDate","reporter","missionName","reportSignificance","fromLocation","aboutLocation","count","description","documentId","sourceId","stage","siteId"], + "reporter":{"placeholder":"Enter reporter id"}, + "missionName":{"placeholder":"Enter the mission name"}, + "reportSignificance":{"widget":"updown"}, + "fromLocation":{"widget":"LocationAutocomplete"}, + "aboutLocation":{"widget":"LocationAutocomplete"}, + "count":{"widget":"updown"}, + "description":{"widget":"textarea"}, + "attrClassification":{"widget":"AttributeAutocomplete"}, + "attrNeedToKnow":{"widget":"AttributeAutocomplete","multiple":true}, + "attrRelTo":{"widget":"AttributeAutocomplete","multiple":true}, + "entryDate":{"widget":"DatePicker"} + }', + '{ + "geoField":"aboutLocation", + "searchFields":["missionName","reporter","attrClassification","attrNeedToKnow","attrRelTo"], + "attrFields":["attrClassification","attrNeedToKnow","attrRelTo"], + "tsField":"entryDate", + "displayFields": { + "header":"missionName", + "details":["reporter","attrClassification","fromLocation.country","aboutLocation.country","reportType","reportSignificance","count","description","entryDate"] + }, + "mapFields": { + "iconDefault":"sitrep", + "iconConfig":[{ + "field":"attrClassification", + "valueMap": { + "topsecret-sci":"topsecret-sci", + "topsecret":"topsecret", + "secret":"secret", + "confidential":"confidential", + "controlled":"controlled", + "unclassified":"unclassified" + } + }], + "colorDefault":"sitrep", + "colorConfig": [{ + "field":"attrClassification", + "valueMap": { + "topsecret-sci":"topsecret-sci", + "topsecret":"topsecret", + "secret":"secret", + "confidential":"confidential", + "controlled":"controlled", + "unclassified":"unclassified" + } + }] + } + }' ), ( - 'sitrep', - '{"type":"object","required":["reportType","entryDate","missionName","reporter","reportSignificance","attrClassification","fromLocation","aboutLocation"],"default":{"reportType":"REGULAR/INCIDENT","reportSignificance":1,"fromLocation":null,"aboutLocation":null,"count":1},"definitions":{"attrClassification":{"oneOf":[{"type":"string","title":"TOPSECRET","enum":["https://demo.com/attr/classification/value/topsecret"]},{"type":"string","title":"SECRET","enum":["https://demo.com/attr/classification/value/secret"]},{"type":"string","title":"CONFIDENTIAL","enum":["https://demo.com/attr/classification/value/confidential"]},{"type":"string","title":"UNCLASSIFIED","enum":["https://demo.com/attr/classification/value/unclassified"]}]},"attrNeedToKnow":{"anyOf":[{"type":"string","title":"AAA","enum":["https://demo.com/attr/needtoknow/value/aaa"]},{"type":"string","title":"BBB","enum":["https://demo.com/attr/needtoknow/value/bbb"]},{"type":"string","title":"INT","enum":["https://demo.com/attr/needtoknow/value/int"]},{"type":"string","title":"OPS","enum":["https://demo.com/attr/needtoknow/value/ops"]}]},"attributeRelTo":{"anyOf":[{"type":"string","title":"AUSTRALIA","enum":["https://demo.com/attr/relto/value/aus"]},{"type":"string","title":"FRANCE","enum":["https://demo.com/attr/relto/value/fra"]},{"type":"string","title":"FVEY","enum":["https://demo.com/attr/relto/value/fvey"]},{"type":"string","title":"UNITED KINGDOM","enum":["https://demo.com/attr/relto/value/gbr"]},{"type":"string","title":"NATO","enum":["https://demo.com/attr/relto/value/nato"]},{"type":"string","title":"PINK","enum":["https://demo.com/attr/relto/value/pink"]},{"type":"string","title":"UNITED STATES","enum":["https://demo.com/attr/relto/value/usa"]},{"type":"string","title":"ARUBA","enum":["https://demo.com/attr/relto/value/abw"]},{"type":"string","title":"AFGHANISTAN","enum":["https://demo.com/attr/relto/value/afg"]},{"type":"string","title":"ANGOLA","enum":["https://demo.com/attr/relto/value/ago"]},{"type":"string","title":"ANGUILLA","enum":["https://demo.com/attr/relto/value/aia"]},{"type":"string","title":"ALAND ISLANDS","enum":["https://demo.com/attr/relto/value/ala"]},{"type":"string","title":"ALBANIA","enum":["https://demo.com/attr/relto/value/alb"]},{"type":"string","title":"ANDORRA","enum":["https://demo.com/attr/relto/value/and"]},{"type":"string","title":"UNITED ARAB EMIRATES","enum":["https://demo.com/attr/relto/value/are"]},{"type":"string","title":"ARGENTINA","enum":["https://demo.com/attr/relto/value/arg"]},{"type":"string","title":"ARMENIA","enum":["https://demo.com/attr/relto/value/arm"]},{"type":"string","title":"AMERICAN SAMOA","enum":["https://demo.com/attr/relto/value/asm"]},{"type":"string","title":"ANTARCTICA","enum":["https://demo.com/attr/relto/value/ata"]},{"type":"string","title":"FRENCH SOUTHERN AND ANTARCTIC LANDS","enum":["https://demo.com/attr/relto/value/atf"]},{"type":"string","title":"ANTIGUA AND BARBUDA","enum":["https://demo.com/attr/relto/value/atg"]},{"type":"string","title":"AUSTRIA","enum":["https://demo.com/attr/relto/value/aut"]},{"type":"string","title":"AZERBAIJAN","enum":["https://demo.com/attr/relto/value/aze"]},{"type":"string","title":"BURUNDI","enum":["https://demo.com/attr/relto/value/bdi"]},{"type":"string","title":"BELGIUM","enum":["https://demo.com/attr/relto/value/bel"]},{"type":"string","title":"BENIN","enum":["https://demo.com/attr/relto/value/ben"]},{"type":"string","title":"BONAIRE, SINT EUSTATIUS AND SABA","enum":["https://demo.com/attr/relto/value/bes"]},{"type":"string","title":"BURKINA FASO","enum":["https://demo.com/attr/relto/value/bfa"]},{"type":"string","title":"BANGLADESH","enum":["https://demo.com/attr/relto/value/bgd"]},{"type":"string","title":"BULGARIA","enum":["https://demo.com/attr/relto/value/bgr"]},{"type":"string","title":"BAHRAIN","enum":["https://demo.com/attr/relto/value/bhr"]},{"type":"string","title":"BAHAMAS, THE","enum":["https://demo.com/attr/relto/value/bhs"]},{"type":"string","title":"BOSNIA AND HERZEGOVINA","enum":["https://demo.com/attr/relto/value/bih"]},{"type":"string","title":"SAINT BARTHELEMY","enum":["https://demo.com/attr/relto/value/blm"]},{"type":"string","title":"BELARUS","enum":["https://demo.com/attr/relto/value/blr"]},{"type":"string","title":"BELIZE","enum":["https://demo.com/attr/relto/value/blz"]},{"type":"string","title":"BERMUDA","enum":["https://demo.com/attr/relto/value/bmu"]},{"type":"string","title":"BOLIVIA","enum":["https://demo.com/attr/relto/value/bol"]},{"type":"string","title":"BRAZIL","enum":["https://demo.com/attr/relto/value/bra"]},{"type":"string","title":"BARBADOS","enum":["https://demo.com/attr/relto/value/brb"]},{"type":"string","title":"BRUNEI","enum":["https://demo.com/attr/relto/value/brn"]},{"type":"string","title":"BHUTAN","enum":["https://demo.com/attr/relto/value/btn"]},{"type":"string","title":"BOUVET ISLAND","enum":["https://demo.com/attr/relto/value/bvt"]},{"type":"string","title":"BOTSWANA","enum":["https://demo.com/attr/relto/value/bwa"]},{"type":"string","title":"CENTRAL AFRICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/caf"]},{"type":"string","title":"CANADA","enum":["https://demo.com/attr/relto/value/can"]},{"type":"string","title":"COCOS (KEELING) ISLANDS","enum":["https://demo.com/attr/relto/value/cck"]},{"type":"string","title":"SWITZERLAND","enum":["https://demo.com/attr/relto/value/che"]},{"type":"string","title":"CHILE","enum":["https://demo.com/attr/relto/value/chl"]},{"type":"string","title":"CHINA","enum":["https://demo.com/attr/relto/value/chn"]},{"type":"string","title":"CÔTE D''IVOIRE","enum":["https://demo.com/attr/relto/value/civ"]},{"type":"string","title":"CAMEROON","enum":["https://demo.com/attr/relto/value/cmr"]},{"type":"string","title":"CONGO(KINSHASA)","enum":["https://demo.com/attr/relto/value/cod"]},{"type":"string","title":"CONGO (BRAZZAVILLE)","enum":["https://demo.com/attr/relto/value/cog"]},{"type":"string","title":"COOK ISLANDS","enum":["https://demo.com/attr/relto/value/cok"]},{"type":"string","title":"COLOMBIA","enum":["https://demo.com/attr/relto/value/col"]},{"type":"string","title":"COMOROS","enum":["https://demo.com/attr/relto/value/com"]},{"type":"string","title":"CABO VERDE","enum":["https://demo.com/attr/relto/value/cpv"]},{"type":"string","title":"COSTA RICA","enum":["https://demo.com/attr/relto/value/cri"]},{"type":"string","title":"CUBA","enum":["https://demo.com/attr/relto/value/cub"]},{"type":"string","title":"CURAÇAO","enum":["https://demo.com/attr/relto/value/cuw"]},{"type":"string","title":"CHRISTMAS ISLAND","enum":["https://demo.com/attr/relto/value/cxr"]},{"type":"string","title":"CAYMAN ISLANDS","enum":["https://demo.com/attr/relto/value/cym"]},{"type":"string","title":"CYPRUS","enum":["https://demo.com/attr/relto/value/cyp"]},{"type":"string","title":"CZECH REPUBLIC","enum":["https://demo.com/attr/relto/value/cze"]},{"type":"string","title":"GERMANY","enum":["https://demo.com/attr/relto/value/deu"]},{"type":"string","title":"DJIBOUTI","enum":["https://demo.com/attr/relto/value/dji"]},{"type":"string","title":"DOMINICA","enum":["https://demo.com/attr/relto/value/dma"]},{"type":"string","title":"DENMARK","enum":["https://demo.com/attr/relto/value/dnk"]},{"type":"string","title":"DOMINICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/dom"]},{"type":"string","title":"ALGERIA","enum":["https://demo.com/attr/relto/value/dza"]},{"type":"string","title":"ECUADOR","enum":["https://demo.com/attr/relto/value/ecu"]},{"type":"string","title":"EGYPT","enum":["https://demo.com/attr/relto/value/egy"]},{"type":"string","title":"ERITREA","enum":["https://demo.com/attr/relto/value/eri"]},{"type":"string","title":"WESTERN SAHARA","enum":["https://demo.com/attr/relto/value/esh"]},{"type":"string","title":"SPAIN","enum":["https://demo.com/attr/relto/value/esp"]},{"type":"string","title":"ESTONIA","enum":["https://demo.com/attr/relto/value/est"]},{"type":"string","title":"ETHIOPIA","enum":["https://demo.com/attr/relto/value/eth"]},{"type":"string","title":"FINLAND","enum":["https://demo.com/attr/relto/value/fin"]},{"type":"string","title":"FIJI","enum":["https://demo.com/attr/relto/value/fji"]},{"type":"string","title":"FALKLAND ISLANDS (ISLAS MALVINAS)","enum":["https://demo.com/attr/relto/value/flk"]},{"type":"string","title":"FAROE ISLANDS","enum":["https://demo.com/attr/relto/value/fro"]},{"type":"string","title":"MICRONESIA, FEDERATED STATES OF","enum":["https://demo.com/attr/relto/value/fsm"]},{"type":"string","title":"GABON","enum":["https://demo.com/attr/relto/value/gab"]},{"type":"string","title":"GEORGIA","enum":["https://demo.com/attr/relto/value/geo"]},{"type":"string","title":"GUERNSEY","enum":["https://demo.com/attr/relto/value/ggy"]},{"type":"string","title":"GHANA","enum":["https://demo.com/attr/relto/value/gha"]},{"type":"string","title":"GIBRALTAR","enum":["https://demo.com/attr/relto/value/gib"]},{"type":"string","title":"GUINEA","enum":["https://demo.com/attr/relto/value/gin"]},{"type":"string","title":"GUADELOUPE","enum":["https://demo.com/attr/relto/value/glp"]},{"type":"string","title":"GAMBIA, THE","enum":["https://demo.com/attr/relto/value/gmb"]},{"type":"string","title":"GUINEA-BISSAU","enum":["https://demo.com/attr/relto/value/gnb"]},{"type":"string","title":"EQUATORIAL GUINEA","enum":["https://demo.com/attr/relto/value/gnq"]},{"type":"string","title":"GREECE","enum":["https://demo.com/attr/relto/value/grc"]},{"type":"string","title":"GRENADA","enum":["https://demo.com/attr/relto/value/grd"]},{"type":"string","title":"GREENLAND","enum":["https://demo.com/attr/relto/value/grl"]},{"type":"string","title":"GUATEMALA","enum":["https://demo.com/attr/relto/value/gtm"]},{"type":"string","title":"FRENCH GUIANA","enum":["https://demo.com/attr/relto/value/guf"]},{"type":"string","title":"GUAM","enum":["https://demo.com/attr/relto/value/gum"]},{"type":"string","title":"GUYANA","enum":["https://demo.com/attr/relto/value/guy"]},{"type":"string","title":"HONG KONG","enum":["https://demo.com/attr/relto/value/hkg"]},{"type":"string","title":"HEARD ISLAND AND MCDONALD ISLANDS","enum":["https://demo.com/attr/relto/value/hmd"]},{"type":"string","title":"HONDURAS","enum":["https://demo.com/attr/relto/value/hnd"]},{"type":"string","title":"CROATIA","enum":["https://demo.com/attr/relto/value/hrv"]},{"type":"string","title":"HAITI","enum":["https://demo.com/attr/relto/value/hti"]},{"type":"string","title":"HUNGARY","enum":["https://demo.com/attr/relto/value/hun"]},{"type":"string","title":"INDONESIA","enum":["https://demo.com/attr/relto/value/idn"]},{"type":"string","title":"ISLE OF MAN","enum":["https://demo.com/attr/relto/value/imn"]},{"type":"string","title":"INDIA","enum":["https://demo.com/attr/relto/value/ind"]},{"type":"string","title":"BRITISH INDIAN OCEAN TERRITORY","enum":["https://demo.com/attr/relto/value/iot"]},{"type":"string","title":"IRELAND","enum":["https://demo.com/attr/relto/value/irl"]},{"type":"string","title":"IRAN","enum":["https://demo.com/attr/relto/value/irn"]},{"type":"string","title":"IRAQ","enum":["https://demo.com/attr/relto/value/irq"]},{"type":"string","title":"ICELAND","enum":["https://demo.com/attr/relto/value/isl"]},{"type":"string","title":"ISRAEL","enum":["https://demo.com/attr/relto/value/isr"]},{"type":"string","title":"ITALY","enum":["https://demo.com/attr/relto/value/ita"]},{"type":"string","title":"JAMAICA","enum":["https://demo.com/attr/relto/value/jam"]},{"type":"string","title":"JERSEY","enum":["https://demo.com/attr/relto/value/jey"]},{"type":"string","title":"JORDAN","enum":["https://demo.com/attr/relto/value/jor"]},{"type":"string","title":"JAPAN","enum":["https://demo.com/attr/relto/value/jpn"]},{"type":"string","title":"KAZAKHSTAN","enum":["https://demo.com/attr/relto/value/kaz"]},{"type":"string","title":"KENYA","enum":["https://demo.com/attr/relto/value/ken"]},{"type":"string","title":"KYRGYZSTAN","enum":["https://demo.com/attr/relto/value/kgz"]},{"type":"string","title":"CAMBODIA","enum":["https://demo.com/attr/relto/value/khm"]},{"type":"string","title":"KIRIBATI","enum":["https://demo.com/attr/relto/value/kir"]},{"type":"string","title":"SAINT KITTS AND NEVIS","enum":["https://demo.com/attr/relto/value/kna"]},{"type":"string","title":"KOREA, SOUTH","enum":["https://demo.com/attr/relto/value/kor"]},{"type":"string","title":"KUWAIT","enum":["https://demo.com/attr/relto/value/kwt"]},{"type":"string","title":"LAOS","enum":["https://demo.com/attr/relto/value/lao"]},{"type":"string","title":"LEBANON","enum":["https://demo.com/attr/relto/value/lbn"]},{"type":"string","title":"LIBERIA","enum":["https://demo.com/attr/relto/value/lbr"]},{"type":"string","title":"LIBYA","enum":["https://demo.com/attr/relto/value/lby"]},{"type":"string","title":"SAINT LUCIA","enum":["https://demo.com/attr/relto/value/lca"]},{"type":"string","title":"LIECHTENSTEIN","enum":["https://demo.com/attr/relto/value/lie"]},{"type":"string","title":"SRI LANKA","enum":["https://demo.com/attr/relto/value/lka"]},{"type":"string","title":"LESOTHO","enum":["https://demo.com/attr/relto/value/lso"]},{"type":"string","title":"LITHUANIA","enum":["https://demo.com/attr/relto/value/ltu"]},{"type":"string","title":"LUXEMBOURG","enum":["https://demo.com/attr/relto/value/lux"]},{"type":"string","title":"LATVIA","enum":["https://demo.com/attr/relto/value/lva"]},{"type":"string","title":"MACAU","enum":["https://demo.com/attr/relto/value/mac"]},{"type":"string","title":"SAINT MARTIN","enum":["https://demo.com/attr/relto/value/maf"]},{"type":"string","title":"MOROCCO","enum":["https://demo.com/attr/relto/value/mar"]},{"type":"string","title":"MONACO","enum":["https://demo.com/attr/relto/value/mco"]},{"type":"string","title":"MOLDOVA","enum":["https://demo.com/attr/relto/value/mda"]},{"type":"string","title":"MADAGASCAR","enum":["https://demo.com/attr/relto/value/mdg"]},{"type":"string","title":"MALDIVES","enum":["https://demo.com/attr/relto/value/mdv"]},{"type":"string","title":"MEXICO","enum":["https://demo.com/attr/relto/value/mex"]},{"type":"string","title":"MARSHALL ISLANDS","enum":["https://demo.com/attr/relto/value/mhl"]},{"type":"string","title":"MACEDONIA","enum":["https://demo.com/attr/relto/value/mkd"]},{"type":"string","title":"MALI","enum":["https://demo.com/attr/relto/value/mli"]},{"type":"string","title":"MALTA","enum":["https://demo.com/attr/relto/value/mlt"]},{"type":"string","title":"BURMA","enum":["https://demo.com/attr/relto/value/mmr"]},{"type":"string","title":"MONTENEGRO","enum":["https://demo.com/attr/relto/value/mne"]},{"type":"string","title":"MONGOLIA","enum":["https://demo.com/attr/relto/value/mng"]},{"type":"string","title":"NORTHERN MARIANA ISLANDS","enum":["https://demo.com/attr/relto/value/mnp"]},{"type":"string","title":"MOZAMBIQUE","enum":["https://demo.com/attr/relto/value/moz"]},{"type":"string","title":"MAURITANIA","enum":["https://demo.com/attr/relto/value/mrt"]},{"type":"string","title":"MONTSERRAT","enum":["https://demo.com/attr/relto/value/msr"]},{"type":"string","title":"MARTINIQUE","enum":["https://demo.com/attr/relto/value/mtq"]},{"type":"string","title":"MAURITIUS","enum":["https://demo.com/attr/relto/value/mus"]},{"type":"string","title":"MALAWI","enum":["https://demo.com/attr/relto/value/mwi"]},{"type":"string","title":"MALAYSIA","enum":["https://demo.com/attr/relto/value/mys"]},{"type":"string","title":"MAYOTTE","enum":["https://demo.com/attr/relto/value/myt"]},{"type":"string","title":"NAMIBIA","enum":["https://demo.com/attr/relto/value/nam"]},{"type":"string","title":"NEW CALEDONIA","enum":["https://demo.com/attr/relto/value/ncl"]},{"type":"string","title":"NIGER","enum":["https://demo.com/attr/relto/value/ner"]},{"type":"string","title":"NORFOLK ISLAND","enum":["https://demo.com/attr/relto/value/nfk"]},{"type":"string","title":"NIGERIA","enum":["https://demo.com/attr/relto/value/nga"]},{"type":"string","title":"NICARAGUA","enum":["https://demo.com/attr/relto/value/nic"]},{"type":"string","title":"NIUE","enum":["https://demo.com/attr/relto/value/niu"]},{"type":"string","title":"NETHERLANDS","enum":["https://demo.com/attr/relto/value/nld"]},{"type":"string","title":"NORWAY","enum":["https://demo.com/attr/relto/value/nor"]},{"type":"string","title":"NEPAL","enum":["https://demo.com/attr/relto/value/npl"]},{"type":"string","title":"NAURU","enum":["https://demo.com/attr/relto/value/nru"]},{"type":"string","title":"NEW ZEALAND","enum":["https://demo.com/attr/relto/value/nzl"]},{"type":"string","title":"OMAN","enum":["https://demo.com/attr/relto/value/omn"]},{"type":"string","title":"PAKISTAN","enum":["https://demo.com/attr/relto/value/pak"]},{"type":"string","title":"PANAMA","enum":["https://demo.com/attr/relto/value/pan"]},{"type":"string","title":"PITCAIRN ISLANDS","enum":["https://demo.com/attr/relto/value/pcn"]},{"type":"string","title":"PERU","enum":["https://demo.com/attr/relto/value/per"]},{"type":"string","title":"PHILIPPINES","enum":["https://demo.com/attr/relto/value/phl"]},{"type":"string","title":"PALAU","enum":["https://demo.com/attr/relto/value/plw"]},{"type":"string","title":"PAPUA NEW GUINEA","enum":["https://demo.com/attr/relto/value/png"]},{"type":"string","title":"POLAND","enum":["https://demo.com/attr/relto/value/pol"]},{"type":"string","title":"PUERTO RICO","enum":["https://demo.com/attr/relto/value/pri"]},{"type":"string","title":"KOREA, NORTH","enum":["https://demo.com/attr/relto/value/prk"]},{"type":"string","title":"PORTUGAL","enum":["https://demo.com/attr/relto/value/prt"]},{"type":"string","title":"PARAGUAY","enum":["https://demo.com/attr/relto/value/pry"]},{"type":"string","title":"PALESTINE","enum":["https://demo.com/attr/relto/value/pse"]},{"type":"string","title":"FRENCH POLYNESIA","enum":["https://demo.com/attr/relto/value/pyf"]},{"type":"string","title":"QATAR","enum":["https://demo.com/attr/relto/value/qat"]},{"type":"string","title":"REUNION","enum":["https://demo.com/attr/relto/value/reu"]},{"type":"string","title":"ROMANIA","enum":["https://demo.com/attr/relto/value/rou"]},{"type":"string","title":"RUSSIA","enum":["https://demo.com/attr/relto/value/rus"]},{"type":"string","title":"RWANDA","enum":["https://demo.com/attr/relto/value/rwa"]},{"type":"string","title":"SAUDI ARABIA","enum":["https://demo.com/attr/relto/value/sau"]},{"type":"string","title":"SUDAN","enum":["https://demo.com/attr/relto/value/sdn"]},{"type":"string","title":"SENEGAL","enum":["https://demo.com/attr/relto/value/sen"]},{"type":"string","title":"SINGAPORE","enum":["https://demo.com/attr/relto/value/sgp"]},{"type":"string","title":"SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS","enum":["https://demo.com/attr/relto/value/sgs"]},{"type":"string","title":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA","enum":["https://demo.com/attr/relto/value/shn"]},{"type":"string","title":"SVALBARD","enum":["https://demo.com/attr/relto/value/sjm"]},{"type":"string","title":"SOLOMON ISLANDS","enum":["https://demo.com/attr/relto/value/slb"]},{"type":"string","title":"SIERRA LEONE","enum":["https://demo.com/attr/relto/value/sle"]},{"type":"string","title":"EL SALVADOR","enum":["https://demo.com/attr/relto/value/slv"]},{"type":"string","title":"SAN MARINO","enum":["https://demo.com/attr/relto/value/smr"]},{"type":"string","title":"SOMALIA","enum":["https://demo.com/attr/relto/value/som"]},{"type":"string","title":"SAINT PIERRE AND MIQUELON","enum":["https://demo.com/attr/relto/value/spm"]},{"type":"string","title":"SERBIA","enum":["https://demo.com/attr/relto/value/srb"]},{"type":"string","title":"SOUTH SUDAN","enum":["https://demo.com/attr/relto/value/ssd"]},{"type":"string","title":"SAO TOME AND PRINCIPE","enum":["https://demo.com/attr/relto/value/stp"]},{"type":"string","title":"SURINAME","enum":["https://demo.com/attr/relto/value/sur"]},{"type":"string","title":"SLOVAKIA","enum":["https://demo.com/attr/relto/value/svk"]},{"type":"string","title":"SLOVENIA","enum":["https://demo.com/attr/relto/value/svn"]},{"type":"string","title":"SWEDEN","enum":["https://demo.com/attr/relto/value/swe"]},{"type":"string","title":"SWAZILAND","enum":["https://demo.com/attr/relto/value/swz"]},{"type":"string","title":"SINT MAARTEN","enum":["https://demo.com/attr/relto/value/sxm"]},{"type":"string","title":"SEYCHELLES","enum":["https://demo.com/attr/relto/value/syc"]},{"type":"string","title":"SYRIA","enum":["https://demo.com/attr/relto/value/syr"]},{"type":"string","title":"TURKS AND CAICOS ISLANDS","enum":["https://demo.com/attr/relto/value/tca"]},{"type":"string","title":"CHAD","enum":["https://demo.com/attr/relto/value/tcd"]},{"type":"string","title":"TOGO","enum":["https://demo.com/attr/relto/value/tgo"]},{"type":"string","title":"THAILAND","enum":["https://demo.com/attr/relto/value/tha"]},{"type":"string","title":"TAJIKISTAN","enum":["https://demo.com/attr/relto/value/tjk"]},{"type":"string","title":"TOKELAU","enum":["https://demo.com/attr/relto/value/tkl"]},{"type":"string","title":"TURKMENISTAN","enum":["https://demo.com/attr/relto/value/tkm"]},{"type":"string","title":"TIMOR-LESTE","enum":["https://demo.com/attr/relto/value/tls"]},{"type":"string","title":"TONGA","enum":["https://demo.com/attr/relto/value/ton"]},{"type":"string","title":"TRINIDAD AND TOBAGO","enum":["https://demo.com/attr/relto/value/tto"]},{"type":"string","title":"TUNISIA","enum":["https://demo.com/attr/relto/value/tun"]},{"type":"string","title":"TURKEY","enum":["https://demo.com/attr/relto/value/tur"]},{"type":"string","title":"TUVALU","enum":["https://demo.com/attr/relto/value/tuv"]},{"type":"string","title":"TAIWAN","enum":["https://demo.com/attr/relto/value/twn"]},{"type":"string","title":"TANZANIA","enum":["https://demo.com/attr/relto/value/tza"]},{"type":"string","title":"UGANDA","enum":["https://demo.com/attr/relto/value/uga"]},{"type":"string","title":"UKRAINE","enum":["https://demo.com/attr/relto/value/ukr"]},{"type":"string","title":"US MINOR OUTLYING ISLANDS","enum":["https://demo.com/attr/relto/value/umi"]},{"type":"string","title":"URUGUAY","enum":["https://demo.com/attr/relto/value/ury"]},{"type":"string","title":"UZBEKISTAN","enum":["https://demo.com/attr/relto/value/uzb"]},{"type":"string","title":"VATICAN CITY","enum":["https://demo.com/attr/relto/value/vat"]},{"type":"string","title":"SAINT VINCENT AND THE GRENADINES","enum":["https://demo.com/attr/relto/value/vct"]},{"type":"string","title":"VENEZUELA","enum":["https://demo.com/attr/relto/value/ven"]},{"type":"string","title":"VIRGIN ISLANDS, BRITISH","enum":["https://demo.com/attr/relto/value/vgb"]},{"type":"string","title":"VIRGIN ISLANDS, U.S.","enum":["https://demo.com/attr/relto/value/vir"]},{"type":"string","title":"VIETNAM","enum":["https://demo.com/attr/relto/value/vnm"]},{"type":"string","title":"VANUATU","enum":["https://demo.com/attr/relto/value/vut"]},{"type":"string","title":"WALLIS AND FUTUNA","enum":["https://demo.com/attr/relto/value/wlf"]},{"type":"string","title":"SAMOA","enum":["https://demo.com/attr/relto/value/wsm"]},{"type":"string","title":"YEMEN","enum":["https://demo.com/attr/relto/value/yem"]},{"type":"string","title":"SOUTH AFRICA","enum":["https://demo.com/attr/relto/value/zaf"]},{"type":"string","title":"ZAMBIA","enum":["https://demo.com/attr/relto/value/zmb"]},{"type":"string","title":"ZIMBABWE","enum":["https://demo.com/attr/relto/value/zwe"]}]},"countries":{"enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"],"enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}]}},"properties":{"attrClassification":{"title":"Classification","type":"string","$ref":"#/definitions/attrClassification"},"attrNeedToKnow":{"title":"Need To Know","type":"array","uniqueItems":true,"items":{"$ref":"#/definitions/attrNeedToKnow"}},"attrRelTo":{"title":"Rel To","type":"array","uniqueItems":true,"items":{"$ref":"#/definitions/attributeRelTo"}},"reportType":{"title":"Report Type","enum":["REGULAR/INCIDENT","SAR","CONSOLIDATED"],"default":"REGULAR/INCIDENT"},"entryDate":{"title":"Entry Date","type":"string","format":"date"},"reporter":{"title":"Reporter","type":"string","minLength":1},"missionName":{"title":"Mission Name","type":"string","minLength":1},"reportSignificance":{"title":"Significance","type":"number","minimum":1},"fromLocation":{"title":"From Location","$ref":"#/definitions/countries"},"aboutLocation":{"title":"About Location","$ref":"#/definitions/countries"},"count":{"title":"Count","type":"number","minimum":1},"description":{"title":"Description","type":"string","minLength":1},"documentId":{"title":"Document ID","type":"string"},"sourceId":{"title":"Source ID","type":"string"},"stage":{"title":"Stage","type":"string"},"siteId":{"title":"Site ID","type":"string"}},"allOf":[{"if":{"properties":{"reportType":{"const":"REGULAR/INCIDENT"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":true},"count":{"title":"Count","type":"number","readOnly":true}},"default":{"reportSignificance":1,"count":1},"required":["reportSignificance"]}},{"if":{"properties":{"reportType":{"const":"SAR"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":true},"count":{"title":"Count","type":"number","readOnly":true}},"default":{"reportSignificance":5,"count":1},"required":["reportSignificance"]}},{"if":{"properties":{"reportType":{"const":"CONSOLIDATED"}}},"then":{"properties":{"reportSignificance":{"title":"Significance","type":"number","readOnly":true},"count":{"title":"Count","type":"number","minimum":1}},"default":{"reportSignificance":5,"count":1},"required":["reportSignificance","count"]}}]}', - '{"order":["attrClassification","attrNeedToKnow","attrRelTo","reportType","entryDate","reporter","missionName","reportSignificance","fromLocation","aboutLocation","count","description","documentId","sourceId","stage","siteId"],"reporter":{"placeholder":"Enter reporter id"},"missionName":{"placeholder":"Enter the mission name"},"reportSignificance":{"widget":"updown"},"fromLocation":{"widget":"LocationAutocomplete"},"aboutLocation":{"widget":"LocationAutocomplete"},"count":{"widget":"updown"},"description":{"widget":"textarea"},"attrClassification":{"widget":"AttributeAutocomplete"},"attrNeedToKnow":{"widget":"AttributeAutocomplete","multiple":true},"attrRelTo":{"widget":"AttributeAutocomplete","multiple":true},"entryDate":{"widget":"DatePicker"}}', - '{"geoField":"aboutLocation","searchFields":["missionName","reporter","attrClassification","attrNeedToKnow","attrRelTo"],"attrFields":["attrClassification","attrNeedToKnow","attrRelTo"],"tsField":"entryDate","displayFields":{"header":"missionName","details":["reporter","attrClassification","fromLocation.country","aboutLocation.country","reportType","reportSignificance","count","description","entryDate"]},"mapFields":{"iconDefault":"sitrep","iconConfig":[{"field":"attrClassification","valueMap":{"topsecret-sci":"topsecret-sci","topsecret":"topsecret","secret":"secret","confidential":"confidential","controlled":"controlled","unclassified":"unclassified"}}],"colorDefault":"sitrep","colorConfig":[{"field":"attrClassification","valueMap":{"topsecret-sci":"topsecret-sci","topsecret":"topsecret","secret":"secret","confidential":"confidential","controlled":"controlled","unclassified":"unclassified"}}]}}' + 'facilities', + '{ + "type":"object", + "required":["attrClassification","facilityName","symbolCode2525b","location"], + "default":{}, + "definitions": { + "attrClassification": { + "oneOf":[ + {"type":"string","title":"TOPSECRET","enum":["https://demo.com/attr/classification/value/topsecret"]},{"type":"string","title":"SECRET","enum":["https://demo.com/attr/classification/value/secret"]},{"type":"string","title":"CONFIDENTIAL","enum":["https://demo.com/attr/classification/value/confidential"]},{"type":"string","title":"UNCLASSIFIED","enum":["https://demo.com/attr/classification/value/unclassified"]} + ] + }, + "attrNeedToKnow": { + "anyOf": [ + {"type":"string","title":"AAA","enum":["https://demo.com/attr/needtoknow/value/aaa"]},{"type":"string","title":"BBB","enum":["https://demo.com/attr/needtoknow/value/bbb"]},{"type":"string","title":"INT","enum":["https://demo.com/attr/needtoknow/value/int"]},{"type":"string","title":"OPS","enum":["https://demo.com/attr/needtoknow/value/ops"]} + ] + }, + "attributeRelTo": { + "anyOf":[ + {"type":"string","title":"AUSTRALIA","enum":["https://demo.com/attr/relto/value/aus"]},{"type":"string","title":"FRANCE","enum":["https://demo.com/attr/relto/value/fra"]},{"type":"string","title":"FVEY","enum":["https://demo.com/attr/relto/value/fvey"]},{"type":"string","title":"UNITED KINGDOM","enum":["https://demo.com/attr/relto/value/gbr"]},{"type":"string","title":"NATO","enum":["https://demo.com/attr/relto/value/nato"]},{"type":"string","title":"PINK","enum":["https://demo.com/attr/relto/value/pink"]},{"type":"string","title":"UNITED STATES","enum":["https://demo.com/attr/relto/value/usa"]},{"type":"string","title":"ARUBA","enum":["https://demo.com/attr/relto/value/abw"]},{"type":"string","title":"AFGHANISTAN","enum":["https://demo.com/attr/relto/value/afg"]},{"type":"string","title":"ANGOLA","enum":["https://demo.com/attr/relto/value/ago"]},{"type":"string","title":"ANGUILLA","enum":["https://demo.com/attr/relto/value/aia"]},{"type":"string","title":"ALAND ISLANDS","enum":["https://demo.com/attr/relto/value/ala"]},{"type":"string","title":"ALBANIA","enum":["https://demo.com/attr/relto/value/alb"]},{"type":"string","title":"ANDORRA","enum":["https://demo.com/attr/relto/value/and"]},{"type":"string","title":"UNITED ARAB EMIRATES","enum":["https://demo.com/attr/relto/value/are"]},{"type":"string","title":"ARGENTINA","enum":["https://demo.com/attr/relto/value/arg"]},{"type":"string","title":"ARMENIA","enum":["https://demo.com/attr/relto/value/arm"]},{"type":"string","title":"AMERICAN SAMOA","enum":["https://demo.com/attr/relto/value/asm"]},{"type":"string","title":"ANTARCTICA","enum":["https://demo.com/attr/relto/value/ata"]},{"type":"string","title":"FRENCH SOUTHERN AND ANTARCTIC LANDS","enum":["https://demo.com/attr/relto/value/atf"]},{"type":"string","title":"ANTIGUA AND BARBUDA","enum":["https://demo.com/attr/relto/value/atg"]},{"type":"string","title":"AUSTRIA","enum":["https://demo.com/attr/relto/value/aut"]},{"type":"string","title":"AZERBAIJAN","enum":["https://demo.com/attr/relto/value/aze"]},{"type":"string","title":"BURUNDI","enum":["https://demo.com/attr/relto/value/bdi"]},{"type":"string","title":"BELGIUM","enum":["https://demo.com/attr/relto/value/bel"]},{"type":"string","title":"BENIN","enum":["https://demo.com/attr/relto/value/ben"]},{"type":"string","title":"BONAIRE, SINT EUSTATIUS AND SABA","enum":["https://demo.com/attr/relto/value/bes"]},{"type":"string","title":"BURKINA FASO","enum":["https://demo.com/attr/relto/value/bfa"]},{"type":"string","title":"BANGLADESH","enum":["https://demo.com/attr/relto/value/bgd"]},{"type":"string","title":"BULGARIA","enum":["https://demo.com/attr/relto/value/bgr"]},{"type":"string","title":"BAHRAIN","enum":["https://demo.com/attr/relto/value/bhr"]},{"type":"string","title":"BAHAMAS, THE","enum":["https://demo.com/attr/relto/value/bhs"]},{"type":"string","title":"BOSNIA AND HERZEGOVINA","enum":["https://demo.com/attr/relto/value/bih"]},{"type":"string","title":"SAINT BARTHELEMY","enum":["https://demo.com/attr/relto/value/blm"]},{"type":"string","title":"BELARUS","enum":["https://demo.com/attr/relto/value/blr"]},{"type":"string","title":"BELIZE","enum":["https://demo.com/attr/relto/value/blz"]},{"type":"string","title":"BERMUDA","enum":["https://demo.com/attr/relto/value/bmu"]},{"type":"string","title":"BOLIVIA","enum":["https://demo.com/attr/relto/value/bol"]},{"type":"string","title":"BRAZIL","enum":["https://demo.com/attr/relto/value/bra"]},{"type":"string","title":"BARBADOS","enum":["https://demo.com/attr/relto/value/brb"]},{"type":"string","title":"BRUNEI","enum":["https://demo.com/attr/relto/value/brn"]},{"type":"string","title":"BHUTAN","enum":["https://demo.com/attr/relto/value/btn"]},{"type":"string","title":"BOUVET ISLAND","enum":["https://demo.com/attr/relto/value/bvt"]},{"type":"string","title":"BOTSWANA","enum":["https://demo.com/attr/relto/value/bwa"]},{"type":"string","title":"CENTRAL AFRICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/caf"]},{"type":"string","title":"CANADA","enum":["https://demo.com/attr/relto/value/can"]},{"type":"string","title":"COCOS (KEELING) ISLANDS","enum":["https://demo.com/attr/relto/value/cck"]},{"type":"string","title":"SWITZERLAND","enum":["https://demo.com/attr/relto/value/che"]},{"type":"string","title":"CHILE","enum":["https://demo.com/attr/relto/value/chl"]},{"type":"string","title":"CHINA","enum":["https://demo.com/attr/relto/value/chn"]},{"type":"string","title":"CÔTE D''IVOIRE","enum":["https://demo.com/attr/relto/value/civ"]},{"type":"string","title":"CAMEROON","enum":["https://demo.com/attr/relto/value/cmr"]},{"type":"string","title":"CONGO(KINSHASA)","enum":["https://demo.com/attr/relto/value/cod"]},{"type":"string","title":"CONGO (BRAZZAVILLE)","enum":["https://demo.com/attr/relto/value/cog"]},{"type":"string","title":"COOK ISLANDS","enum":["https://demo.com/attr/relto/value/cok"]},{"type":"string","title":"COLOMBIA","enum":["https://demo.com/attr/relto/value/col"]},{"type":"string","title":"COMOROS","enum":["https://demo.com/attr/relto/value/com"]},{"type":"string","title":"CABO VERDE","enum":["https://demo.com/attr/relto/value/cpv"]},{"type":"string","title":"COSTA RICA","enum":["https://demo.com/attr/relto/value/cri"]},{"type":"string","title":"CUBA","enum":["https://demo.com/attr/relto/value/cub"]},{"type":"string","title":"CURAÇAO","enum":["https://demo.com/attr/relto/value/cuw"]},{"type":"string","title":"CHRISTMAS ISLAND","enum":["https://demo.com/attr/relto/value/cxr"]},{"type":"string","title":"CAYMAN ISLANDS","enum":["https://demo.com/attr/relto/value/cym"]},{"type":"string","title":"CYPRUS","enum":["https://demo.com/attr/relto/value/cyp"]},{"type":"string","title":"CZECH REPUBLIC","enum":["https://demo.com/attr/relto/value/cze"]},{"type":"string","title":"GERMANY","enum":["https://demo.com/attr/relto/value/deu"]},{"type":"string","title":"DJIBOUTI","enum":["https://demo.com/attr/relto/value/dji"]},{"type":"string","title":"DOMINICA","enum":["https://demo.com/attr/relto/value/dma"]},{"type":"string","title":"DENMARK","enum":["https://demo.com/attr/relto/value/dnk"]},{"type":"string","title":"DOMINICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/dom"]},{"type":"string","title":"ALGERIA","enum":["https://demo.com/attr/relto/value/dza"]},{"type":"string","title":"ECUADOR","enum":["https://demo.com/attr/relto/value/ecu"]},{"type":"string","title":"EGYPT","enum":["https://demo.com/attr/relto/value/egy"]},{"type":"string","title":"ERITREA","enum":["https://demo.com/attr/relto/value/eri"]},{"type":"string","title":"WESTERN SAHARA","enum":["https://demo.com/attr/relto/value/esh"]},{"type":"string","title":"SPAIN","enum":["https://demo.com/attr/relto/value/esp"]},{"type":"string","title":"ESTONIA","enum":["https://demo.com/attr/relto/value/est"]},{"type":"string","title":"ETHIOPIA","enum":["https://demo.com/attr/relto/value/eth"]},{"type":"string","title":"FINLAND","enum":["https://demo.com/attr/relto/value/fin"]},{"type":"string","title":"FIJI","enum":["https://demo.com/attr/relto/value/fji"]},{"type":"string","title":"FALKLAND ISLANDS (ISLAS MALVINAS)","enum":["https://demo.com/attr/relto/value/flk"]},{"type":"string","title":"FAROE ISLANDS","enum":["https://demo.com/attr/relto/value/fro"]},{"type":"string","title":"MICRONESIA, FEDERATED STATES OF","enum":["https://demo.com/attr/relto/value/fsm"]},{"type":"string","title":"GABON","enum":["https://demo.com/attr/relto/value/gab"]},{"type":"string","title":"GEORGIA","enum":["https://demo.com/attr/relto/value/geo"]},{"type":"string","title":"GUERNSEY","enum":["https://demo.com/attr/relto/value/ggy"]},{"type":"string","title":"GHANA","enum":["https://demo.com/attr/relto/value/gha"]},{"type":"string","title":"GIBRALTAR","enum":["https://demo.com/attr/relto/value/gib"]},{"type":"string","title":"GUINEA","enum":["https://demo.com/attr/relto/value/gin"]},{"type":"string","title":"GUADELOUPE","enum":["https://demo.com/attr/relto/value/glp"]},{"type":"string","title":"GAMBIA, THE","enum":["https://demo.com/attr/relto/value/gmb"]},{"type":"string","title":"GUINEA-BISSAU","enum":["https://demo.com/attr/relto/value/gnb"]},{"type":"string","title":"EQUATORIAL GUINEA","enum":["https://demo.com/attr/relto/value/gnq"]},{"type":"string","title":"GREECE","enum":["https://demo.com/attr/relto/value/grc"]},{"type":"string","title":"GRENADA","enum":["https://demo.com/attr/relto/value/grd"]},{"type":"string","title":"GREENLAND","enum":["https://demo.com/attr/relto/value/grl"]},{"type":"string","title":"GUATEMALA","enum":["https://demo.com/attr/relto/value/gtm"]},{"type":"string","title":"FRENCH GUIANA","enum":["https://demo.com/attr/relto/value/guf"]},{"type":"string","title":"GUAM","enum":["https://demo.com/attr/relto/value/gum"]},{"type":"string","title":"GUYANA","enum":["https://demo.com/attr/relto/value/guy"]},{"type":"string","title":"HONG KONG","enum":["https://demo.com/attr/relto/value/hkg"]},{"type":"string","title":"HEARD ISLAND AND MCDONALD ISLANDS","enum":["https://demo.com/attr/relto/value/hmd"]},{"type":"string","title":"HONDURAS","enum":["https://demo.com/attr/relto/value/hnd"]},{"type":"string","title":"CROATIA","enum":["https://demo.com/attr/relto/value/hrv"]},{"type":"string","title":"HAITI","enum":["https://demo.com/attr/relto/value/hti"]},{"type":"string","title":"HUNGARY","enum":["https://demo.com/attr/relto/value/hun"]},{"type":"string","title":"INDONESIA","enum":["https://demo.com/attr/relto/value/idn"]},{"type":"string","title":"ISLE OF MAN","enum":["https://demo.com/attr/relto/value/imn"]},{"type":"string","title":"INDIA","enum":["https://demo.com/attr/relto/value/ind"]},{"type":"string","title":"BRITISH INDIAN OCEAN TERRITORY","enum":["https://demo.com/attr/relto/value/iot"]},{"type":"string","title":"IRELAND","enum":["https://demo.com/attr/relto/value/irl"]},{"type":"string","title":"IRAN","enum":["https://demo.com/attr/relto/value/irn"]},{"type":"string","title":"IRAQ","enum":["https://demo.com/attr/relto/value/irq"]},{"type":"string","title":"ICELAND","enum":["https://demo.com/attr/relto/value/isl"]},{"type":"string","title":"ISRAEL","enum":["https://demo.com/attr/relto/value/isr"]},{"type":"string","title":"ITALY","enum":["https://demo.com/attr/relto/value/ita"]},{"type":"string","title":"JAMAICA","enum":["https://demo.com/attr/relto/value/jam"]},{"type":"string","title":"JERSEY","enum":["https://demo.com/attr/relto/value/jey"]},{"type":"string","title":"JORDAN","enum":["https://demo.com/attr/relto/value/jor"]},{"type":"string","title":"JAPAN","enum":["https://demo.com/attr/relto/value/jpn"]},{"type":"string","title":"KAZAKHSTAN","enum":["https://demo.com/attr/relto/value/kaz"]},{"type":"string","title":"KENYA","enum":["https://demo.com/attr/relto/value/ken"]},{"type":"string","title":"KYRGYZSTAN","enum":["https://demo.com/attr/relto/value/kgz"]},{"type":"string","title":"CAMBODIA","enum":["https://demo.com/attr/relto/value/khm"]},{"type":"string","title":"KIRIBATI","enum":["https://demo.com/attr/relto/value/kir"]},{"type":"string","title":"SAINT KITTS AND NEVIS","enum":["https://demo.com/attr/relto/value/kna"]},{"type":"string","title":"KOREA, SOUTH","enum":["https://demo.com/attr/relto/value/kor"]},{"type":"string","title":"KUWAIT","enum":["https://demo.com/attr/relto/value/kwt"]},{"type":"string","title":"LAOS","enum":["https://demo.com/attr/relto/value/lao"]},{"type":"string","title":"LEBANON","enum":["https://demo.com/attr/relto/value/lbn"]},{"type":"string","title":"LIBERIA","enum":["https://demo.com/attr/relto/value/lbr"]},{"type":"string","title":"LIBYA","enum":["https://demo.com/attr/relto/value/lby"]},{"type":"string","title":"SAINT LUCIA","enum":["https://demo.com/attr/relto/value/lca"]},{"type":"string","title":"LIECHTENSTEIN","enum":["https://demo.com/attr/relto/value/lie"]},{"type":"string","title":"SRI LANKA","enum":["https://demo.com/attr/relto/value/lka"]},{"type":"string","title":"LESOTHO","enum":["https://demo.com/attr/relto/value/lso"]},{"type":"string","title":"LITHUANIA","enum":["https://demo.com/attr/relto/value/ltu"]},{"type":"string","title":"LUXEMBOURG","enum":["https://demo.com/attr/relto/value/lux"]},{"type":"string","title":"LATVIA","enum":["https://demo.com/attr/relto/value/lva"]},{"type":"string","title":"MACAU","enum":["https://demo.com/attr/relto/value/mac"]},{"type":"string","title":"SAINT MARTIN","enum":["https://demo.com/attr/relto/value/maf"]},{"type":"string","title":"MOROCCO","enum":["https://demo.com/attr/relto/value/mar"]},{"type":"string","title":"MONACO","enum":["https://demo.com/attr/relto/value/mco"]},{"type":"string","title":"MOLDOVA","enum":["https://demo.com/attr/relto/value/mda"]},{"type":"string","title":"MADAGASCAR","enum":["https://demo.com/attr/relto/value/mdg"]},{"type":"string","title":"MALDIVES","enum":["https://demo.com/attr/relto/value/mdv"]},{"type":"string","title":"MEXICO","enum":["https://demo.com/attr/relto/value/mex"]},{"type":"string","title":"MARSHALL ISLANDS","enum":["https://demo.com/attr/relto/value/mhl"]},{"type":"string","title":"MACEDONIA","enum":["https://demo.com/attr/relto/value/mkd"]},{"type":"string","title":"MALI","enum":["https://demo.com/attr/relto/value/mli"]},{"type":"string","title":"MALTA","enum":["https://demo.com/attr/relto/value/mlt"]},{"type":"string","title":"BURMA","enum":["https://demo.com/attr/relto/value/mmr"]},{"type":"string","title":"MONTENEGRO","enum":["https://demo.com/attr/relto/value/mne"]},{"type":"string","title":"MONGOLIA","enum":["https://demo.com/attr/relto/value/mng"]},{"type":"string","title":"NORTHERN MARIANA ISLANDS","enum":["https://demo.com/attr/relto/value/mnp"]},{"type":"string","title":"MOZAMBIQUE","enum":["https://demo.com/attr/relto/value/moz"]},{"type":"string","title":"MAURITANIA","enum":["https://demo.com/attr/relto/value/mrt"]},{"type":"string","title":"MONTSERRAT","enum":["https://demo.com/attr/relto/value/msr"]},{"type":"string","title":"MARTINIQUE","enum":["https://demo.com/attr/relto/value/mtq"]},{"type":"string","title":"MAURITIUS","enum":["https://demo.com/attr/relto/value/mus"]},{"type":"string","title":"MALAWI","enum":["https://demo.com/attr/relto/value/mwi"]},{"type":"string","title":"MALAYSIA","enum":["https://demo.com/attr/relto/value/mys"]},{"type":"string","title":"MAYOTTE","enum":["https://demo.com/attr/relto/value/myt"]},{"type":"string","title":"NAMIBIA","enum":["https://demo.com/attr/relto/value/nam"]},{"type":"string","title":"NEW CALEDONIA","enum":["https://demo.com/attr/relto/value/ncl"]},{"type":"string","title":"NIGER","enum":["https://demo.com/attr/relto/value/ner"]},{"type":"string","title":"NORFOLK ISLAND","enum":["https://demo.com/attr/relto/value/nfk"]},{"type":"string","title":"NIGERIA","enum":["https://demo.com/attr/relto/value/nga"]},{"type":"string","title":"NICARAGUA","enum":["https://demo.com/attr/relto/value/nic"]},{"type":"string","title":"NIUE","enum":["https://demo.com/attr/relto/value/niu"]},{"type":"string","title":"NETHERLANDS","enum":["https://demo.com/attr/relto/value/nld"]},{"type":"string","title":"NORWAY","enum":["https://demo.com/attr/relto/value/nor"]},{"type":"string","title":"NEPAL","enum":["https://demo.com/attr/relto/value/npl"]},{"type":"string","title":"NAURU","enum":["https://demo.com/attr/relto/value/nru"]},{"type":"string","title":"NEW ZEALAND","enum":["https://demo.com/attr/relto/value/nzl"]},{"type":"string","title":"OMAN","enum":["https://demo.com/attr/relto/value/omn"]},{"type":"string","title":"PAKISTAN","enum":["https://demo.com/attr/relto/value/pak"]},{"type":"string","title":"PANAMA","enum":["https://demo.com/attr/relto/value/pan"]},{"type":"string","title":"PITCAIRN ISLANDS","enum":["https://demo.com/attr/relto/value/pcn"]},{"type":"string","title":"PERU","enum":["https://demo.com/attr/relto/value/per"]},{"type":"string","title":"PHILIPPINES","enum":["https://demo.com/attr/relto/value/phl"]},{"type":"string","title":"PALAU","enum":["https://demo.com/attr/relto/value/plw"]},{"type":"string","title":"PAPUA NEW GUINEA","enum":["https://demo.com/attr/relto/value/png"]},{"type":"string","title":"POLAND","enum":["https://demo.com/attr/relto/value/pol"]},{"type":"string","title":"PUERTO RICO","enum":["https://demo.com/attr/relto/value/pri"]},{"type":"string","title":"KOREA, NORTH","enum":["https://demo.com/attr/relto/value/prk"]},{"type":"string","title":"PORTUGAL","enum":["https://demo.com/attr/relto/value/prt"]},{"type":"string","title":"PARAGUAY","enum":["https://demo.com/attr/relto/value/pry"]},{"type":"string","title":"PALESTINE","enum":["https://demo.com/attr/relto/value/pse"]},{"type":"string","title":"FRENCH POLYNESIA","enum":["https://demo.com/attr/relto/value/pyf"]},{"type":"string","title":"QATAR","enum":["https://demo.com/attr/relto/value/qat"]},{"type":"string","title":"REUNION","enum":["https://demo.com/attr/relto/value/reu"]},{"type":"string","title":"ROMANIA","enum":["https://demo.com/attr/relto/value/rou"]},{"type":"string","title":"RUSSIA","enum":["https://demo.com/attr/relto/value/rus"]},{"type":"string","title":"RWANDA","enum":["https://demo.com/attr/relto/value/rwa"]},{"type":"string","title":"SAUDI ARABIA","enum":["https://demo.com/attr/relto/value/sau"]},{"type":"string","title":"SUDAN","enum":["https://demo.com/attr/relto/value/sdn"]},{"type":"string","title":"SENEGAL","enum":["https://demo.com/attr/relto/value/sen"]},{"type":"string","title":"SINGAPORE","enum":["https://demo.com/attr/relto/value/sgp"]},{"type":"string","title":"SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS","enum":["https://demo.com/attr/relto/value/sgs"]},{"type":"string","title":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA","enum":["https://demo.com/attr/relto/value/shn"]},{"type":"string","title":"SVALBARD","enum":["https://demo.com/attr/relto/value/sjm"]},{"type":"string","title":"SOLOMON ISLANDS","enum":["https://demo.com/attr/relto/value/slb"]},{"type":"string","title":"SIERRA LEONE","enum":["https://demo.com/attr/relto/value/sle"]},{"type":"string","title":"EL SALVADOR","enum":["https://demo.com/attr/relto/value/slv"]},{"type":"string","title":"SAN MARINO","enum":["https://demo.com/attr/relto/value/smr"]},{"type":"string","title":"SOMALIA","enum":["https://demo.com/attr/relto/value/som"]},{"type":"string","title":"SAINT PIERRE AND MIQUELON","enum":["https://demo.com/attr/relto/value/spm"]},{"type":"string","title":"SERBIA","enum":["https://demo.com/attr/relto/value/srb"]},{"type":"string","title":"SOUTH SUDAN","enum":["https://demo.com/attr/relto/value/ssd"]},{"type":"string","title":"SAO TOME AND PRINCIPE","enum":["https://demo.com/attr/relto/value/stp"]},{"type":"string","title":"SURINAME","enum":["https://demo.com/attr/relto/value/sur"]},{"type":"string","title":"SLOVAKIA","enum":["https://demo.com/attr/relto/value/svk"]},{"type":"string","title":"SLOVENIA","enum":["https://demo.com/attr/relto/value/svn"]},{"type":"string","title":"SWEDEN","enum":["https://demo.com/attr/relto/value/swe"]},{"type":"string","title":"SWAZILAND","enum":["https://demo.com/attr/relto/value/swz"]},{"type":"string","title":"SINT MAARTEN","enum":["https://demo.com/attr/relto/value/sxm"]},{"type":"string","title":"SEYCHELLES","enum":["https://demo.com/attr/relto/value/syc"]},{"type":"string","title":"SYRIA","enum":["https://demo.com/attr/relto/value/syr"]},{"type":"string","title":"TURKS AND CAICOS ISLANDS","enum":["https://demo.com/attr/relto/value/tca"]},{"type":"string","title":"CHAD","enum":["https://demo.com/attr/relto/value/tcd"]},{"type":"string","title":"TOGO","enum":["https://demo.com/attr/relto/value/tgo"]},{"type":"string","title":"THAILAND","enum":["https://demo.com/attr/relto/value/tha"]},{"type":"string","title":"TAJIKISTAN","enum":["https://demo.com/attr/relto/value/tjk"]},{"type":"string","title":"TOKELAU","enum":["https://demo.com/attr/relto/value/tkl"]},{"type":"string","title":"TURKMENISTAN","enum":["https://demo.com/attr/relto/value/tkm"]},{"type":"string","title":"TIMOR-LESTE","enum":["https://demo.com/attr/relto/value/tls"]},{"type":"string","title":"TONGA","enum":["https://demo.com/attr/relto/value/ton"]},{"type":"string","title":"TRINIDAD AND TOBAGO","enum":["https://demo.com/attr/relto/value/tto"]},{"type":"string","title":"TUNISIA","enum":["https://demo.com/attr/relto/value/tun"]},{"type":"string","title":"TURKEY","enum":["https://demo.com/attr/relto/value/tur"]},{"type":"string","title":"TUVALU","enum":["https://demo.com/attr/relto/value/tuv"]},{"type":"string","title":"TAIWAN","enum":["https://demo.com/attr/relto/value/twn"]},{"type":"string","title":"TANZANIA","enum":["https://demo.com/attr/relto/value/tza"]},{"type":"string","title":"UGANDA","enum":["https://demo.com/attr/relto/value/uga"]},{"type":"string","title":"UKRAINE","enum":["https://demo.com/attr/relto/value/ukr"]},{"type":"string","title":"US MINOR OUTLYING ISLANDS","enum":["https://demo.com/attr/relto/value/umi"]},{"type":"string","title":"URUGUAY","enum":["https://demo.com/attr/relto/value/ury"]},{"type":"string","title":"UZBEKISTAN","enum":["https://demo.com/attr/relto/value/uzb"]},{"type":"string","title":"VATICAN CITY","enum":["https://demo.com/attr/relto/value/vat"]},{"type":"string","title":"SAINT VINCENT AND THE GRENADINES","enum":["https://demo.com/attr/relto/value/vct"]},{"type":"string","title":"VENEZUELA","enum":["https://demo.com/attr/relto/value/ven"]},{"type":"string","title":"VIRGIN ISLANDS, BRITISH","enum":["https://demo.com/attr/relto/value/vgb"]},{"type":"string","title":"VIRGIN ISLANDS, U.S.","enum":["https://demo.com/attr/relto/value/vir"]},{"type":"string","title":"VIETNAM","enum":["https://demo.com/attr/relto/value/vnm"]} + ] + }, + "countries": { + "enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"], + "enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}] + }, + "milSymbols": { + "enum":["SUP*------*****","SFP*------*****","SNP*------*****","SHP*------*****","SUP*S-----*****","SFP*S-----*****","SNP*S-----*****","SHP*S-----*****","SUP*V-----*****","SFP*V-----*****","SNP*V-----*****","SHP*V-----*****","SUP*T-----*****","SFP*T-----*****","SNP*T-----*****","SHP*T-----*****","SUP*L-----*****","SFP*L-----*****","SNP*L-----*****","SHP*L-----*****","SUA*------*****","SFA*------*****","SNA*------*****","SHA*------*****","SUA*M-----*****","SFA*M-----*****","SNA*M-----*****","SHA*M-----*****","SUA*MF----*****","SFA*MF----*****","SNA*MF----*****","SHA*MF----*****","SUA*MFB---*****","SFA*MFB---*****","SNA*MFB---*****","SHA*MFB---*****","SUA*MFF---*****","SFA*MFF---*****","SNA*MFF---*****","SHA*MFF---*****","SUA*MFFI--*****","SFA*MFFI--*****","SNA*MFFI--*****","SHA*MFFI--*****","SUA*MFT---*****","SFA*MFT---*****","SNA*MFT---*****","SHA*MFT---*****","SUA*MFA---*****","SFA*MFA---*****","SNA*MFA---*****","SHA*MFA---*****","SUA*MFL---*****","SFA*MFL---*****","SNA*MFL---*****","SHA*MFL---*****","SUA*MFK---*****","SFA*MFK---*****","SNA*MFK---*****","SHA*MFK---*****","SUA*MFKB--*****","SFA*MFKB--*****","SNA*MFKB--*****","SHA*MFKB--*****","SUA*MFKD--*****","SFA*MFKD--*****","SNA*MFKD--*****","SHA*MFKD--*****","SUA*MFC---*****","SFA*MFC---*****","SNA*MFC---*****","SHA*MFC---*****","SUA*MFCL--*****","SFA*MFCL--*****","SNA*MFCL--*****","SHA*MFCL--*****","SUA*MFCM--*****","SFA*MFCM--*****","SNA*MFCM--*****","SHA*MFCM--*****","SUA*MFCH--*****","SFA*MFCH--*****","SNA*MFCH--*****","SHA*MFCH--*****","SUA*MFJ---*****","SFA*MFJ---*****","SNA*MFJ---*****","SHA*MFJ---*****","SUA*MFO---*****","SFA*MFO---*****","SNA*MFO---*****","SHA*MFO---*****","SUA*MFR---*****","SFA*MFR---*****","SNA*MFR---*****","SHA*MFR---*****","SUA*MFRW--*****","SFA*MFRW--*****","SNA*MFRW--*****","SHA*MFRW--*****","SUA*MFRZ--*****","SFA*MFRZ--*****","SNA*MFRZ--*****","SHA*MFRZ--*****","SUA*MFRX--*****","SFA*MFRX--*****","SNA*MFRX--*****","SHA*MFRX--*****","SUA*MFP---*****","SFA*MFP---*****","SNA*MFP---*****","SHA*MFP---*****","SUA*MFPN--*****","SFA*MFPN--*****","SNA*MFPN--*****","SHA*MFPN--*****","SUA*MFPM--*****","SFA*MFPM--*****","SNA*MFPM--*****","SHA*MFPM--*****","SUA*MFU---*****","SFA*MFU---*****","SNA*MFU---*****","SHA*MFU---*****","SUA*MFUL--*****","SFA*MFUL--*****","SNA*MFUL--*****","SHA*MFUL--*****","SUA*MFUM--*****","SFA*MFUM--*****","SNA*MFUM--*****","SHA*MFUM--*****","SUA*MFUH--*****","SFA*MFUH--*****","SNA*MFUH--*****","SHA*MFUH--*****","SUA*MFY---*****","SFA*MFY---*****","SNA*MFY---*****","SHA*MFY---*****","SUA*MFH---*****","SFA*MFH---*****","SNA*MFH---*****","SHA*MFH---*****","SUA*MFD---*****","SFA*MFD---*****","SNA*MFD---*****","SHA*MFD---*****","SUA*MFQ---*****","SFA*MFQ---*****","SNA*MFQ---*****","SHA*MFQ---*****","SUA*MFQA--*****","SFA*MFQA--*****","SNA*MFQA--*****","SHA*MFQA--*****","SUA*MFQB--*****","SFA*MFQB--*****","SNA*MFQB--*****","SHA*MFQB--*****","SUA*MFQC--*****","SFA*MFQC--*****","SNA*MFQC--*****","SHA*MFQC--*****","SUA*MFQD--*****","SFA*MFQD--*****","SNA*MFQD--*****","SHA*MFQD--*****","SUA*MFQF--*****","SFA*MFQF--*****","SNA*MFQF--*****","SHA*MFQF--*****","SUA*MFQH--*****","SFA*MFQH--*****","SNA*MFQH--*****","SHA*MFQH--*****","SUA*MFQJ--*****","SFA*MFQJ--*****","SNA*MFQJ--*****","SHA*MFQJ--*****","SUA*MFQK--*****","SFA*MFQK--*****","SNA*MFQK--*****","SHA*MFQK--*****","SUA*MFQL--*****","SFA*MFQL--*****","SNA*MFQL--*****","SHA*MFQL--*****","SUA*MFQM--*****","SFA*MFQM--*****","SNA*MFQM--*****","SHA*MFQM--*****","SUA*MFQI--*****","SFA*MFQI--*****","SNA*MFQI--*****","SHA*MFQI--*****","SUA*MFQN--*****","SFA*MFQN--*****","SNA*MFQN--*****","SHA*MFQN--*****","SUA*MFQP--*****","SFA*MFQP--*****","SNA*MFQP--*****","SHA*MFQP--*****","SUA*MFQR--*****","SFA*MFQR--*****","SNA*MFQR--*****","SHA*MFQR--*****","SUA*MFQRW-*****","SFA*MFQRW-*****","SNA*MFQRW-*****","SHA*MFQRW-*****","SUA*MFQRZ-*****","SFA*MFQRZ-*****","SNA*MFQRZ-*****","SHA*MFQRZ-*****","SUA*MFQRX-*****","SFA*MFQRX-*****","SNA*MFQRX-*****","SHA*MFQRX-*****","SUA*MFQS--*****","SFA*MFQS--*****","SNA*MFQS--*****","SHA*MFQS--*****","SUA*MFQT--*****","SFA*MFQT--*****","SNA*MFQT--*****","SHA*MFQT--*****","SUA*MFQU--*****","SFA*MFQU--*****","SNA*MFQU--*****","SHA*MFQU--*****","SUA*MFQY--*****","SFA*MFQY--*****","SNA*MFQY--*****","SHA*MFQY--*****","SUA*MFQO--*****","SFA*MFQO--*****","SNA*MFQO--*****","SHA*MFQO--*****","SUA*MFS---*****","SFA*MFS---*****","SNA*MFS---*****","SHA*MFS---*****","SUA*MFM---*****","SFA*MFM---*****","SNA*MFM---*****","SHA*MFM---*****","SUA*MH----*****","SFA*MH----*****","SNA*MH----*****","SHA*MH----*****","SUA*MHA---*****","SFA*MHA---*****","SNA*MHA---*****","SHA*MHA---*****","SUA*MHS---*****","SFA*MHS---*****","SNA*MHS---*****","SHA*MHS---*****","SUA*MHU---*****","SFA*MHU---*****","SNA*MHU---*****","SHA*MHU---*****","SUA*MHUL--*****","SFA*MHUL--*****","SNA*MHUL--*****","SHA*MHUL--*****","SUA*MHUM--*****","SFA*MHUM--*****","SNA*MHUM--*****","SHA*MHUM--*****","SUA*MHUH--*****","SFA*MHUH--*****","SNA*MHUH--*****","SHA*MHUH--*****","SUA*MHI---*****","SFA*MHI---*****","SNA*MHI---*****","SHA*MHI---*****","SUA*MHH---*****","SFA*MHH---*****","SNA*MHH---*****","SHA*MHH---*****","SUA*MHR---*****","SFA*MHR---*****","SNA*MHR---*****","SHA*MHR---*****","SUA*MHQ---*****","SFA*MHQ---*****","SNA*MHQ---*****","SHA*MHQ---*****","SUA*MHC---*****","SFA*MHC---*****","SNA*MHC---*****","SHA*MHC---*****","SUA*MHCL--*****","SFA*MHCL--*****","SNA*MHCL--*****","SHA*MHCL--*****","SUA*MHCM--*****","SFA*MHCM--*****","SNA*MHCM--*****","SHA*MHCM--*****","SUA*MHCH--*****","SFA*MHCH--*****","SNA*MHCH--*****","SHA*MHCH--*****","SUA*MHT---*****","SFA*MHT---*****","SNA*MHT---*****","SHA*MHT---*****","SUA*MHO---*****","SFA*MHO---*****","SNA*MHO---*****","SHA*MHO---*****","SUA*MHM---*****","SFA*MHM---*****","SNA*MHM---*****","SHA*MHM---*****","SUA*MHD---*****","SFA*MHD---*****","SNA*MHD---*****","SHA*MHD---*****","SUA*MHK---*****","SFA*MHK---*****","SNA*MHK---*****","SHA*MHK---*****","SUA*MHJ---*****","SFA*MHJ---*****","SNA*MHJ---*****","SHA*MHJ---*****","SUA*ML----*****","SFA*ML----*****","SNA*ML----*****","SHA*ML----*****","SUA*MV----*****","SFA*MV----*****","SNA*MV----*****","SHA*MV----*****","SUA*ME----*****","SFA*ME----*****","SNA*ME----*****","SHA*ME----*****","SUA*W-----*****","SFA*W-----*****","SNA*W-----*****","SHA*W-----*****","SUA*WM----*****","SFA*WM----*****","SNA*WM----*****","SHA*WM----*****","SUA*WMS---*****","SFA*WMS---*****","SNA*WMS---*****","SHA*WMS---*****","SUA*WMSS--*****","SFA*WMSS--*****","SNA*WMSS--*****","SHA*WMSS--*****","SUA*WMSA--*****","SFA*WMSA--*****","SNA*WMSA--*****","SHA*WMSA--*****","SUA*WMSU--*****","SFA*WMSU--*****","SNA*WMSU--*****","SHA*WMSU--*****","SUA*WMSB--*****","SFA*WMSB--*****","SNA*WMSB--*****","SHA*WMSB--*****","SUA*WMA---*****","SFA*WMA---*****","SNA*WMA---*****","SHA*WMA---*****","SUA*WMAS--*****","SFA*WMAS--*****","SNA*WMAS--*****","SHA*WMAS--*****","SUA*WMAA--*****","SFA*WMAA--*****","SNA*WMAA--*****","SHA*WMAA--*****","SUA*WMAP--*****","SFA*WMAP--*****","SNA*WMAP--*****","SHA*WMAP--*****","SUA*WMU---*****","SFA*WMU---*****","SNA*WMU---*****","SHA*WMU---*****","SUA*WMCM--*****","SFA*WMCM--*****","SNA*WMCM--*****","SHA*WMCM--*****","SUA*WMB---*****","SFA*WMB---*****","SNA*WMB---*****","SHA*WMB---*****","SUA*WB----*****","SFA*WB----*****","SNA*WB----*****","SHA*WB----*****","SUA*WD----*****","SFA*WD----*****","SNA*WD----*****","SHA*WD----*****","SUA*C-----*****","SFA*C-----*****","SNA*C-----*****","SHA*C-----*****","SUA*CF----*****","SFA*CF----*****","SNA*CF----*****","SHA*CF----*****","SUA*CH----*****","SFA*CH----*****","SNA*CH----*****","SHA*CH----*****","SUA*CL----*****","SFA*CL----*****","SNA*CL----*****","SHA*CL----*****","SUG*------*****","SFG*------*****","SNG*------*****","SHG*------*****","SUG*U-----*****","SFG*U-----*****","SNG*U-----*****","SHG*U-----*****","SUG*UC----*****","SFG*UC----*****","SNG*UC----*****","SHG*UC----*****","SUG*UCD---*****","SFG*UCD---*****","SNG*UCD---*****","SHG*UCD---*****","SUG*UCDS--*****","SFG*UCDS--*****","SNG*UCDS--*****","SHG*UCDS--*****","SUG*UCDSC-*****","SFG*UCDSC-*****","SNG*UCDSC-*****","SHG*UCDSC-*****","SUG*UCDSS-*****","SFG*UCDSS-*****","SNG*UCDSS-*****","SHG*UCDSS-*****","SUG*UCDSV-*****","SFG*UCDSV-*****","SNG*UCDSV-*****","SHG*UCDSV-*****","SUG*UCDM--*****","SFG*UCDM--*****","SNG*UCDM--*****","SHG*UCDM--*****","SUG*UCDML-*****","SFG*UCDML-*****","SNG*UCDML-*****","SHG*UCDML-*****","SUG*UCDMLA*****","SFG*UCDMLA*****","SNG*UCDMLA*****","SHG*UCDMLA*****","SUG*UCDMM-*****","SFG*UCDMM-*****","SNG*UCDMM-*****","SHG*UCDMM-*****","SUG*UCDMH-*****","SFG*UCDMH-*****","SNG*UCDMH-*****","SHG*UCDMH-*****","SUG*UCDH--*****","SFG*UCDH--*****","SNG*UCDH--*****","SHG*UCDH--*****","SUG*UCDHH-*****","SFG*UCDHH-*****","SNG*UCDHH-*****","SHG*UCDHH-*****","SUG*UCDHP-*****","SFG*UCDHP-*****","SNG*UCDHP-*****","SHG*UCDHP-*****","SUG*UCDG--*****","SFG*UCDG--*****","SNG*UCDG--*****","SHG*UCDG--*****","SUG*UCDC--*****","SFG*UCDC--*****","SNG*UCDC--*****","SHG*UCDC--*****","SUG*UCDT--*****","SFG*UCDT--*****","SNG*UCDT--*****","SHG*UCDT--*****","SUG*UCDO--*****","SFG*UCDO--*****","SNG*UCDO--*****","SHG*UCDO--*****","SUG*UCA---*****","SFG*UCA---*****","SNG*UCA---*****","SHG*UCA---*****","SUG*UCAT--*****","SFG*UCAT--*****","SNG*UCAT--*****","SHG*UCAT--*****","SUG*UCATA-*****","SFG*UCATA-*****","SNG*UCATA-*****","SHG*UCATA-*****","SUG*UCATW-*****","SFG*UCATW-*****","SNG*UCATW-*****","SHG*UCATW-*****","SUG*UCATWR*****","SFG*UCATWR*****","SNG*UCATWR*****","SHG*UCATWR*****","SUG*UCATL-*****","SFG*UCATL-*****","SNG*UCATL-*****","SHG*UCATL-*****","SUG*UCATM-*****","SFG*UCATM-*****","SNG*UCATM-*****","SHG*UCATM-*****","SUG*UCATH-*****","SFG*UCATH-*****","SNG*UCATH-*****","SHG*UCATH-*****","SUG*UCATR-*****","SFG*UCATR-*****","SNG*UCATR-*****","SHG*UCATR-*****","SUG*UCAW--*****","SFG*UCAW--*****","SNG*UCAW--*****","SHG*UCAW--*****","SUG*UCAWS-*****","SFG*UCAWS-*****","SNG*UCAWS-*****","SHG*UCAWS-*****","SUG*UCAWA-*****","SFG*UCAWA-*****","SNG*UCAWA-*****","SHG*UCAWA-*****","SUG*UCAWW-*****","SFG*UCAWW-*****","SNG*UCAWW-*****","SHG*UCAWW-*****","SUG*UCAWWR*****","SFG*UCAWWR*****","SNG*UCAWWR*****","SHG*UCAWWR*****","SUG*UCAWL-*****","SFG*UCAWL-*****","SNG*UCAWL-*****","SHG*UCAWL-*****","SUG*UCAWM-*****","SFG*UCAWM-*****","SNG*UCAWM-*****","SHG*UCAWM-*****","SUG*UCAWH-*****","SFG*UCAWH-*****","SNG*UCAWH-*****","SHG*UCAWH-*****","SUG*UCAWR-*****","SFG*UCAWR-*****","SNG*UCAWR-*****","SHG*UCAWR-*****","SUG*UCAA--*****","SFG*UCAA--*****","SNG*UCAA--*****","SHG*UCAA--*****","SUG*UCAAD-*****","SFG*UCAAD-*****","SNG*UCAAD-*****","SHG*UCAAD-*****","SUG*UCAAL-*****","SFG*UCAAL-*****","SNG*UCAAL-*****","SHG*UCAAL-*****","SUG*UCAAM-*****","SFG*UCAAM-*****","SNG*UCAAM-*****","SHG*UCAAM-*****","SUG*UCAAS-*****","SFG*UCAAS-*****","SNG*UCAAS-*****","SHG*UCAAS-*****","SUG*UCAAU-*****","SFG*UCAAU-*****","SNG*UCAAU-*****","SHG*UCAAU-*****","SUG*UCAAC-*****","SFG*UCAAC-*****","SNG*UCAAC-*****","SHG*UCAAC-*****","SUG*UCAAA-*****","SFG*UCAAA-*****","SNG*UCAAA-*****","SHG*UCAAA-*****","SUG*UCAAAT*****","SFG*UCAAAT*****","SNG*UCAAAT*****","SHG*UCAAAT*****","SUG*UCAAAW*****","SFG*UCAAAW*****","SNG*UCAAAW*****","SHG*UCAAAW*****","SUG*UCAAAS*****","SFG*UCAAAS*****","SNG*UCAAAS*****","SHG*UCAAAS*****","SUG*UCAAO-*****","SFG*UCAAO-*****","SNG*UCAAO-*****","SHG*UCAAO-*****","SUG*UCAAOS*****","SFG*UCAAOS*****","SNG*UCAAOS*****","SHG*UCAAOS*****","SUG*UCV---*****","SFG*UCV---*****","SNG*UCV---*****","SHG*UCV---*****","SUG*UCVF--*****","SFG*UCVF--*****","SNG*UCVF--*****","SHG*UCVF--*****","SUG*UCVFU-*****","SFG*UCVFU-*****","SNG*UCVFU-*****","SHG*UCVFU-*****","SUG*UCVFA-*****","SFG*UCVFA-*****","SNG*UCVFA-*****","SHG*UCVFA-*****","SUG*UCVFR-*****","SFG*UCVFR-*****","SNG*UCVFR-*****","SHG*UCVFR-*****","SUG*UCVR--*****","SFG*UCVR--*****","SNG*UCVR--*****","SHG*UCVR--*****","SUG*UCVRA-*****","SFG*UCVRA-*****","SNG*UCVRA-*****","SHG*UCVRA-*****","SUG*UCVRS-*****","SFG*UCVRS-*****","SNG*UCVRS-*****","SHG*UCVRS-*****","SUG*UCVRW-*****","SFG*UCVRW-*****","SNG*UCVRW-*****","SHG*UCVRW-*****","SUG*UCVRU-*****","SFG*UCVRU-*****","SNG*UCVRU-*****","SHG*UCVRU-*****","SUG*UCVRUL*****","SFG*UCVRUL*****","SNG*UCVRUL*****","SHG*UCVRUL*****","SUG*UCVRUM*****","SFG*UCVRUM*****","SNG*UCVRUM*****","SHG*UCVRUM*****","SUG*UCVRUH*****","SFG*UCVRUH*****","SNG*UCVRUH*****","SHG*UCVRUH*****","SUG*UCVRUC*****","SFG*UCVRUC*****","SNG*UCVRUC*****","SHG*UCVRUC*****","SUG*UCVRUE*****","SFG*UCVRUE*****","SNG*UCVRUE*****","SHG*UCVRUE*****","SUG*UCVRM-*****","SFG*UCVRM-*****","SNG*UCVRM-*****","SHG*UCVRM-*****","SUG*UCVS--*****","SFG*UCVS--*****","SNG*UCVS--*****","SHG*UCVS--*****","SUG*UCVC--*****","SFG*UCVC--*****","SNG*UCVC--*****","SHG*UCVC--*****","SUG*UCVV--*****","SFG*UCVV--*****","SNG*UCVV--*****","SHG*UCVV--*****","SUG*UCVU--*****","SFG*UCVU--*****","SNG*UCVU--*****","SHG*UCVU--*****","SUG*UCVUF-*****","SFG*UCVUF-*****","SNG*UCVUF-*****","SHG*UCVUF-*****","SUG*UCVUR-*****","SFG*UCVUR-*****","SNG*UCVUR-*****","SHG*UCVUR-*****","SUG*UCI---*****","SFG*UCI---*****","SNG*UCI---*****","SHG*UCI---*****","SUG*UCIL--*****","SFG*UCIL--*****","SNG*UCIL--*****","SHG*UCIL--*****","SUG*UCIM--*****","SFG*UCIM--*****","SNG*UCIM--*****","SHG*UCIM--*****","SUG*UCIO--*****","SFG*UCIO--*****","SNG*UCIO--*****","SHG*UCIO--*****","SUG*UCIA--*****","SFG*UCIA--*****","SNG*UCIA--*****","SHG*UCIA--*****","SUG*UCIS--*****","SFG*UCIS--*****","SNG*UCIS--*****","SHG*UCIS--*****","SUG*UCIZ--*****","SFG*UCIZ--*****","SNG*UCIZ--*****","SHG*UCIZ--*****","SUG*UCIN--*****","SFG*UCIN--*****","SNG*UCIN--*****","SHG*UCIN--*****","SUG*UCII--*****","SFG*UCII--*****","SNG*UCII--*****","SHG*UCII--*****","SUG*UCIC--*****","SFG*UCIC--*****","SNG*UCIC--*****","SHG*UCIC--*****","SUG*UCE---*****","SFG*UCE---*****","SNG*UCE---*****","SHG*UCE---*****","SUG*UCEC--*****","SFG*UCEC--*****","SNG*UCEC--*****","SHG*UCEC--*****","SUG*UCECS-*****","SFG*UCECS-*****","SNG*UCECS-*****","SHG*UCECS-*****","SUG*UCECA-*****","SFG*UCECA-*****","SNG*UCECA-*****","SHG*UCECA-*****","SUG*UCECC-*****","SFG*UCECC-*****","SNG*UCECC-*****","SHG*UCECC-*****","SUG*UCECL-*****","SFG*UCECL-*****","SNG*UCECL-*****","SHG*UCECL-*****","SUG*UCECM-*****","SFG*UCECM-*****","SNG*UCECM-*****","SHG*UCECM-*****","SUG*UCECH-*****","SFG*UCECH-*****","SNG*UCECH-*****","SHG*UCECH-*****","SUG*UCECT-*****","SFG*UCECT-*****","SNG*UCECT-*****","SHG*UCECT-*****","SUG*UCECW-*****","SFG*UCECW-*****","SNG*UCECW-*****","SHG*UCECW-*****","SUG*UCECO-*****","SFG*UCECO-*****","SNG*UCECO-*****","SHG*UCECO-*****","SUG*UCECR-*****","SFG*UCECR-*****","SNG*UCECR-*****","SHG*UCECR-*****","SUG*UCEN--*****","SFG*UCEN--*****","SNG*UCEN--*****","SHG*UCEN--*****","SUG*UCENN-*****","SFG*UCENN-*****","SNG*UCENN-*****","SHG*UCENN-*****","SUG*UCF---*****","SFG*UCF---*****","SNG*UCF---*****","SHG*UCF---*****","SUG*UCFH--*****","SFG*UCFH--*****","SNG*UCFH--*****","SHG*UCFH--*****","SUG*UCFHE-*****","SFG*UCFHE-*****","SNG*UCFHE-*****","SHG*UCFHE-*****","SUG*UCFHS-*****","SFG*UCFHS-*****","SNG*UCFHS-*****","SHG*UCFHS-*****","SUG*UCFHA-*****","SFG*UCFHA-*****","SNG*UCFHA-*****","SHG*UCFHA-*****","SUG*UCFHC-*****","SFG*UCFHC-*****","SNG*UCFHC-*****","SHG*UCFHC-*****","SUG*UCFHO-*****","SFG*UCFHO-*****","SNG*UCFHO-*****","SHG*UCFHO-*****","SUG*UCFHL-*****","SFG*UCFHL-*****","SNG*UCFHL-*****","SHG*UCFHL-*****","SUG*UCFHM-*****","SFG*UCFHM-*****","SNG*UCFHM-*****","SHG*UCFHM-*****","SUG*UCFHH-*****","SFG*UCFHH-*****","SNG*UCFHH-*****","SHG*UCFHH-*****","SUG*UCFHX-*****","SFG*UCFHX-*****","SNG*UCFHX-*****","SHG*UCFHX-*****","SUG*UCFR--*****","SFG*UCFR--*****","SNG*UCFR--*****","SHG*UCFR--*****","SUG*UCFRS-*****","SFG*UCFRS-*****","SNG*UCFRS-*****","SHG*UCFRS-*****","SUG*UCFRSS*****","SFG*UCFRSS*****","SNG*UCFRSS*****","SHG*UCFRSS*****","SUG*UCFRSR*****","SFG*UCFRSR*****","SNG*UCFRSR*****","SHG*UCFRSR*****","SUG*UCFRST*****","SFG*UCFRST*****","SNG*UCFRST*****","SHG*UCFRST*****","SUG*UCFRM-*****","SFG*UCFRM-*****","SNG*UCFRM-*****","SHG*UCFRM-*****","SUG*UCFRMS*****","SFG*UCFRMS*****","SNG*UCFRMS*****","SHG*UCFRMS*****","SUG*UCFRMR*****","SFG*UCFRMR*****","SNG*UCFRMR*****","SHG*UCFRMR*****","SUG*UCFRMT*****","SFG*UCFRMT*****","SNG*UCFRMT*****","SHG*UCFRMT*****","SUG*UCFT--*****","SFG*UCFT--*****","SNG*UCFT--*****","SHG*UCFT--*****","SUG*UCFTR-*****","SFG*UCFTR-*****","SNG*UCFTR-*****","SHG*UCFTR-*****","SUG*UCFTS-*****","SFG*UCFTS-*****","SNG*UCFTS-*****","SHG*UCFTS-*****","SUG*UCFTF-*****","SFG*UCFTF-*****","SNG*UCFTF-*****","SHG*UCFTF-*****","SUG*UCFTC-*****","SFG*UCFTC-*****","SNG*UCFTC-*****","SHG*UCFTC-*****","SUG*UCFTCD*****","SFG*UCFTCD*****","SNG*UCFTCD*****","SHG*UCFTCD*****","SUG*UCFTCM*****","SFG*UCFTCM*****","SNG*UCFTCM*****","SHG*UCFTCM*****","SUG*UCFTA-*****","SFG*UCFTA-*****","SNG*UCFTA-*****","SHG*UCFTA-*****","SUG*UCFM--*****","SFG*UCFM--*****","SNG*UCFM--*****","SHG*UCFM--*****","SUG*UCFMS-*****","SFG*UCFMS-*****","SNG*UCFMS-*****","SHG*UCFMS-*****","SUG*UCFMW-*****","SFG*UCFMW-*****","SNG*UCFMW-*****","SHG*UCFMW-*****","SUG*UCFMT-*****","SFG*UCFMT-*****","SNG*UCFMT-*****","SHG*UCFMT-*****","SUG*UCFMTA*****","SFG*UCFMTA*****","SNG*UCFMTA*****","SHG*UCFMTA*****","SUG*UCFMTS*****","SFG*UCFMTS*****","SNG*UCFMTS*****","SHG*UCFMTS*****","SUG*UCFMTC*****","SFG*UCFMTC*****","SNG*UCFMTC*****","SHG*UCFMTC*****","SUG*UCFMTO*****","SFG*UCFMTO*****","SNG*UCFMTO*****","SHG*UCFMTO*****","SUG*UCFML-*****","SFG*UCFML-*****","SNG*UCFML-*****","SHG*UCFML-*****","SUG*UCFS--*****","SFG*UCFS--*****","SNG*UCFS--*****","SHG*UCFS--*****","SUG*UCFSS-*****","SFG*UCFSS-*****","SNG*UCFSS-*****","SHG*UCFSS-*****","SUG*UCFSA-*****","SFG*UCFSA-*****","SNG*UCFSA-*****","SHG*UCFSA-*****","SUG*UCFSL-*****","SFG*UCFSL-*****","SNG*UCFSL-*****","SHG*UCFSL-*****","SUG*UCFSO-*****","SFG*UCFSO-*****","SNG*UCFSO-*****","SHG*UCFSO-*****","SUG*UCFO--*****","SFG*UCFO--*****","SNG*UCFO--*****","SHG*UCFO--*****","SUG*UCFOS-*****","SFG*UCFOS-*****","SNG*UCFOS-*****","SHG*UCFOS-*****","SUG*UCFOA-*****","SFG*UCFOA-*****","SNG*UCFOA-*****","SHG*UCFOA-*****","SUG*UCFOL-*****","SFG*UCFOL-*****","SNG*UCFOL-*****","SHG*UCFOL-*****","SUG*UCFOO-*****","SFG*UCFOO-*****","SNG*UCFOO-*****","SHG*UCFOO-*****","SUG*UCR---*****","SFG*UCR---*****","SNG*UCR---*****","SHG*UCR---*****","SUG*UCRH--*****","SFG*UCRH--*****","SNG*UCRH--*****","SHG*UCRH--*****","SUG*UCRV--*****","SFG*UCRV--*****","SNG*UCRV--*****","SHG*UCRV--*****","SUG*UCRVA-*****","SFG*UCRVA-*****","SNG*UCRVA-*****","SHG*UCRVA-*****","SUG*UCRVM-*****","SFG*UCRVM-*****","SNG*UCRVM-*****","SHG*UCRVM-*****","SUG*UCRVG-*****","SFG*UCRVG-*****","SNG*UCRVG-*****","SHG*UCRVG-*****","SUG*UCRVO-*****","SFG*UCRVO-*****","SNG*UCRVO-*****","SHG*UCRVO-*****","SUG*UCRC--*****","SFG*UCRC--*****","SNG*UCRC--*****","SHG*UCRC--*****","SUG*UCRS--*****","SFG*UCRS--*****","SNG*UCRS--*****","SHG*UCRS--*****","SUG*UCRA--*****","SFG*UCRA--*****","SNG*UCRA--*****","SHG*UCRA--*****","SUG*UCRO--*****","SFG*UCRO--*****","SNG*UCRO--*****","SHG*UCRO--*****","SUG*UCRL--*****","SFG*UCRL--*****","SNG*UCRL--*****","SHG*UCRL--*****","SUG*UCRR--*****","SFG*UCRR--*****","SNG*UCRR--*****","SHG*UCRR--*****","SUG*UCRRD-*****","SFG*UCRRD-*****","SNG*UCRRD-*****","SHG*UCRRD-*****","SUG*UCRRF-*****","SFG*UCRRF-*****","SNG*UCRRF-*****","SHG*UCRRF-*****","SUG*UCRRL-*****","SFG*UCRRL-*****","SNG*UCRRL-*****","SHG*UCRRL-*****","SUG*UCRX--*****","SFG*UCRX--*****","SNG*UCRX--*****","SHG*UCRX--*****","SUG*UCM---*****","SFG*UCM---*****","SNG*UCM---*****","SHG*UCM---*****","SUG*UCMT--*****","SFG*UCMT--*****","SNG*UCMT--*****","SHG*UCMT--*****","SUG*UCMS--*****","SFG*UCMS--*****","SNG*UCMS--*****","SHG*UCMS--*****","SUG*UCS---*****","SFG*UCS---*****","SNG*UCS---*****","SHG*UCS---*****","SUG*UCSW--*****","SFG*UCSW--*****","SNG*UCSW--*****","SHG*UCSW--*****","SUG*UCSG--*****","SFG*UCSG--*****","SNG*UCSG--*****","SHG*UCSG--*****","SUG*UCSGD-*****","SFG*UCSGD-*****","SNG*UCSGD-*****","SHG*UCSGD-*****","SUG*UCSGM-*****","SFG*UCSGM-*****","SNG*UCSGM-*****","SHG*UCSGM-*****","SUG*UCSGA-*****","SFG*UCSGA-*****","SNG*UCSGA-*****","SHG*UCSGA-*****","SUG*UCSM--*****","SFG*UCSM--*****","SNG*UCSM--*****","SHG*UCSM--*****","SUG*UCSR--*****","SFG*UCSR--*****","SNG*UCSR--*****","SHG*UCSR--*****","SUG*UCSA--*****","SFG*UCSA--*****","SNG*UCSA--*****","SHG*UCSA--*****","SUG*UU----*****","SFG*UU----*****","SNG*UU----*****","SHG*UU----*****","SUG*UUA---*****","SFG*UUA---*****","SNG*UUA---*****","SHG*UUA---*****","SUG*UUAC--*****","SFG*UUAC--*****","SNG*UUAC--*****","SHG*UUAC--*****","SUG*UUACC-*****","SFG*UUACC-*****","SNG*UUACC-*****","SHG*UUACC-*****","SUG*UUACCK*****","SFG*UUACCK*****","SNG*UUACCK*****","SHG*UUACCK*****","SUG*UUACCM*****","SFG*UUACCM*****","SNG*UUACCM*****","SHG*UUACCM*****","SUG*UUACS-*****","SFG*UUACS-*****","SNG*UUACS-*****","SHG*UUACS-*****","SUG*UUACSM*****","SFG*UUACSM*****","SNG*UUACSM*****","SHG*UUACSM*****","SUG*UUACSA*****","SFG*UUACSA*****","SNG*UUACSA*****","SHG*UUACSA*****","SUG*UUACR-*****","SFG*UUACR-*****","SNG*UUACR-*****","SHG*UUACR-*****","SUG*UUACRW*****","SFG*UUACRW*****","SNG*UUACRW*****","SHG*UUACRW*****","SUG*UUACRS*****","SFG*UUACRS*****","SNG*UUACRS*****","SHG*UUACRS*****","SUG*UUAN--*****","SFG*UUAN--*****","SNG*UUAN--*****","SHG*UUAN--*****","SUG*UUAB--*****","SFG*UUAB--*****","SNG*UUAB--*****","SHG*UUAB--*****","SUG*UUABR-*****","SFG*UUABR-*****","SNG*UUABR-*****","SHG*UUABR-*****","SUG*UUAD--*****","SFG*UUAD--*****","SNG*UUAD--*****","SHG*UUAD--*****","SUG*UUM---*****","SFG*UUM---*****","SNG*UUM---*****","SHG*UUM---*****","SUG*UUMA--*****","SFG*UUMA--*****","SNG*UUMA--*****","SHG*UUMA--*****","SUG*UUMS--*****","SFG*UUMS--*****","SNG*UUMS--*****","SHG*UUMS--*****","SUG*UUMSE-*****","SFG*UUMSE-*****","SNG*UUMSE-*****","SHG*UUMSE-*****","SUG*UUMSEA*****","SFG*UUMSEA*****","SNG*UUMSEA*****","SHG*UUMSEA*****","SUG*UUMSED*****","SFG*UUMSED*****","SNG*UUMSED*****","SHG*UUMSED*****","SUG*UUMSEI*****","SFG*UUMSEI*****","SNG*UUMSEI*****","SHG*UUMSEI*****","SUG*UUMSEJ*****","SFG*UUMSEJ*****","SNG*UUMSEJ*****","SHG*UUMSEJ*****","SUG*UUMSET*****","SFG*UUMSET*****","SNG*UUMSET*****","SHG*UUMSET*****","SUG*UUMSEC*****","SFG*UUMSEC*****","SNG*UUMSEC*****","SHG*UUMSEC*****","SUG*UUMC--*****","SFG*UUMC--*****","SNG*UUMC--*****","SHG*UUMC--*****","SUG*UUMR--*****","SFG*UUMR--*****","SNG*UUMR--*****","SHG*UUMR--*****","SUG*UUMRG-*****","SFG*UUMRG-*****","SNG*UUMRG-*****","SHG*UUMRG-*****","SUG*UUMRS-*****","SFG*UUMRS-*****","SNG*UUMRS-*****","SHG*UUMRS-*****","SUG*UUMRSS*****","SFG*UUMRSS*****","SNG*UUMRSS*****","SHG*UUMRSS*****","SUG*UUMRX-*****","SFG*UUMRX-*****","SNG*UUMRX-*****","SHG*UUMRX-*****","SUG*UUMMO-*****","SFG*UUMMO-*****","SNG*UUMMO-*****","SHG*UUMMO-*****","SUG*UUMO--*****","SFG*UUMO--*****","SNG*UUMO--*****","SHG*UUMO--*****","SUG*UUMT--*****","SFG*UUMT--*****","SNG*UUMT--*****","SHG*UUMT--*****","SUG*UUMQ--*****","SFG*UUMQ--*****","SNG*UUMQ--*****","SHG*UUMQ--*****","SUG*UUMJ--*****","SFG*UUMJ--*****","SNG*UUMJ--*****","SHG*UUMJ--*****","SUG*UUL---*****","SFG*UUL---*****","SNG*UUL---*****","SHG*UUL---*****","SUG*UULS--*****","SFG*UULS--*****","SNG*UULS--*****","SHG*UULS--*****","SUG*UULM--*****","SFG*UULM--*****","SNG*UULM--*****","SHG*UULM--*****","SUG*UULC--*****","SFG*UULC--*****","SNG*UULC--*****","SHG*UULC--*****","SUG*UULF--*****","SFG*UULF--*****","SNG*UULF--*****","SHG*UULF--*****","SUG*UULD--*****","SFG*UULD--*****","SNG*UULD--*****","SHG*UULD--*****","SUG*UUS---*****","SFG*UUS---*****","SNG*UUS---*****","SHG*UUS---*****","SUG*UUSA--*****","SFG*UUSA--*****","SNG*UUSA--*****","SHG*UUSA--*****","SUG*UUSC--*****","SFG*UUSC--*****","SNG*UUSC--*****","SHG*UUSC--*****","SUG*UUSCL-*****","SFG*UUSCL-*****","SNG*UUSCL-*****","SHG*UUSCL-*****","SUG*UUSO--*****","SFG*UUSO--*****","SNG*UUSO--*****","SHG*UUSO--*****","SUG*UUSF--*****","SFG*UUSF--*****","SNG*UUSF--*****","SHG*UUSF--*****","SUG*UUSM--*****","SFG*UUSM--*****","SNG*UUSM--*****","SHG*UUSM--*****","SUG*UUSMS-*****","SFG*UUSMS-*****","SNG*UUSMS-*****","SHG*UUSMS-*****","SUG*UUSML-*****","SFG*UUSML-*****","SNG*UUSML-*****","SHG*UUSML-*****","SUG*UUSMN-*****","SFG*UUSMN-*****","SNG*UUSMN-*****","SHG*UUSMN-*****","SUG*UUSR--*****","SFG*UUSR--*****","SNG*UUSR--*****","SHG*UUSR--*****","SUG*UUSRS-*****","SFG*UUSRS-*****","SNG*UUSRS-*****","SHG*UUSRS-*****","SUG*UUSRT-*****","SFG*UUSRT-*****","SNG*UUSRT-*****","SHG*UUSRT-*****","SUG*UUSRW-*****","SFG*UUSRW-*****","SNG*UUSRW-*****","SHG*UUSRW-*****","SUG*UUSS--*****","SFG*UUSS--*****","SNG*UUSS--*****","SHG*UUSS--*****","SUG*UUSW--*****","SFG*UUSW--*****","SNG*UUSW--*****","SHG*UUSW--*****","SUG*UUSX--*****","SFG*UUSX--*****","SNG*UUSX--*****","SHG*UUSX--*****","SUG*UUI---*****","SFG*UUI---*****","SNG*UUI---*****","SHG*UUI---*****","SUG*UUP---*****","SFG*UUP---*****","SNG*UUP---*****","SHG*UUP---*****","SUG*UUE---*****","SFG*UUE---*****","SNG*UUE---*****","SHG*UUE---*****","SUG*US----*****","SFG*US----*****","SNG*US----*****","SHG*US----*****","SUG*USA---*****","SFG*USA---*****","SNG*USA---*****","SHG*USA---*****","SUG*USAT--*****","SFG*USAT--*****","SNG*USAT--*****","SHG*USAT--*****","SUG*USAC--*****","SFG*USAC--*****","SNG*USAC--*****","SHG*USAC--*****","SUG*USAJ--*****","SFG*USAJ--*****","SNG*USAJ--*****","SHG*USAJ--*****","SUG*USAJT-*****","SFG*USAJT-*****","SNG*USAJT-*****","SHG*USAJT-*****","SUG*USAJC-*****","SFG*USAJC-*****","SNG*USAJC-*****","SHG*USAJC-*****","SUG*USAO--*****","SFG*USAO--*****","SNG*USAO--*****","SHG*USAO--*****","SUG*USAOT-*****","SFG*USAOT-*****","SNG*USAOT-*****","SHG*USAOT-*****","SUG*USAOC-*****","SFG*USAOC-*****","SNG*USAOC-*****","SHG*USAOC-*****","SUG*USAF--*****","SFG*USAF--*****","SNG*USAF--*****","SHG*USAF--*****","SUG*USAFT-*****","SFG*USAFT-*****","SNG*USAFT-*****","SHG*USAFT-*****","SUG*USAFC-*****","SFG*USAFC-*****","SNG*USAFC-*****","SHG*USAFC-*****","SUG*USAS--*****","SFG*USAS--*****","SNG*USAS--*****","SHG*USAS--*****","SUG*USAST-*****","SFG*USAST-*****","SNG*USAST-*****","SHG*USAST-*****","SUG*USASC-*****","SFG*USASC-*****","SNG*USASC-*****","SHG*USASC-*****","SUG*USAM--*****","SFG*USAM--*****","SNG*USAM--*****","SHG*USAM--*****","SUG*USAMT-*****","SFG*USAMT-*****","SNG*USAMT-*****","SHG*USAMT-*****","SUG*USAMC-*****","SFG*USAMC-*****","SNG*USAMC-*****","SHG*USAMC-*****","SUG*USAR--*****","SFG*USAR--*****","SNG*USAR--*****","SHG*USAR--*****","SUG*USART-*****","SFG*USART-*****","SNG*USART-*****","SHG*USART-*****","SUG*USARC-*****","SFG*USARC-*****","SNG*USARC-*****","SHG*USARC-*****","SUG*USAP--*****","SFG*USAP--*****","SNG*USAP--*****","SHG*USAP--*****","SUG*USAPT-*****","SFG*USAPT-*****","SNG*USAPT-*****","SHG*USAPT-*****","SUG*USAPC-*****","SFG*USAPC-*****","SNG*USAPC-*****","SHG*USAPC-*****","SUG*USAPB-*****","SFG*USAPB-*****","SNG*USAPB-*****","SHG*USAPB-*****","SUG*USAPBT*****","SFG*USAPBT*****","SNG*USAPBT*****","SHG*USAPBT*****","SUG*USAPBC*****","SFG*USAPBC*****","SNG*USAPBC*****","SHG*USAPBC*****","SUG*USAPM-*****","SFG*USAPM-*****","SNG*USAPM-*****","SHG*USAPM-*****","SUG*USAPMT*****","SFG*USAPMT*****","SNG*USAPMT*****","SHG*USAPMT*****","SUG*USAPMC*****","SFG*USAPMC*****","SNG*USAPMC*****","SHG*USAPMC*****","SUG*USAX--*****","SFG*USAX--*****","SNG*USAX--*****","SHG*USAX--*****","SUG*USAXT-*****","SFG*USAXT-*****","SNG*USAXT-*****","SHG*USAXT-*****","SUG*USAXC-*****","SFG*USAXC-*****","SNG*USAXC-*****","SHG*USAXC-*****","SUG*USAL--*****","SFG*USAL--*****","SNG*USAL--*****","SHG*USAL--*****","SUG*USALT-*****","SFG*USALT-*****","SNG*USALT-*****","SHG*USALT-*****","SUG*USALC-*****","SFG*USALC-*****","SNG*USALC-*****","SHG*USALC-*****","SUG*USAW--*****","SFG*USAW--*****","SNG*USAW--*****","SHG*USAW--*****","SUG*USAWT-*****","SFG*USAWT-*****","SNG*USAWT-*****","SHG*USAWT-*****","SUG*USAWC-*****","SFG*USAWC-*****","SNG*USAWC-*****","SHG*USAWC-*****","SUG*USAQ--*****","SFG*USAQ--*****","SNG*USAQ--*****","SHG*USAQ--*****","SUG*USAQT-*****","SFG*USAQT-*****","SNG*USAQT-*****","SHG*USAQT-*****","SUG*USAQC-*****","SFG*USAQC-*****","SNG*USAQC-*****","SHG*USAQC-*****","SUG*USM---*****","SFG*USM---*****","SNG*USM---*****","SHG*USM---*****","SUG*USMT--*****","SFG*USMT--*****","SNG*USMT--*****","SHG*USMT--*****","SUG*USMC--*****","SFG*USMC--*****","SNG*USMC--*****","SHG*USMC--*****","SUG*USMM--*****","SFG*USMM--*****","SNG*USMM--*****","SHG*USMM--*****","SUG*USMMT-*****","SFG*USMMT-*****","SNG*USMMT-*****","SHG*USMMT-*****","SUG*USMMC-*****","SFG*USMMC-*****","SNG*USMMC-*****","SHG*USMMC-*****","SUG*USMV--*****","SFG*USMV--*****","SNG*USMV--*****","SHG*USMV--*****","SUG*USMVT-*****","SFG*USMVT-*****","SNG*USMVT-*****","SHG*USMVT-*****","SUG*USMVC-*****","SFG*USMVC-*****","SNG*USMVC-*****","SHG*USMVC-*****","SUG*USMD--*****","SFG*USMD--*****","SNG*USMD--*****","SHG*USMD--*****","SUG*USMDT-*****","SFG*USMDT-*****","SNG*USMDT-*****","SHG*USMDT-*****","SUG*USMDC-*****","SFG*USMDC-*****","SNG*USMDC-*****","SHG*USMDC-*****","SUG*USMP--*****","SFG*USMP--*****","SNG*USMP--*****","SHG*USMP--*****","SUG*USMPT-*****","SFG*USMPT-*****","SNG*USMPT-*****","SHG*USMPT-*****","SUG*USMPC-*****","SFG*USMPC-*****","SNG*USMPC-*****","SHG*USMPC-*****","SUG*USS---*****","SFG*USS---*****","SNG*USS---*****","SHG*USS---*****","SUG*USST--*****","SFG*USST--*****","SNG*USST--*****","SHG*USST--*****","SUG*USSC--*****","SFG*USSC--*****","SNG*USSC--*****","SHG*USSC--*****","SUG*USS1--*****","SFG*USS1--*****","SNG*USS1--*****","SHG*USS1--*****","SUG*USS1T-*****","SFG*USS1T-*****","SNG*USS1T-*****","SHG*USS1T-*****","SUG*USS1C-*****","SFG*USS1C-*****","SNG*USS1C-*****","SHG*USS1C-*****","SUG*USS2--*****","SFG*USS2--*****","SNG*USS2--*****","SHG*USS2--*****","SUG*USS2T-*****","SFG*USS2T-*****","SNG*USS2T-*****","SHG*USS2T-*****","SUG*USS2C-*****","SFG*USS2C-*****","SNG*USS2C-*****","SHG*USS2C-*****","SUG*USS3--*****","SFG*USS3--*****","SNG*USS3--*****","SHG*USS3--*****","SUG*USS3T-*****","SFG*USS3T-*****","SNG*USS3T-*****","SHG*USS3T-*****","SUG*USS3C-*****","SFG*USS3C-*****","SNG*USS3C-*****","SHG*USS3C-*****","SUG*USS3A-*****","SFG*USS3A-*****","SNG*USS3A-*****","SHG*USS3A-*****","SUG*USS3AT*****","SFG*USS3AT*****","SNG*USS3AT*****","SHG*USS3AT*****","SUG*USS3AC*****","SFG*USS3AC*****","SNG*USS3AC*****","SHG*USS3AC*****","SUG*USS4--*****","SFG*USS4--*****","SNG*USS4--*****","SHG*USS4--*****","SUG*USS4T-*****","SFG*USS4T-*****","SNG*USS4T-*****","SHG*USS4T-*****","SUG*USS4C-*****","SFG*USS4C-*****","SNG*USS4C-*****","SHG*USS4C-*****","SUG*USS5--*****","SFG*USS5--*****","SNG*USS5--*****","SHG*USS5--*****","SUG*USS5T-*****","SFG*USS5T-*****","SNG*USS5T-*****","SHG*USS5T-*****","SUG*USS5C-*****","SFG*USS5C-*****","SNG*USS5C-*****","SHG*USS5C-*****","SUG*USS6--*****","SFG*USS6--*****","SNG*USS6--*****","SHG*USS6--*****","SUG*USS6T-*****","SFG*USS6T-*****","SNG*USS6T-*****","SHG*USS6T-*****","SUG*USS6C-*****","SFG*USS6C-*****","SNG*USS6C-*****","SHG*USS6C-*****","SUG*USS7--*****","SFG*USS7--*****","SNG*USS7--*****","SHG*USS7--*****","SUG*USS7T-*****","SFG*USS7T-*****","SNG*USS7T-*****","SHG*USS7T-*****","SUG*USS7C-*****","SFG*USS7C-*****","SNG*USS7C-*****","SHG*USS7C-*****","SUG*USS8--*****","SFG*USS8--*****","SNG*USS8--*****","SHG*USS8--*****","SUG*USS8T-*****","SFG*USS8T-*****","SNG*USS8T-*****","SHG*USS8T-*****","SUG*USS8C-*****","SFG*USS8C-*****","SNG*USS8C-*****","SHG*USS8C-*****","SUG*USS9--*****","SFG*USS9--*****","SNG*USS9--*****","SHG*USS9--*****","SUG*USS9T-*****","SFG*USS9T-*****","SNG*USS9T-*****","SHG*USS9T-*****","SUG*USS9C-*****","SFG*USS9C-*****","SNG*USS9C-*****","SHG*USS9C-*****","SUG*USSX--*****","SFG*USSX--*****","SNG*USSX--*****","SHG*USSX--*****","SUG*USSXT-*****","SFG*USSXT-*****","SNG*USSXT-*****","SHG*USSXT-*****","SUG*USSXC-*****","SFG*USSXC-*****","SNG*USSXC-*****","SHG*USSXC-*****","SUG*USSL--*****","SFG*USSL--*****","SNG*USSL--*****","SHG*USSL--*****","SUG*USSLT-*****","SFG*USSLT-*****","SNG*USSLT-*****","SHG*USSLT-*****","SUG*USSLC-*****","SFG*USSLC-*****","SNG*USSLC-*****","SHG*USSLC-*****","SUG*USSW--*****","SFG*USSW--*****","SNG*USSW--*****","SHG*USSW--*****","SUG*USSWT-*****","SFG*USSWT-*****","SNG*USSWT-*****","SHG*USSWT-*****","SUG*USSWC-*****","SFG*USSWC-*****","SNG*USSWC-*****","SHG*USSWC-*****","SUG*USSWP-*****","SFG*USSWP-*****","SNG*USSWP-*****","SHG*USSWP-*****","SUG*USSWPT*****","SFG*USSWPT*****","SNG*USSWPT*****","SHG*USSWPT*****","SUG*USSWPC*****","SFG*USSWPC*****","SNG*USSWPC*****","SHG*USSWPC*****","SUG*UST---*****","SFG*UST---*****","SNG*UST---*****","SHG*UST---*****","SUG*USTT--*****","SFG*USTT--*****","SNG*USTT--*****","SHG*USTT--*****","SUG*USTC--*****","SFG*USTC--*****","SNG*USTC--*****","SHG*USTC--*****","SUG*USTM--*****","SFG*USTM--*****","SNG*USTM--*****","SHG*USTM--*****","SUG*USTMT-*****","SFG*USTMT-*****","SNG*USTMT-*****","SHG*USTMT-*****","SUG*USTMC-*****","SFG*USTMC-*****","SNG*USTMC-*****","SHG*USTMC-*****","SUG*USTR--*****","SFG*USTR--*****","SNG*USTR--*****","SHG*USTR--*****","SUG*USTRT-*****","SFG*USTRT-*****","SNG*USTRT-*****","SHG*USTRT-*****","SUG*USTRC-*****","SFG*USTRC-*****","SNG*USTRC-*****","SHG*USTRC-*****","SUG*USTS--*****","SFG*USTS--*****","SNG*USTS--*****","SHG*USTS--*****","SUG*USTST-*****","SFG*USTST-*****","SNG*USTST-*****","SHG*USTST-*****","SUG*USTSC-*****","SFG*USTSC-*****","SNG*USTSC-*****","SHG*USTSC-*****","SUG*USTA--*****","SFG*USTA--*****","SNG*USTA--*****","SHG*USTA--*****","SUG*USTAT-*****","SFG*USTAT-*****","SNG*USTAT-*****","SHG*USTAT-*****","SUG*USTAC-*****","SFG*USTAC-*****","SNG*USTAC-*****","SHG*USTAC-*****","SUG*USTI--*****","SFG*USTI--*****","SNG*USTI--*****","SHG*USTI--*****","SUG*USTIT-*****","SFG*USTIT-*****","SNG*USTIT-*****","SHG*USTIT-*****","SUG*USTIC-*****","SFG*USTIC-*****","SNG*USTIC-*****","SHG*USTIC-*****","SUG*USX---*****","SFG*USX---*****","SNG*USX---*****","SHG*USX---*****","SUG*USXT--*****","SFG*USXT--*****","SNG*USXT--*****","SHG*USXT--*****","SUG*USXC--*****","SFG*USXC--*****","SNG*USXC--*****","SHG*USXC--*****","SUG*USXH--*****","SFG*USXH--*****","SNG*USXH--*****","SHG*USXH--*****","SUG*USXHT-*****","SFG*USXHT-*****","SNG*USXHT-*****","SHG*USXHT-*****","SUG*USXHC-*****","SFG*USXHC-*****","SNG*USXHC-*****","SHG*USXHC-*****","SUG*USXR--*****","SFG*USXR--*****","SNG*USXR--*****","SHG*USXR--*****","SUG*USXRT-*****","SFG*USXRT-*****","SNG*USXRT-*****","SHG*USXRT-*****","SUG*USXRC-*****","SFG*USXRC-*****","SNG*USXRC-*****","SHG*USXRC-*****","SUG*USXO--*****","SFG*USXO--*****","SNG*USXO--*****","SHG*USXO--*****","SUG*USXOT-*****","SFG*USXOT-*****","SNG*USXOT-*****","SHG*USXOT-*****","SUG*USXOC-*****","SFG*USXOC-*****","SNG*USXOC-*****","SHG*USXOC-*****","SUG*USXOM-*****","SFG*USXOM-*****","SNG*USXOM-*****","SHG*USXOM-*****","SUG*USXOMT*****","SFG*USXOMT*****","SNG*USXOMT*****","SHG*USXOMT*****","SUG*USXOMC*****","SFG*USXOMC*****","SNG*USXOMC*****","SHG*USXOMC*****","SUG*USXE--*****","SFG*USXE--*****","SNG*USXE--*****","SHG*USXE--*****","SUG*USXET-*****","SFG*USXET-*****","SNG*USXET-*****","SHG*USXET-*****","SUG*USXEC-*****","SFG*USXEC-*****","SNG*USXEC-*****","SHG*USXEC-*****","SUG*UH----*****","SFG*UH----*****","SNG*UH----*****","SHG*UH----*****","SUG*E-----*****","SFG*E-----*****","SNG*E-----*****","SHG*E-----*****","SUG*EW----*****","SFG*EW----*****","SNG*EW----*****","SHG*EW----*****","SUG*EWM---*****","SFG*EWM---*****","SNG*EWM---*****","SHG*EWM---*****","SUG*EWMA--*****","SFG*EWMA--*****","SNG*EWMA--*****","SHG*EWMA--*****","SUG*EWMAS-*****","SFG*EWMAS-*****","SNG*EWMAS-*****","SHG*EWMAS-*****","SUG*EWMASR*****","SFG*EWMASR*****","SNG*EWMASR*****","SHG*EWMASR*****","SUG*EWMASE*****","SFG*EWMASE*****","SNG*EWMASE*****","SHG*EWMASE*****","SUG*EWMAI-*****","SFG*EWMAI-*****","SNG*EWMAI-*****","SHG*EWMAI-*****","SUG*EWMAIR*****","SFG*EWMAIR*****","SNG*EWMAIR*****","SHG*EWMAIR*****","SUG*EWMAIE*****","SFG*EWMAIE*****","SNG*EWMAIE*****","SHG*EWMAIE*****","SUG*EWMAL-*****","SFG*EWMAL-*****","SNG*EWMAL-*****","SHG*EWMAL-*****","SUG*EWMALR*****","SFG*EWMALR*****","SNG*EWMALR*****","SHG*EWMALR*****","SUG*EWMALE*****","SFG*EWMALE*****","SNG*EWMALE*****","SHG*EWMALE*****","SUG*EWMAT-*****","SFG*EWMAT-*****","SNG*EWMAT-*****","SHG*EWMAT-*****","SUG*EWMATR*****","SFG*EWMATR*****","SNG*EWMATR*****","SHG*EWMATR*****","SUG*EWMATE*****","SFG*EWMATE*****","SNG*EWMATE*****","SHG*EWMATE*****","SUG*EWMS--*****","SFG*EWMS--*****","SNG*EWMS--*****","SHG*EWMS--*****","SUG*EWMSS-*****","SFG*EWMSS-*****","SNG*EWMSS-*****","SHG*EWMSS-*****","SUG*EWMSI-*****","SFG*EWMSI-*****","SNG*EWMSI-*****","SHG*EWMSI-*****","SUG*EWMSL-*****","SFG*EWMSL-*****","SNG*EWMSL-*****","SHG*EWMSL-*****","SUG*EWMT--*****","SFG*EWMT--*****","SNG*EWMT--*****","SHG*EWMT--*****","SUG*EWMTL-*****","SFG*EWMTL-*****","SNG*EWMTL-*****","SHG*EWMTL-*****","SUG*EWMTM-*****","SFG*EWMTM-*****","SNG*EWMTM-*****","SHG*EWMTM-*****","SUG*EWMTH-*****","SFG*EWMTH-*****","SNG*EWMTH-*****","SHG*EWMTH-*****","SUG*EWS---*****","SFG*EWS---*****","SNG*EWS---*****","SHG*EWS---*****","SUG*EWSL--*****","SFG*EWSL--*****","SNG*EWSL--*****","SHG*EWSL--*****","SUG*EWSM--*****","SFG*EWSM--*****","SNG*EWSM--*****","SHG*EWSM--*****","SUG*EWSH--*****","SFG*EWSH--*****","SNG*EWSH--*****","SHG*EWSH--*****","SUG*EWX---*****","SFG*EWX---*****","SNG*EWX---*****","SHG*EWX---*****","SUG*EWXL--*****","SFG*EWXL--*****","SNG*EWXL--*****","SHG*EWXL--*****","SUG*EWXM--*****","SFG*EWXM--*****","SNG*EWXM--*****","SHG*EWXM--*****","SUG*EWXH--*****","SFG*EWXH--*****","SNG*EWXH--*****","SHG*EWXH--*****","SUG*EWT---*****","SFG*EWT---*****","SNG*EWT---*****","SHG*EWT---*****","SUG*EWTL--*****","SFG*EWTL--*****","SNG*EWTL--*****","SHG*EWTL--*****","SUG*EWTM--*****","SFG*EWTM--*****","SNG*EWTM--*****","SHG*EWTM--*****","SUG*EWTH--*****","SFG*EWTH--*****","SNG*EWTH--*****","SHG*EWTH--*****","SUG*EWR---*****","SFG*EWR---*****","SNG*EWR---*****","SHG*EWR---*****","SUG*EWRR--*****","SFG*EWRR--*****","SNG*EWRR--*****","SHG*EWRR--*****","SUG*EWRL--*****","SFG*EWRL--*****","SNG*EWRL--*****","SHG*EWRL--*****","SUG*EWRH--*****","SFG*EWRH--*****","SNG*EWRH--*****","SHG*EWRH--*****","SUG*EWZ---*****","SFG*EWZ---*****","SNG*EWZ---*****","SHG*EWZ---*****","SUG*EWZL--*****","SFG*EWZL--*****","SNG*EWZL--*****","SHG*EWZL--*****","SUG*EWZM--*****","SFG*EWZM--*****","SNG*EWZM--*****","SHG*EWZM--*****","SUG*EWZH--*****","SFG*EWZH--*****","SNG*EWZH--*****","SHG*EWZH--*****","SUG*EWO---*****","SFG*EWO---*****","SNG*EWO---*****","SHG*EWO---*****","SUG*EWOL--*****","SFG*EWOL--*****","SNG*EWOL--*****","SHG*EWOL--*****","SUG*EWOM--*****","SFG*EWOM--*****","SNG*EWOM--*****","SHG*EWOM--*****","SUG*EWOH--*****","SFG*EWOH--*****","SNG*EWOH--*****","SHG*EWOH--*****","SUG*EWH---*****","SFG*EWH---*****","SNG*EWH---*****","SHG*EWH---*****","SUG*EWHL--*****","SFG*EWHL--*****","SNG*EWHL--*****","SHG*EWHL--*****","SUG*EWHLS-*****","SFG*EWHLS-*****","SNG*EWHLS-*****","SHG*EWHLS-*****","SUG*EWHM--*****","SFG*EWHM--*****","SNG*EWHM--*****","SHG*EWHM--*****","SUG*EWHMS-*****","SFG*EWHMS-*****","SNG*EWHMS-*****","SHG*EWHMS-*****","SUG*EWHH--*****","SFG*EWHH--*****","SNG*EWHH--*****","SHG*EWHH--*****","SUG*EWHHS-*****","SFG*EWHHS-*****","SNG*EWHHS-*****","SHG*EWHHS-*****","SUG*EWG---*****","SFG*EWG---*****","SNG*EWG---*****","SHG*EWG---*****","SUG*EWGL--*****","SFG*EWGL--*****","SNG*EWGL--*****","SHG*EWGL--*****","SUG*EWGM--*****","SFG*EWGM--*****","SNG*EWGM--*****","SHG*EWGM--*****","SUG*EWGH--*****","SFG*EWGH--*****","SNG*EWGH--*****","SHG*EWGH--*****","SUG*EWGR--*****","SFG*EWGR--*****","SNG*EWGR--*****","SHG*EWGR--*****","SUG*EWD---*****","SFG*EWD---*****","SNG*EWD---*****","SHG*EWD---*****","SUG*EWDL--*****","SFG*EWDL--*****","SNG*EWDL--*****","SHG*EWDL--*****","SUG*EWDLS-*****","SFG*EWDLS-*****","SNG*EWDLS-*****","SHG*EWDLS-*****","SUG*EWDM--*****","SFG*EWDM--*****","SNG*EWDM--*****","SHG*EWDM--*****","SUG*EWDMS-*****","SFG*EWDMS-*****","SNG*EWDMS-*****","SHG*EWDMS-*****","SUG*EWDH--*****","SFG*EWDH--*****","SNG*EWDH--*****","SHG*EWDH--*****","SUG*EWDHS-*****","SFG*EWDHS-*****","SNG*EWDHS-*****","SHG*EWDHS-*****","SUG*EWA---*****","SFG*EWA---*****","SNG*EWA---*****","SHG*EWA---*****","SUG*EWAL--*****","SFG*EWAL--*****","SNG*EWAL--*****","SHG*EWAL--*****","SUG*EWAM--*****","SFG*EWAM--*****","SNG*EWAM--*****","SHG*EWAM--*****","SUG*EWAH--*****","SFG*EWAH--*****","SNG*EWAH--*****","SHG*EWAH--*****","SUG*EV----*****","SFG*EV----*****","SNG*EV----*****","SHG*EV----*****","SUG*EVA---*****","SFG*EVA---*****","SNG*EVA---*****","SHG*EVA---*****","SUG*EVAT--*****","SFG*EVAT--*****","SNG*EVAT--*****","SHG*EVAT--*****","SUG*EVATL-*****","SFG*EVATL-*****","SNG*EVATL-*****","SHG*EVATL-*****","SUG*EVATLR*****","SFG*EVATLR*****","SNG*EVATLR*****","SHG*EVATLR*****","SUG*EVATM-*****","SFG*EVATM-*****","SNG*EVATM-*****","SHG*EVATM-*****","SUG*EVATMR*****","SFG*EVATMR*****","SNG*EVATMR*****","SHG*EVATMR*****","SUG*EVATH-*****","SFG*EVATH-*****","SNG*EVATH-*****","SHG*EVATH-*****","SUG*EVATHR*****","SFG*EVATHR*****","SNG*EVATHR*****","SHG*EVATHR*****","SUG*EVAA--*****","SFG*EVAA--*****","SNG*EVAA--*****","SHG*EVAA--*****","SUG*EVAAR-*****","SFG*EVAAR-*****","SNG*EVAAR-*****","SHG*EVAAR-*****","SUG*EVAI--*****","SFG*EVAI--*****","SNG*EVAI--*****","SHG*EVAI--*****","SUG*EVAC--*****","SFG*EVAC--*****","SNG*EVAC--*****","SHG*EVAC--*****","SUG*EVAS--*****","SFG*EVAS--*****","SNG*EVAS--*****","SHG*EVAS--*****","SUG*EVAL--*****","SFG*EVAL--*****","SNG*EVAL--*****","SHG*EVAL--*****","SUG*EVU---*****","SFG*EVU---*****","SNG*EVU---*****","SHG*EVU---*****","SUG*EVUB--*****","SFG*EVUB--*****","SNG*EVUB--*****","SHG*EVUB--*****","SUG*EVUS--*****","SFG*EVUS--*****","SNG*EVUS--*****","SHG*EVUS--*****","SUG*EVUSL-*****","SFG*EVUSL-*****","SNG*EVUSL-*****","SHG*EVUSL-*****","SUG*EVUSM-*****","SFG*EVUSM-*****","SNG*EVUSM-*****","SHG*EVUSM-*****","SUG*EVUSH-*****","SFG*EVUSH-*****","SNG*EVUSH-*****","SHG*EVUSH-*****","SUG*EVUL--*****","SFG*EVUL--*****","SNG*EVUL--*****","SHG*EVUL--*****","SUG*EVUX--*****","SFG*EVUX--*****","SNG*EVUX--*****","SHG*EVUX--*****","SUG*EVUR--*****","SFG*EVUR--*****","SNG*EVUR--*****","SHG*EVUR--*****","SUG*EVUT--*****","SFG*EVUT--*****","SNG*EVUT--*****","SHG*EVUT--*****","SUG*EVUTL-*****","SFG*EVUTL-*****","SNG*EVUTL-*****","SHG*EVUTL-*****","SUG*EVUTH-*****","SFG*EVUTH-*****","SNG*EVUTH-*****","SHG*EVUTH-*****","SUG*EVUA--*****","SFG*EVUA--*****","SNG*EVUA--*****","SHG*EVUA--*****","SUG*EVUAA-*****","SFG*EVUAA-*****","SNG*EVUAA-*****","SHG*EVUAA-*****","SUG*EVE---*****","SFG*EVE---*****","SNG*EVE---*****","SHG*EVE---*****","SUG*EVEB--*****","SFG*EVEB--*****","SNG*EVEB--*****","SHG*EVEB--*****","SUG*EVEE--*****","SFG*EVEE--*****","SNG*EVEE--*****","SHG*EVEE--*****","SUG*EVEC--*****","SFG*EVEC--*****","SNG*EVEC--*****","SHG*EVEC--*****","SUG*EVEM--*****","SFG*EVEM--*****","SNG*EVEM--*****","SHG*EVEM--*****","SUG*EVEMV-*****","SFG*EVEMV-*****","SNG*EVEMV-*****","SHG*EVEMV-*****","SUG*EVEML-*****","SFG*EVEML-*****","SNG*EVEML-*****","SHG*EVEML-*****","SUG*EVEA--*****","SFG*EVEA--*****","SNG*EVEA--*****","SHG*EVEA--*****","SUG*EVEAA-*****","SFG*EVEAA-*****","SNG*EVEAA-*****","SHG*EVEAA-*****","SUG*EVEAT-*****","SFG*EVEAT-*****","SNG*EVEAT-*****","SHG*EVEAT-*****","SUG*EVED--*****","SFG*EVED--*****","SNG*EVED--*****","SHG*EVED--*****","SUG*EVEDA-*****","SFG*EVEDA-*****","SNG*EVEDA-*****","SHG*EVEDA-*****","SUG*EVES--*****","SFG*EVES--*****","SNG*EVES--*****","SHG*EVES--*****","SUG*EVER--*****","SFG*EVER--*****","SNG*EVER--*****","SHG*EVER--*****","SUG*EVEH--*****","SFG*EVEH--*****","SNG*EVEH--*****","SHG*EVEH--*****","SUG*EVEF--*****","SFG*EVEF--*****","SNG*EVEF--*****","SHG*EVEF--*****","SUG*EVT---*****","SFG*EVT---*****","SNG*EVT---*****","SHG*EVT---*****","SUG*EVC---*****","SFG*EVC---*****","SNG*EVC---*****","SHG*EVC---*****","SUG*EVCA--*****","SFG*EVCA--*****","SNG*EVCA--*****","SHG*EVCA--*****","SUG*EVCAL-*****","SFG*EVCAL-*****","SNG*EVCAL-*****","SHG*EVCAL-*****","SUG*EVCAM-*****","SFG*EVCAM-*****","SNG*EVCAM-*****","SHG*EVCAM-*****","SUG*EVCAH-*****","SFG*EVCAH-*****","SNG*EVCAH-*****","SHG*EVCAH-*****","SUG*EVCO--*****","SFG*EVCO--*****","SNG*EVCO--*****","SHG*EVCO--*****","SUG*EVCOL-*****","SFG*EVCOL-*****","SNG*EVCOL-*****","SHG*EVCOL-*****","SUG*EVCOM-*****","SFG*EVCOM-*****","SNG*EVCOM-*****","SHG*EVCOM-*****","SUG*EVCOH-*****","SFG*EVCOH-*****","SNG*EVCOH-*****","SHG*EVCOH-*****","SUG*EVCM--*****","SFG*EVCM--*****","SNG*EVCM--*****","SHG*EVCM--*****","SUG*EVCML-*****","SFG*EVCML-*****","SNG*EVCML-*****","SHG*EVCML-*****","SUG*EVCMM-*****","SFG*EVCMM-*****","SNG*EVCMM-*****","SHG*EVCMM-*****","SUG*EVCMH-*****","SFG*EVCMH-*****","SNG*EVCMH-*****","SHG*EVCMH-*****","SUG*EVCU--*****","SFG*EVCU--*****","SNG*EVCU--*****","SHG*EVCU--*****","SUG*EVCUL-*****","SFG*EVCUL-*****","SNG*EVCUL-*****","SHG*EVCUL-*****","SUG*EVCUM-*****","SFG*EVCUM-*****","SNG*EVCUM-*****","SHG*EVCUM-*****","SUG*EVCUH-*****","SFG*EVCUH-*****","SNG*EVCUH-*****","SHG*EVCUH-*****","SUG*EVCJ--*****","SFG*EVCJ--*****","SNG*EVCJ--*****","SHG*EVCJ--*****","SUG*EVCJL-*****","SFG*EVCJL-*****","SNG*EVCJL-*****","SHG*EVCJL-*****","SUG*EVCJM-*****","SFG*EVCJM-*****","SNG*EVCJM-*****","SHG*EVCJM-*****","SUG*EVCJH-*****","SFG*EVCJH-*****","SNG*EVCJH-*****","SHG*EVCJH-*****","SUG*EVCT--*****","SFG*EVCT--*****","SNG*EVCT--*****","SHG*EVCT--*****","SUG*EVCTL-*****","SFG*EVCTL-*****","SNG*EVCTL-*****","SHG*EVCTL-*****","SUG*EVCTM-*****","SFG*EVCTM-*****","SNG*EVCTM-*****","SHG*EVCTM-*****","SUG*EVCTH-*****","SFG*EVCTH-*****","SNG*EVCTH-*****","SHG*EVCTH-*****","SUG*EVCF--*****","SFG*EVCF--*****","SNG*EVCF--*****","SHG*EVCF--*****","SUG*EVCFL-*****","SFG*EVCFL-*****","SNG*EVCFL-*****","SHG*EVCFL-*****","SUG*EVCFM-*****","SFG*EVCFM-*****","SNG*EVCFM-*****","SHG*EVCFM-*****","SUG*EVCFH-*****","SFG*EVCFH-*****","SNG*EVCFH-*****","SHG*EVCFH-*****","SUG*EVM---*****","SFG*EVM---*****","SNG*EVM---*****","SHG*EVM---*****","SUG*EVS---*****","SFG*EVS---*****","SNG*EVS---*****","SHG*EVS---*****","SUG*EVST--*****","SFG*EVST--*****","SNG*EVST--*****","SHG*EVST--*****","SUG*EVSR--*****","SFG*EVSR--*****","SNG*EVSR--*****","SHG*EVSR--*****","SUG*EVSC--*****","SFG*EVSC--*****","SNG*EVSC--*****","SHG*EVSC--*****","SUG*EVSP--*****","SFG*EVSP--*****","SNG*EVSP--*****","SHG*EVSP--*****","SUG*EVSW--*****","SFG*EVSW--*****","SNG*EVSW--*****","SHG*EVSW--*****","SUG*ES----*****","SFG*ES----*****","SNG*ES----*****","SHG*ES----*****","SUG*ESR---*****","SFG*ESR---*****","SNG*ESR---*****","SHG*ESR---*****","SUG*ESE---*****","SFG*ESE---*****","SNG*ESE---*****","SHG*ESE---*****","SUG*EX----*****","SFG*EX----*****","SNG*EX----*****","SHG*EX----*****","SUG*EXI---*****","SFG*EXI---*****","SNG*EXI---*****","SHG*EXI---*****","SUG*EXL---*****","SFG*EXL---*****","SNG*EXL---*****","SHG*EXL---*****","SUG*EXN---*****","SFG*EXN---*****","SNG*EXN---*****","SHG*EXN---*****","SUG*EXF---*****","SFG*EXF---*****","SNG*EXF---*****","SHG*EXF---*****","SUG*EXM---*****","SFG*EXM---*****","SNG*EXM---*****","SHG*EXM---*****","SUG*EXMC--*****","SFG*EXMC--*****","SNG*EXMC--*****","SHG*EXMC--*****","SUG*EXML--*****","SFG*EXML--*****","SNG*EXML--*****","SHG*EXML--*****","SUG*I-----H****","SFG*I-----H****","SNG*I-----H****","SHG*I-----H****","SUG*IR----H****","SFG*IR----H****","SNG*IR----H****","SHG*IR----H****","SUG*IRM---H****","SFG*IRM---H****","SNG*IRM---H****","SHG*IRM---H****","SUG*IRP---H****","SFG*IRP---H****","SNG*IRP---H****","SHG*IRP---H****","SUG*IRN---H****","SFG*IRN---H****","SNG*IRN---H****","SHG*IRN---H****","SUG*IRNB--H****","SFG*IRNB--H****","SNG*IRNB--H****","SHG*IRNB--H****","SUG*IRNC--H****","SFG*IRNC--H****","SNG*IRNC--H****","SHG*IRNC--H****","SUG*IRNN--H****","SFG*IRNN--H****","SNG*IRNN--H****","SHG*IRNN--H****","SUG*IP----H****","SFG*IP----H****","SNG*IP----H****","SHG*IP----H****","SUG*IPD---H****","SFG*IPD---H****","SNG*IPD---H****","SHG*IPD---H****","SUG*IE----H****","SFG*IE----H****","SNG*IE----H****","SHG*IE----H****","SUG*IU----H****","SFG*IU----H****","SNG*IU----H****","SHG*IU----H****","SUG*IUR---H****","SFG*IUR---H****","SNG*IUR---H****","SHG*IUR---H****","SUG*IUT---H****","SFG*IUT---H****","SNG*IUT---H****","SHG*IUT---H****","SUG*IUE---H****","SFG*IUE---H****","SNG*IUE---H****","SHG*IUE---H****","SUG*IUEN--H****","SFG*IUEN--H****","SNG*IUEN--H****","SHG*IUEN--H****","SUG*IUED--H****","SFG*IUED--H****","SNG*IUED--H****","SHG*IUED--H****","SUG*IUEF--H****","SFG*IUEF--H****","SNG*IUEF--H****","SHG*IUEF--H****","SUG*IUP---H****","SFG*IUP---H****","SNG*IUP---H****","SHG*IUP---H****","SUG*IM----H****","SFG*IM----H****","SNG*IM----H****","SHG*IM----H****","SUG*IMF---H****","SFG*IMF---H****","SNG*IMF---H****","SHG*IMF---H****","SUG*IMFA--H****","SFG*IMFA--H****","SNG*IMFA--H****","SHG*IMFA--H****","SUG*IMFP--H****","SFG*IMFP--H****","SNG*IMFP--H****","SHG*IMFP--H****","SUG*IMFPW-H****","SFG*IMFPW-H****","SNG*IMFPW-H****","SHG*IMFPW-H****","SUG*IMFS--H****","SFG*IMFS--H****","SNG*IMFS--H****","SHG*IMFS--H****","SUG*IMA---H****","SFG*IMA---H****","SNG*IMA---H****","SHG*IMA---H****","SUG*IME---H****","SFG*IME---H****","SNG*IME---H****","SHG*IME---H****","SUG*IMG---H****","SFG*IMG---H****","SNG*IMG---H****","SHG*IMG---H****","SUG*IMV---H****","SFG*IMV---H****","SNG*IMV---H****","SHG*IMV---H****","SUG*IMN---H****","SFG*IMN---H****","SNG*IMN---H****","SHG*IMN---H****","SUG*IMNB--H****","SFG*IMNB--H****","SNG*IMNB--H****","SHG*IMNB--H****","SUG*IMC---H****","SFG*IMC---H****","SNG*IMC---H****","SHG*IMC---H****","SUG*IMS---H****","SFG*IMS---H****","SNG*IMS---H****","SHG*IMS---H****","SUG*IMM---H****","SFG*IMM---H****","SNG*IMM---H****","SHG*IMM---H****","SUG*IG----H****","SFG*IG----H****","SNG*IG----H****","SHG*IG----H****","SUG*IB----H****","SFG*IB----H****","SNG*IB----H****","SHG*IB----H****","SUG*IBA---H****","SFG*IBA---H****","SNG*IBA---H****","SHG*IBA---H****","SUG*IBN---H****","SFG*IBN---H****","SNG*IBN---H****","SHG*IBN---H****","SUG*IT----H****","SFG*IT----H****","SNG*IT----H****","SHG*IT----H****","SUG*IX----H****","SFG*IX----H****","SNG*IX----H****","SHG*IX----H****","SUG*IXH---H****","SFG*IXH---H****","SNG*IXH---H****","SHG*IXH---H****","SUS*------*****","SFS*------*****","SNS*------*****","SHS*------*****","SUS*C-----*****","SFS*C-----*****","SNS*C-----*****","SHS*C-----*****","SUS*CL----*****","SFS*CL----*****","SNS*CL----*****","SHS*CL----*****","SUS*CLCV--*****","SFS*CLCV--*****","SNS*CLCV--*****","SHS*CLCV--*****","SUS*CLBB--*****","SFS*CLBB--*****","SNS*CLBB--*****","SHS*CLBB--*****","SUS*CLCC--*****","SFS*CLCC--*****","SNS*CLCC--*****","SHS*CLCC--*****","SUS*CLDD--*****","SFS*CLDD--*****","SNS*CLDD--*****","SHS*CLDD--*****","SUS*CLFF--*****","SFS*CLFF--*****","SNS*CLFF--*****","SHS*CLFF--*****","SUS*CLLL--*****","SFS*CLLL--*****","SNS*CLLL--*****","SHS*CLLL--*****","SUS*CLLLAS*****","SFS*CLLLAS*****","SNS*CLLLAS*****","SHS*CLLLAS*****","SUS*CLLLMI*****","SFS*CLLLMI*****","SNS*CLLLMI*****","SHS*CLLLMI*****","SUS*CLLLSU*****","SFS*CLLLSU*****","SNS*CLLLSU*****","SHS*CLLLSU*****","SUS*CA----*****","SFS*CA----*****","SNS*CA----*****","SHS*CA----*****","SUS*CALA--*****","SFS*CALA--*****","SNS*CALA--*****","SHS*CALA--*****","SUS*CALS--*****","SFS*CALS--*****","SNS*CALS--*****","SHS*CALS--*****","SUS*CALSM-*****","SFS*CALSM-*****","SNS*CALSM-*****","SHS*CALSM-*****","SUS*CALST-*****","SFS*CALST-*****","SNS*CALST-*****","SHS*CALST-*****","SUS*CALC--*****","SFS*CALC--*****","SNS*CALC--*****","SHS*CALC--*****","SUS*CM----*****","SFS*CM----*****","SNS*CM----*****","SHS*CM----*****","SUS*CMML--*****","SFS*CMML--*****","SNS*CMML--*****","SHS*CMML--*****","SUS*CMMS--*****","SFS*CMMS--*****","SNS*CMMS--*****","SHS*CMMS--*****","SUS*CMMH--*****","SFS*CMMH--*****","SNS*CMMH--*****","SHS*CMMH--*****","SUS*CMMA--*****","SFS*CMMA--*****","SNS*CMMA--*****","SHS*CMMA--*****","SUS*CP----*****","SFS*CP----*****","SNS*CP----*****","SHS*CP----*****","SUS*CPSB--*****","SFS*CPSB--*****","SNS*CPSB--*****","SHS*CPSB--*****","SUS*CPSU--*****","SFS*CPSU--*****","SNS*CPSU--*****","SHS*CPSU--*****","SUS*CPSUM-*****","SFS*CPSUM-*****","SNS*CPSUM-*****","SHS*CPSUM-*****","SUS*CPSUT-*****","SFS*CPSUT-*****","SNS*CPSUT-*****","SHS*CPSUT-*****","SUS*CPSUG-*****","SFS*CPSUG-*****","SNS*CPSUG-*****","SHS*CPSUG-*****","SUS*CH----*****","SFS*CH----*****","SNS*CH----*****","SHS*CH----*****","SUS*G-----*****","SFS*G-----*****","SNS*G-----*****","SHS*G-----*****","SUS*GT----*****","SFS*GT----*****","SNS*GT----*****","SHS*GT----*****","SUS*GG----*****","SFS*GG----*****","SNS*GG----*****","SHS*GG----*****","SUS*GU----*****","SFS*GU----*****","SNS*GU----*****","SHS*GU----*****","SUS*GC----*****","SFS*GC----*****","SNS*GC----*****","SHS*GC----*****","SUS*CD----*****","SFS*CD----*****","SNS*CD----*****","SHS*CD----*****","SUS*CU----*****","SFS*CU----*****","SNS*CU----*****","SHS*CU----*****","SUS*CUM---*****","SFS*CUM---*****","SNS*CUM---*****","SHS*CUM---*****","SUS*CUS---*****","SFS*CUS---*****","SNS*CUS---*****","SHS*CUS---*****","SUS*CUN---*****","SFS*CUN---*****","SNS*CUN---*****","SHS*CUN---*****","SUS*CUR---*****","SFS*CUR---*****","SNS*CUR---*****","SHS*CUR---*****","SUS*N-----*****","SFS*N-----*****","SNS*N-----*****","SHS*N-----*****","SUS*NR----*****","SFS*NR----*****","SNS*NR----*****","SHS*NR----*****","SUS*NF----*****","SFS*NF----*****","SNS*NF----*****","SHS*NF----*****","SUS*NI----*****","SFS*NI----*****","SNS*NI----*****","SHS*NI----*****","SUS*NS----*****","SFS*NS----*****","SNS*NS----*****","SHS*NS----*****","SUS*NM----*****","SFS*NM----*****","SNS*NM----*****","SHS*NM----*****","SUS*NH----*****","SFS*NH----*****","SNS*NH----*****","SHS*NH----*****","SUS*X-----*****","SFS*X-----*****","SNS*X-----*****","SHS*X-----*****","SUS*XM----*****","SFS*XM----*****","SNS*XM----*****","SHS*XM----*****","SUS*XMC---*****","SFS*XMC---*****","SNS*XMC---*****","SHS*XMC---*****","SUS*XMR---*****","SFS*XMR---*****","SNS*XMR---*****","SHS*XMR---*****","SUS*XMO---*****","SFS*XMO---*****","SNS*XMO---*****","SHS*XMO---*****","SUS*XMTU--*****","SFS*XMTU--*****","SNS*XMTU--*****","SHS*XMTU--*****","SUS*XMF---*****","SFS*XMF---*****","SNS*XMF---*****","SHS*XMF---*****","SUS*XMP---*****","SFS*XMP---*****","SNS*XMP---*****","SHS*XMP---*****","SUS*XMH---*****","SFS*XMH---*****","SNS*XMH---*****","SHS*XMH---*****","SUS*XMTO--*****","SFS*XMTO--*****","SNS*XMTO--*****","SHS*XMTO--*****","SUS*XF----*****","SFS*XF----*****","SNS*XF----*****","SHS*XF----*****","SUS*XFDF--*****","SFS*XFDF--*****","SNS*XFDF--*****","SHS*XFDF--*****","SUS*XFDR--*****","SFS*XFDR--*****","SNS*XFDR--*****","SHS*XFDR--*****","SUS*XFTR--*****","SFS*XFTR--*****","SNS*XFTR--*****","SHS*XFTR--*****","SUS*XR----*****","SFS*XR----*****","SNS*XR----*****","SHS*XR----*****","SUS*XL----*****","SFS*XL----*****","SNS*XL----*****","SHS*XL----*****","SUS*XH----*****","SFS*XH----*****","SNS*XH----*****","SHS*XH----*****","SUS*XA----*****","SFS*XA----*****","SNS*XA----*****","SHS*XA----*****","SUS*XAR---*****","SFS*XAR---*****","SNS*XAR---*****","SHS*XAR---*****","SUS*XAS---*****","SFS*XAS---*****","SNS*XAS---*****","SHS*XAS---*****","SUS*XP----*****","SFS*XP----*****","SNS*XP----*****","SHS*XP----*****","SUS*O-----*****","SFS*O-----*****","SNS*O-----*****","SHS*O-----*****","SUU*------*****","SFU*------*****","SNU*------*****","SHU*------*****","SUU*S-----*****","SFU*S-----*****","SNU*S-----*****","SHU*S-----*****","SUU*SF----*****","SFU*SF----*****","SNU*SF----*****","SHU*SF----*****","SUU*SB----*****","SFU*SB----*****","SNU*SB----*****","SHU*SB----*****","SUU*SR----*****","SFU*SR----*****","SNU*SR----*****","SHU*SR----*****","SUU*SX----*****","SFU*SX----*****","SNU*SX----*****","SHU*SX----*****","SUU*SN----*****","SFU*SN----*****","SNU*SN----*****","SHU*SN----*****","SUU*SNF---*****","SFU*SNF---*****","SNU*SNF---*****","SHU*SNF---*****","SUU*SNA---*****","SFU*SNA---*****","SNU*SNA---*****","SHU*SNA---*****","SUU*SNM---*****","SFU*SNM---*****","SNU*SNM---*****","SHU*SNM---*****","SUU*SNG---*****","SFU*SNG---*****","SNU*SNG---*****","SHU*SNG---*****","SUU*SNB---*****","SFU*SNB---*****","SNU*SNB---*****","SHU*SNB---*****","SUU*SC----*****","SFU*SC----*****","SNU*SC----*****","SHU*SC----*****","SUU*SCF---*****","SFU*SCF---*****","SNU*SCF---*****","SHU*SCF---*****","SUU*SCA---*****","SFU*SCA---*****","SNU*SCA---*****","SHU*SCA---*****","SUU*SCM---*****","SFU*SCM---*****","SNU*SCM---*****","SHU*SCM---*****","SUU*SCG---*****","SFU*SCG---*****","SNU*SCG---*****","SHU*SCG---*****","SUU*SCB---*****","SFU*SCB---*****","SNU*SCB---*****","SHU*SCB---*****","SUU*SO----*****","SFU*SO----*****","SNU*SO----*****","SHU*SO----*****","SUU*SOF---*****","SFU*SOF---*****","SNU*SOF---*****","SHU*SOF---*****","SUU*SU----*****","SFU*SU----*****","SNU*SU----*****","SHU*SU----*****","SUU*SUM---*****","SFU*SUM---*****","SNU*SUM---*****","SHU*SUM---*****","SUU*SUS---*****","SFU*SUS---*****","SNU*SUS---*****","SHU*SUS---*****","SUU*SUN---*****","SFU*SUN---*****","SNU*SUN---*****","SHU*SUN---*****","SUU*S1----*****","SFU*S1----*****","SNU*S1----*****","SHU*S1----*****","SUU*S2----*****","SFU*S2----*****","SNU*S2----*****","SHU*S2----*****","SUU*S3----*****","SFU*S3----*****","SNU*S3----*****","SHU*S3----*****","SUU*S4----*****","SFU*S4----*****","SNU*S4----*****","SHU*S4----*****","SUU*SL----*****","SFU*SL----*****","SNU*SL----*****","SHU*SL----*****","SUU*SK----*****","SFU*SK----*****","SNU*SK----*****","SHU*SK----*****","SUU*W-----*****","SFU*W-----*****","SNU*W-----*****","SHU*W-----*****","SUU*WT----*****","SFU*WT----*****","SNU*WT----*****","SHU*WT----*****","SUU*WM----*****","SFU*WM----*****","SNU*WM----*****","SHU*WM----*****","SUU*WMD---*****","SFU*WMD---*****","SNU*WMD---*****","SHU*WMD---*****","SUU*WMG---*****","SFU*WMG---*****","SNU*WMG---*****","SHU*WMG---*****","SUU*WMGD--*****","SFU*WMGD--*****","SNU*WMGD--*****","SHU*WMGD--*****","SUU*WMGX--*****","SFU*WMGX--*****","SNU*WMGX--*****","SHU*WMGX--*****","SUU*WMGE--*****","SFU*WMGE--*****","SNU*WMGE--*****","SHU*WMGE--*****","SUU*WMGC--*****","SFU*WMGC--*****","SNU*WMGC--*****","SHU*WMGC--*****","SUU*WMGR--*****","SFU*WMGR--*****","SNU*WMGR--*****","SHU*WMGR--*****","SUU*WMGO--*****","SFU*WMGO--*****","SNU*WMGO--*****","SHU*WMGO--*****","SUU*WMM---*****","SFU*WMM---*****","SNU*WMM---*****","SHU*WMM---*****","SUU*WMMD--*****","SFU*WMMD--*****","SNU*WMMD--*****","SHU*WMMD--*****","SUU*WMMX--*****","SFU*WMMX--*****","SNU*WMMX--*****","SHU*WMMX--*****","SUU*WMME--*****","SFU*WMME--*****","SNU*WMME--*****","SHU*WMME--*****","SUU*WMMC--*****","SFU*WMMC--*****","SNU*WMMC--*****","SHU*WMMC--*****","SUU*WMMR--*****","SFU*WMMR--*****","SNU*WMMR--*****","SHU*WMMR--*****","SUU*WMMO--*****","SFU*WMMO--*****","SNU*WMMO--*****","SHU*WMMO--*****","SUU*WMF---*****","SFU*WMF---*****","SNU*WMF---*****","SHU*WMF---*****","SUU*WMFD--*****","SFU*WMFD--*****","SNU*WMFD--*****","SHU*WMFD--*****","SUU*WMFX--*****","SFU*WMFX--*****","SNU*WMFX--*****","SHU*WMFX--*****","SUU*WMFE--*****","SFU*WMFE--*****","SNU*WMFE--*****","SHU*WMFE--*****","SUU*WMFC--*****","SFU*WMFC--*****","SNU*WMFC--*****","SHU*WMFC--*****","SUU*WMFR--*****","SFU*WMFR--*****","SNU*WMFR--*****","SHU*WMFR--*****","SUU*WMFO--*****","SFU*WMFO--*****","SNU*WMFO--*****","SHU*WMFO--*****","SUU*WMO---*****","SFU*WMO---*****","SNU*WMO---*****","SHU*WMO---*****","SUU*WMOD--*****","SFU*WMOD--*****","SNU*WMOD--*****","SHU*WMOD--*****","SUU*WMX---*****","SFU*WMX---*****","SNU*WMX---*****","SHU*WMX---*****","SUU*WME---*****","SFU*WME---*****","SNU*WME---*****","SHU*WME---*****","SUU*WMA---*****","SFU*WMA---*****","SNU*WMA---*****","SHU*WMA---*****","SUU*WMC---*****","SFU*WMC---*****","SNU*WMC---*****","SHU*WMC---*****","SUU*WMR---*****","SFU*WMR---*****","SNU*WMR---*****","SHU*WMR---*****","SUU*WMB---*****","SFU*WMB---*****","SNU*WMB---*****","SHU*WMB---*****","SUU*WMBD--*****","SFU*WMBD--*****","SNU*WMBD--*****","SHU*WMBD--*****","SUU*WMN---*****","SFU*WMN---*****","SNU*WMN---*****","SHU*WMN---*****","SUU*WMS---*****","SFU*WMS---*****","SNU*WMS---*****","SHU*WMS---*****","SUU*WMSX--*****","SFU*WMSX--*****","SNU*WMSX--*****","SHU*WMSX--*****","SUU*WMSD--*****","SFU*WMSD--*****","SNU*WMSD--*****","SHU*WMSD--*****","SUU*WD----*****","SFU*WD----*****","SNU*WD----*****","SHU*WD----*****","SUU*WDM---*****","SFU*WDM---*****","SNU*WDM---*****","SHU*WDM---*****","SUU*WDMG--*****","SFU*WDMG--*****","SNU*WDMG--*****","SHU*WDMG--*****","SUU*WDMM--*****","SFU*WDMM--*****","SNU*WDMM--*****","SHU*WDMM--*****","SUU*N-----*****","SFU*N-----*****","SNU*N-----*****","SHU*N-----*****","SUU*ND----*****","SFU*ND----*****","SNU*ND----*****","SHU*ND----*****","SUU*E-----*****","SFU*E-----*****","SNU*E-----*****","SHU*E-----*****","SUU*V-----*****","SFU*V-----*****","SNU*V-----*****","SHU*V-----*****","SUU*X-----*****","SFU*X-----*****","SNU*X-----*****","SHU*X-----*****","SUF*------*****","SFF*------*****","SNF*------*****","SHF*------*****","SUF*A-----*****","SFF*A-----*****","SNF*A-----*****","SHF*A-----*****","SUF*AF----*****","SFF*AF----*****","SNF*AF----*****","SHF*AF----*****","SUF*AFA---*****","SFF*AFA---*****","SNF*AFA---*****","SHF*AFA---*****","SUF*AFK---*****","SFF*AFK---*****","SNF*AFK---*****","SHF*AFK---*****","SUF*AFU---*****","SFF*AFU---*****","SNF*AFU---*****","SHF*AFU---*****","SUF*AFUL--*****","SFF*AFUL--*****","SNF*AFUL--*****","SHF*AFUL--*****","SUF*AFUM--*****","SFF*AFUM--*****","SNF*AFUM--*****","SHF*AFUM--*****","SUF*AFUH--*****","SFF*AFUH--*****","SNF*AFUH--*****","SHF*AFUH--*****","SUF*AV----*****","SFF*AV----*****","SNF*AV----*****","SHF*AV----*****","SUF*AH----*****","SFF*AH----*****","SNF*AH----*****","SHF*AH----*****","SUF*AHH---*****","SFF*AHH---*****","SNF*AHH---*****","SHF*AHH---*****","SUF*AHA---*****","SFF*AHA---*****","SNF*AHA---*****","SHF*AHA---*****","SUF*AHU---*****","SFF*AHU---*****","SNF*AHU---*****","SHF*AHU---*****","SUF*AHUL--*****","SFF*AHUL--*****","SNF*AHUL--*****","SHF*AHUL--*****","SUF*AHUM--*****","SFF*AHUM--*****","SNF*AHUM--*****","SHF*AHUM--*****","SUF*AHUH--*****","SFF*AHUH--*****","SNF*AHUH--*****","SHF*AHUH--*****","SUF*N-----*****","SFF*N-----*****","SNF*N-----*****","SHF*N-----*****","SUF*NS----*****","SFF*NS----*****","SNF*NS----*****","SHF*NS----*****","SUF*NU----*****","SFF*NU----*****","SNF*NU----*****","SHF*NU----*****","SUF*NB----*****","SFF*NB----*****","SNF*NB----*****","SHF*NB----*****","SUF*NN----*****","SFF*NN----*****","SNF*NN----*****","SHF*NN----*****","SUF*G-----*****","SFF*G-----*****","SNF*G-----*****","SHF*G-----*****","SUF*GS----*****","SFF*GS----*****","SNF*GS----*****","SHF*GS----*****","SUF*GR----*****","SFF*GR----*****","SNF*GR----*****","SHF*GR----*****","SUF*GP----*****","SFF*GP----*****","SNF*GP----*****","SHF*GP----*****","SUF*GPA---*****","SFF*GPA---*****","SNF*GPA---*****","SHF*GPA---*****","SUF*GC----*****","SFF*GC----*****","SNF*GC----*****","SHF*GC----*****","SUF*B-----*****","SFF*B-----*****","SNF*B-----*****","SHF*B-----*****"] + } + }, + "properties": { + "attrClassification": { + "title":"Classification", + "type":"string", + "$ref":"#/definitions/attrClassification" + }, + "attrNeedToKnow": { + "title":"Need To Know", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attrNeedToKnow"} + }, + "attrRelTo": { + "title":"Rel To", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attributeRelTo"} + }, + "symbolCode2525b": { + "title":"Symbol Code", + "$ref":"#/definitions/milSymbols" + }, + "facilityName": { + "title":"Facility Name", + "type":"string" + }, + "location": { + "title":"Location", + "$ref":"#/definitions/countries" + } + } + }', + '{ + "order": ["attrClassification","attrRelTo","attrNeedToKnow","facilityName","location","symbolCode2525b"], + "location":{"widget":"LocationAutocomplete"}, + "attrClassification":{"widget":"AttributeAutocomplete"}, + "attrNeedToKnow":{"widget":"AttributeAutocomplete","multiple":true}, + "attrRelTo":{"widget":"AttributeAutocomplete","multiple":true} + }', + '{ + "geoField":"location", + "searchFields":["facilityName","attrClassification","attrNeedToKnow","attrRelTo"], + "attrFields":["attrClassification","attrNeedToKnow","attrRelTo"], + "tsField":"createdTimestamp", + "displayFields": { + "header":"facilityName", + "details":["attrClassification","symbolCode2525b","lastInfoTimestamp","createdTimestamp","location.country"] + }, + "mapFields": { + "iconDefault":"sitrep", + "iconConfig": [ + { + "field":"symbolCode2525b", + "valueMap": { + "isMilSymbol":"true" + } + }, + { + "field":"symbolCode2525c", + "valueMap": { + "isMilSymbol":"true" + } + }, + { + "field":"symbolCode2525d", + "valueMap": { + "isMilSymbol":"true" + } + }, + { + "field":"attrClassification", + "valueMap": { + "topsecret-sci":"topsecret-sci", + "topsecret":"topsecret", + "secret":"secret", + "confidential":"confidential", + "controlled":"controlled", + "unclassified":"unclassified" + } + }], + "colorDefault":"sitrep", + "colorConfig": [{ + "field":"attrClassification", + "valueMap": { + "topsecret-sci":"topsecret-sci", + "topsecret":"topsecret", + "secret":"secret", + "confidential":"confidential", + "controlled":"controlled", + "unclassified":"unclassified" + } + }] + } + }' ), ( - 'facilities', - '{"type":"object","required":["attrClassification","facilityName","symbolCode2525b","location"],"default":{},"definitions":{"attrClassification":{"oneOf":[{"type":"string","title":"TOPSECRET","enum":["https://demo.com/attr/classification/value/topsecret"]},{"type":"string","title":"SECRET","enum":["https://demo.com/attr/classification/value/secret"]},{"type":"string","title":"CONFIDENTIAL","enum":["https://demo.com/attr/classification/value/confidential"]},{"type":"string","title":"UNCLASSIFIED","enum":["https://demo.com/attr/classification/value/unclassified"]}]},"attrNeedToKnow":{"anyOf":[{"type":"string","title":"AAA","enum":["https://demo.com/attr/needtoknow/value/aaa"]},{"type":"string","title":"BBB","enum":["https://demo.com/attr/needtoknow/value/bbb"]},{"type":"string","title":"INT","enum":["https://demo.com/attr/needtoknow/value/int"]},{"type":"string","title":"OPS","enum":["https://demo.com/attr/needtoknow/value/ops"]}]},"attributeRelTo":{"anyOf":[{"type":"string","title":"AUSTRALIA","enum":["https://demo.com/attr/relto/value/aus"]},{"type":"string","title":"FRANCE","enum":["https://demo.com/attr/relto/value/fra"]},{"type":"string","title":"FVEY","enum":["https://demo.com/attr/relto/value/fvey"]},{"type":"string","title":"UNITED KINGDOM","enum":["https://demo.com/attr/relto/value/gbr"]},{"type":"string","title":"NATO","enum":["https://demo.com/attr/relto/value/nato"]},{"type":"string","title":"PINK","enum":["https://demo.com/attr/relto/value/pink"]},{"type":"string","title":"UNITED STATES","enum":["https://demo.com/attr/relto/value/usa"]},{"type":"string","title":"ARUBA","enum":["https://demo.com/attr/relto/value/abw"]},{"type":"string","title":"AFGHANISTAN","enum":["https://demo.com/attr/relto/value/afg"]},{"type":"string","title":"ANGOLA","enum":["https://demo.com/attr/relto/value/ago"]},{"type":"string","title":"ANGUILLA","enum":["https://demo.com/attr/relto/value/aia"]},{"type":"string","title":"ALAND ISLANDS","enum":["https://demo.com/attr/relto/value/ala"]},{"type":"string","title":"ALBANIA","enum":["https://demo.com/attr/relto/value/alb"]},{"type":"string","title":"ANDORRA","enum":["https://demo.com/attr/relto/value/and"]},{"type":"string","title":"UNITED ARAB EMIRATES","enum":["https://demo.com/attr/relto/value/are"]},{"type":"string","title":"ARGENTINA","enum":["https://demo.com/attr/relto/value/arg"]},{"type":"string","title":"ARMENIA","enum":["https://demo.com/attr/relto/value/arm"]},{"type":"string","title":"AMERICAN SAMOA","enum":["https://demo.com/attr/relto/value/asm"]},{"type":"string","title":"ANTARCTICA","enum":["https://demo.com/attr/relto/value/ata"]},{"type":"string","title":"FRENCH SOUTHERN AND ANTARCTIC LANDS","enum":["https://demo.com/attr/relto/value/atf"]},{"type":"string","title":"ANTIGUA AND BARBUDA","enum":["https://demo.com/attr/relto/value/atg"]},{"type":"string","title":"AUSTRIA","enum":["https://demo.com/attr/relto/value/aut"]},{"type":"string","title":"AZERBAIJAN","enum":["https://demo.com/attr/relto/value/aze"]},{"type":"string","title":"BURUNDI","enum":["https://demo.com/attr/relto/value/bdi"]},{"type":"string","title":"BELGIUM","enum":["https://demo.com/attr/relto/value/bel"]},{"type":"string","title":"BENIN","enum":["https://demo.com/attr/relto/value/ben"]},{"type":"string","title":"BONAIRE, SINT EUSTATIUS AND SABA","enum":["https://demo.com/attr/relto/value/bes"]},{"type":"string","title":"BURKINA FASO","enum":["https://demo.com/attr/relto/value/bfa"]},{"type":"string","title":"BANGLADESH","enum":["https://demo.com/attr/relto/value/bgd"]},{"type":"string","title":"BULGARIA","enum":["https://demo.com/attr/relto/value/bgr"]},{"type":"string","title":"BAHRAIN","enum":["https://demo.com/attr/relto/value/bhr"]},{"type":"string","title":"BAHAMAS, THE","enum":["https://demo.com/attr/relto/value/bhs"]},{"type":"string","title":"BOSNIA AND HERZEGOVINA","enum":["https://demo.com/attr/relto/value/bih"]},{"type":"string","title":"SAINT BARTHELEMY","enum":["https://demo.com/attr/relto/value/blm"]},{"type":"string","title":"BELARUS","enum":["https://demo.com/attr/relto/value/blr"]},{"type":"string","title":"BELIZE","enum":["https://demo.com/attr/relto/value/blz"]},{"type":"string","title":"BERMUDA","enum":["https://demo.com/attr/relto/value/bmu"]},{"type":"string","title":"BOLIVIA","enum":["https://demo.com/attr/relto/value/bol"]},{"type":"string","title":"BRAZIL","enum":["https://demo.com/attr/relto/value/bra"]},{"type":"string","title":"BARBADOS","enum":["https://demo.com/attr/relto/value/brb"]},{"type":"string","title":"BRUNEI","enum":["https://demo.com/attr/relto/value/brn"]},{"type":"string","title":"BHUTAN","enum":["https://demo.com/attr/relto/value/btn"]},{"type":"string","title":"BOUVET ISLAND","enum":["https://demo.com/attr/relto/value/bvt"]},{"type":"string","title":"BOTSWANA","enum":["https://demo.com/attr/relto/value/bwa"]},{"type":"string","title":"CENTRAL AFRICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/caf"]},{"type":"string","title":"CANADA","enum":["https://demo.com/attr/relto/value/can"]},{"type":"string","title":"COCOS (KEELING) ISLANDS","enum":["https://demo.com/attr/relto/value/cck"]},{"type":"string","title":"SWITZERLAND","enum":["https://demo.com/attr/relto/value/che"]},{"type":"string","title":"CHILE","enum":["https://demo.com/attr/relto/value/chl"]},{"type":"string","title":"CHINA","enum":["https://demo.com/attr/relto/value/chn"]},{"type":"string","title":"CÔTE D''IVOIRE","enum":["https://demo.com/attr/relto/value/civ"]},{"type":"string","title":"CAMEROON","enum":["https://demo.com/attr/relto/value/cmr"]},{"type":"string","title":"CONGO(KINSHASA)","enum":["https://demo.com/attr/relto/value/cod"]},{"type":"string","title":"CONGO (BRAZZAVILLE)","enum":["https://demo.com/attr/relto/value/cog"]},{"type":"string","title":"COOK ISLANDS","enum":["https://demo.com/attr/relto/value/cok"]},{"type":"string","title":"COLOMBIA","enum":["https://demo.com/attr/relto/value/col"]},{"type":"string","title":"COMOROS","enum":["https://demo.com/attr/relto/value/com"]},{"type":"string","title":"CABO VERDE","enum":["https://demo.com/attr/relto/value/cpv"]},{"type":"string","title":"COSTA RICA","enum":["https://demo.com/attr/relto/value/cri"]},{"type":"string","title":"CUBA","enum":["https://demo.com/attr/relto/value/cub"]},{"type":"string","title":"CURAÇAO","enum":["https://demo.com/attr/relto/value/cuw"]},{"type":"string","title":"CHRISTMAS ISLAND","enum":["https://demo.com/attr/relto/value/cxr"]},{"type":"string","title":"CAYMAN ISLANDS","enum":["https://demo.com/attr/relto/value/cym"]},{"type":"string","title":"CYPRUS","enum":["https://demo.com/attr/relto/value/cyp"]},{"type":"string","title":"CZECH REPUBLIC","enum":["https://demo.com/attr/relto/value/cze"]},{"type":"string","title":"GERMANY","enum":["https://demo.com/attr/relto/value/deu"]},{"type":"string","title":"DJIBOUTI","enum":["https://demo.com/attr/relto/value/dji"]},{"type":"string","title":"DOMINICA","enum":["https://demo.com/attr/relto/value/dma"]},{"type":"string","title":"DENMARK","enum":["https://demo.com/attr/relto/value/dnk"]},{"type":"string","title":"DOMINICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/dom"]},{"type":"string","title":"ALGERIA","enum":["https://demo.com/attr/relto/value/dza"]},{"type":"string","title":"ECUADOR","enum":["https://demo.com/attr/relto/value/ecu"]},{"type":"string","title":"EGYPT","enum":["https://demo.com/attr/relto/value/egy"]},{"type":"string","title":"ERITREA","enum":["https://demo.com/attr/relto/value/eri"]},{"type":"string","title":"WESTERN SAHARA","enum":["https://demo.com/attr/relto/value/esh"]},{"type":"string","title":"SPAIN","enum":["https://demo.com/attr/relto/value/esp"]},{"type":"string","title":"ESTONIA","enum":["https://demo.com/attr/relto/value/est"]},{"type":"string","title":"ETHIOPIA","enum":["https://demo.com/attr/relto/value/eth"]},{"type":"string","title":"FINLAND","enum":["https://demo.com/attr/relto/value/fin"]},{"type":"string","title":"FIJI","enum":["https://demo.com/attr/relto/value/fji"]},{"type":"string","title":"FALKLAND ISLANDS (ISLAS MALVINAS)","enum":["https://demo.com/attr/relto/value/flk"]},{"type":"string","title":"FAROE ISLANDS","enum":["https://demo.com/attr/relto/value/fro"]},{"type":"string","title":"MICRONESIA, FEDERATED STATES OF","enum":["https://demo.com/attr/relto/value/fsm"]},{"type":"string","title":"GABON","enum":["https://demo.com/attr/relto/value/gab"]},{"type":"string","title":"GEORGIA","enum":["https://demo.com/attr/relto/value/geo"]},{"type":"string","title":"GUERNSEY","enum":["https://demo.com/attr/relto/value/ggy"]},{"type":"string","title":"GHANA","enum":["https://demo.com/attr/relto/value/gha"]},{"type":"string","title":"GIBRALTAR","enum":["https://demo.com/attr/relto/value/gib"]},{"type":"string","title":"GUINEA","enum":["https://demo.com/attr/relto/value/gin"]},{"type":"string","title":"GUADELOUPE","enum":["https://demo.com/attr/relto/value/glp"]},{"type":"string","title":"GAMBIA, THE","enum":["https://demo.com/attr/relto/value/gmb"]},{"type":"string","title":"GUINEA-BISSAU","enum":["https://demo.com/attr/relto/value/gnb"]},{"type":"string","title":"EQUATORIAL GUINEA","enum":["https://demo.com/attr/relto/value/gnq"]},{"type":"string","title":"GREECE","enum":["https://demo.com/attr/relto/value/grc"]},{"type":"string","title":"GRENADA","enum":["https://demo.com/attr/relto/value/grd"]},{"type":"string","title":"GREENLAND","enum":["https://demo.com/attr/relto/value/grl"]},{"type":"string","title":"GUATEMALA","enum":["https://demo.com/attr/relto/value/gtm"]},{"type":"string","title":"FRENCH GUIANA","enum":["https://demo.com/attr/relto/value/guf"]},{"type":"string","title":"GUAM","enum":["https://demo.com/attr/relto/value/gum"]},{"type":"string","title":"GUYANA","enum":["https://demo.com/attr/relto/value/guy"]},{"type":"string","title":"HONG KONG","enum":["https://demo.com/attr/relto/value/hkg"]},{"type":"string","title":"HEARD ISLAND AND MCDONALD ISLANDS","enum":["https://demo.com/attr/relto/value/hmd"]},{"type":"string","title":"HONDURAS","enum":["https://demo.com/attr/relto/value/hnd"]},{"type":"string","title":"CROATIA","enum":["https://demo.com/attr/relto/value/hrv"]},{"type":"string","title":"HAITI","enum":["https://demo.com/attr/relto/value/hti"]},{"type":"string","title":"HUNGARY","enum":["https://demo.com/attr/relto/value/hun"]},{"type":"string","title":"INDONESIA","enum":["https://demo.com/attr/relto/value/idn"]},{"type":"string","title":"ISLE OF MAN","enum":["https://demo.com/attr/relto/value/imn"]},{"type":"string","title":"INDIA","enum":["https://demo.com/attr/relto/value/ind"]},{"type":"string","title":"BRITISH INDIAN OCEAN TERRITORY","enum":["https://demo.com/attr/relto/value/iot"]},{"type":"string","title":"IRELAND","enum":["https://demo.com/attr/relto/value/irl"]},{"type":"string","title":"IRAN","enum":["https://demo.com/attr/relto/value/irn"]},{"type":"string","title":"IRAQ","enum":["https://demo.com/attr/relto/value/irq"]},{"type":"string","title":"ICELAND","enum":["https://demo.com/attr/relto/value/isl"]},{"type":"string","title":"ISRAEL","enum":["https://demo.com/attr/relto/value/isr"]},{"type":"string","title":"ITALY","enum":["https://demo.com/attr/relto/value/ita"]},{"type":"string","title":"JAMAICA","enum":["https://demo.com/attr/relto/value/jam"]},{"type":"string","title":"JERSEY","enum":["https://demo.com/attr/relto/value/jey"]},{"type":"string","title":"JORDAN","enum":["https://demo.com/attr/relto/value/jor"]},{"type":"string","title":"JAPAN","enum":["https://demo.com/attr/relto/value/jpn"]},{"type":"string","title":"KAZAKHSTAN","enum":["https://demo.com/attr/relto/value/kaz"]},{"type":"string","title":"KENYA","enum":["https://demo.com/attr/relto/value/ken"]},{"type":"string","title":"KYRGYZSTAN","enum":["https://demo.com/attr/relto/value/kgz"]},{"type":"string","title":"CAMBODIA","enum":["https://demo.com/attr/relto/value/khm"]},{"type":"string","title":"KIRIBATI","enum":["https://demo.com/attr/relto/value/kir"]},{"type":"string","title":"SAINT KITTS AND NEVIS","enum":["https://demo.com/attr/relto/value/kna"]},{"type":"string","title":"KOREA, SOUTH","enum":["https://demo.com/attr/relto/value/kor"]},{"type":"string","title":"KUWAIT","enum":["https://demo.com/attr/relto/value/kwt"]},{"type":"string","title":"LAOS","enum":["https://demo.com/attr/relto/value/lao"]},{"type":"string","title":"LEBANON","enum":["https://demo.com/attr/relto/value/lbn"]},{"type":"string","title":"LIBERIA","enum":["https://demo.com/attr/relto/value/lbr"]},{"type":"string","title":"LIBYA","enum":["https://demo.com/attr/relto/value/lby"]},{"type":"string","title":"SAINT LUCIA","enum":["https://demo.com/attr/relto/value/lca"]},{"type":"string","title":"LIECHTENSTEIN","enum":["https://demo.com/attr/relto/value/lie"]},{"type":"string","title":"SRI LANKA","enum":["https://demo.com/attr/relto/value/lka"]},{"type":"string","title":"LESOTHO","enum":["https://demo.com/attr/relto/value/lso"]},{"type":"string","title":"LITHUANIA","enum":["https://demo.com/attr/relto/value/ltu"]},{"type":"string","title":"LUXEMBOURG","enum":["https://demo.com/attr/relto/value/lux"]},{"type":"string","title":"LATVIA","enum":["https://demo.com/attr/relto/value/lva"]},{"type":"string","title":"MACAU","enum":["https://demo.com/attr/relto/value/mac"]},{"type":"string","title":"SAINT MARTIN","enum":["https://demo.com/attr/relto/value/maf"]},{"type":"string","title":"MOROCCO","enum":["https://demo.com/attr/relto/value/mar"]},{"type":"string","title":"MONACO","enum":["https://demo.com/attr/relto/value/mco"]},{"type":"string","title":"MOLDOVA","enum":["https://demo.com/attr/relto/value/mda"]},{"type":"string","title":"MADAGASCAR","enum":["https://demo.com/attr/relto/value/mdg"]},{"type":"string","title":"MALDIVES","enum":["https://demo.com/attr/relto/value/mdv"]},{"type":"string","title":"MEXICO","enum":["https://demo.com/attr/relto/value/mex"]},{"type":"string","title":"MARSHALL ISLANDS","enum":["https://demo.com/attr/relto/value/mhl"]},{"type":"string","title":"MACEDONIA","enum":["https://demo.com/attr/relto/value/mkd"]},{"type":"string","title":"MALI","enum":["https://demo.com/attr/relto/value/mli"]},{"type":"string","title":"MALTA","enum":["https://demo.com/attr/relto/value/mlt"]},{"type":"string","title":"BURMA","enum":["https://demo.com/attr/relto/value/mmr"]},{"type":"string","title":"MONTENEGRO","enum":["https://demo.com/attr/relto/value/mne"]},{"type":"string","title":"MONGOLIA","enum":["https://demo.com/attr/relto/value/mng"]},{"type":"string","title":"NORTHERN MARIANA ISLANDS","enum":["https://demo.com/attr/relto/value/mnp"]},{"type":"string","title":"MOZAMBIQUE","enum":["https://demo.com/attr/relto/value/moz"]},{"type":"string","title":"MAURITANIA","enum":["https://demo.com/attr/relto/value/mrt"]},{"type":"string","title":"MONTSERRAT","enum":["https://demo.com/attr/relto/value/msr"]},{"type":"string","title":"MARTINIQUE","enum":["https://demo.com/attr/relto/value/mtq"]},{"type":"string","title":"MAURITIUS","enum":["https://demo.com/attr/relto/value/mus"]},{"type":"string","title":"MALAWI","enum":["https://demo.com/attr/relto/value/mwi"]},{"type":"string","title":"MALAYSIA","enum":["https://demo.com/attr/relto/value/mys"]},{"type":"string","title":"MAYOTTE","enum":["https://demo.com/attr/relto/value/myt"]},{"type":"string","title":"NAMIBIA","enum":["https://demo.com/attr/relto/value/nam"]},{"type":"string","title":"NEW CALEDONIA","enum":["https://demo.com/attr/relto/value/ncl"]},{"type":"string","title":"NIGER","enum":["https://demo.com/attr/relto/value/ner"]},{"type":"string","title":"NORFOLK ISLAND","enum":["https://demo.com/attr/relto/value/nfk"]},{"type":"string","title":"NIGERIA","enum":["https://demo.com/attr/relto/value/nga"]},{"type":"string","title":"NICARAGUA","enum":["https://demo.com/attr/relto/value/nic"]},{"type":"string","title":"NIUE","enum":["https://demo.com/attr/relto/value/niu"]},{"type":"string","title":"NETHERLANDS","enum":["https://demo.com/attr/relto/value/nld"]},{"type":"string","title":"NORWAY","enum":["https://demo.com/attr/relto/value/nor"]},{"type":"string","title":"NEPAL","enum":["https://demo.com/attr/relto/value/npl"]},{"type":"string","title":"NAURU","enum":["https://demo.com/attr/relto/value/nru"]},{"type":"string","title":"NEW ZEALAND","enum":["https://demo.com/attr/relto/value/nzl"]},{"type":"string","title":"OMAN","enum":["https://demo.com/attr/relto/value/omn"]},{"type":"string","title":"PAKISTAN","enum":["https://demo.com/attr/relto/value/pak"]},{"type":"string","title":"PANAMA","enum":["https://demo.com/attr/relto/value/pan"]},{"type":"string","title":"PITCAIRN ISLANDS","enum":["https://demo.com/attr/relto/value/pcn"]},{"type":"string","title":"PERU","enum":["https://demo.com/attr/relto/value/per"]},{"type":"string","title":"PHILIPPINES","enum":["https://demo.com/attr/relto/value/phl"]},{"type":"string","title":"PALAU","enum":["https://demo.com/attr/relto/value/plw"]},{"type":"string","title":"PAPUA NEW GUINEA","enum":["https://demo.com/attr/relto/value/png"]},{"type":"string","title":"POLAND","enum":["https://demo.com/attr/relto/value/pol"]},{"type":"string","title":"PUERTO RICO","enum":["https://demo.com/attr/relto/value/pri"]},{"type":"string","title":"KOREA, NORTH","enum":["https://demo.com/attr/relto/value/prk"]},{"type":"string","title":"PORTUGAL","enum":["https://demo.com/attr/relto/value/prt"]},{"type":"string","title":"PARAGUAY","enum":["https://demo.com/attr/relto/value/pry"]},{"type":"string","title":"PALESTINE","enum":["https://demo.com/attr/relto/value/pse"]},{"type":"string","title":"FRENCH POLYNESIA","enum":["https://demo.com/attr/relto/value/pyf"]},{"type":"string","title":"QATAR","enum":["https://demo.com/attr/relto/value/qat"]},{"type":"string","title":"REUNION","enum":["https://demo.com/attr/relto/value/reu"]},{"type":"string","title":"ROMANIA","enum":["https://demo.com/attr/relto/value/rou"]},{"type":"string","title":"RUSSIA","enum":["https://demo.com/attr/relto/value/rus"]},{"type":"string","title":"RWANDA","enum":["https://demo.com/attr/relto/value/rwa"]},{"type":"string","title":"SAUDI ARABIA","enum":["https://demo.com/attr/relto/value/sau"]},{"type":"string","title":"SUDAN","enum":["https://demo.com/attr/relto/value/sdn"]},{"type":"string","title":"SENEGAL","enum":["https://demo.com/attr/relto/value/sen"]},{"type":"string","title":"SINGAPORE","enum":["https://demo.com/attr/relto/value/sgp"]},{"type":"string","title":"SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS","enum":["https://demo.com/attr/relto/value/sgs"]},{"type":"string","title":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA","enum":["https://demo.com/attr/relto/value/shn"]},{"type":"string","title":"SVALBARD","enum":["https://demo.com/attr/relto/value/sjm"]},{"type":"string","title":"SOLOMON ISLANDS","enum":["https://demo.com/attr/relto/value/slb"]},{"type":"string","title":"SIERRA LEONE","enum":["https://demo.com/attr/relto/value/sle"]},{"type":"string","title":"EL SALVADOR","enum":["https://demo.com/attr/relto/value/slv"]},{"type":"string","title":"SAN MARINO","enum":["https://demo.com/attr/relto/value/smr"]},{"type":"string","title":"SOMALIA","enum":["https://demo.com/attr/relto/value/som"]},{"type":"string","title":"SAINT PIERRE AND MIQUELON","enum":["https://demo.com/attr/relto/value/spm"]},{"type":"string","title":"SERBIA","enum":["https://demo.com/attr/relto/value/srb"]},{"type":"string","title":"SOUTH SUDAN","enum":["https://demo.com/attr/relto/value/ssd"]},{"type":"string","title":"SAO TOME AND PRINCIPE","enum":["https://demo.com/attr/relto/value/stp"]},{"type":"string","title":"SURINAME","enum":["https://demo.com/attr/relto/value/sur"]},{"type":"string","title":"SLOVAKIA","enum":["https://demo.com/attr/relto/value/svk"]},{"type":"string","title":"SLOVENIA","enum":["https://demo.com/attr/relto/value/svn"]},{"type":"string","title":"SWEDEN","enum":["https://demo.com/attr/relto/value/swe"]},{"type":"string","title":"SWAZILAND","enum":["https://demo.com/attr/relto/value/swz"]},{"type":"string","title":"SINT MAARTEN","enum":["https://demo.com/attr/relto/value/sxm"]},{"type":"string","title":"SEYCHELLES","enum":["https://demo.com/attr/relto/value/syc"]},{"type":"string","title":"SYRIA","enum":["https://demo.com/attr/relto/value/syr"]},{"type":"string","title":"TURKS AND CAICOS ISLANDS","enum":["https://demo.com/attr/relto/value/tca"]},{"type":"string","title":"CHAD","enum":["https://demo.com/attr/relto/value/tcd"]},{"type":"string","title":"TOGO","enum":["https://demo.com/attr/relto/value/tgo"]},{"type":"string","title":"THAILAND","enum":["https://demo.com/attr/relto/value/tha"]},{"type":"string","title":"TAJIKISTAN","enum":["https://demo.com/attr/relto/value/tjk"]},{"type":"string","title":"TOKELAU","enum":["https://demo.com/attr/relto/value/tkl"]},{"type":"string","title":"TURKMENISTAN","enum":["https://demo.com/attr/relto/value/tkm"]},{"type":"string","title":"TIMOR-LESTE","enum":["https://demo.com/attr/relto/value/tls"]},{"type":"string","title":"TONGA","enum":["https://demo.com/attr/relto/value/ton"]},{"type":"string","title":"TRINIDAD AND TOBAGO","enum":["https://demo.com/attr/relto/value/tto"]},{"type":"string","title":"TUNISIA","enum":["https://demo.com/attr/relto/value/tun"]},{"type":"string","title":"TURKEY","enum":["https://demo.com/attr/relto/value/tur"]},{"type":"string","title":"TUVALU","enum":["https://demo.com/attr/relto/value/tuv"]},{"type":"string","title":"TAIWAN","enum":["https://demo.com/attr/relto/value/twn"]},{"type":"string","title":"TANZANIA","enum":["https://demo.com/attr/relto/value/tza"]},{"type":"string","title":"UGANDA","enum":["https://demo.com/attr/relto/value/uga"]},{"type":"string","title":"UKRAINE","enum":["https://demo.com/attr/relto/value/ukr"]},{"type":"string","title":"US MINOR OUTLYING ISLANDS","enum":["https://demo.com/attr/relto/value/umi"]},{"type":"string","title":"URUGUAY","enum":["https://demo.com/attr/relto/value/ury"]},{"type":"string","title":"UZBEKISTAN","enum":["https://demo.com/attr/relto/value/uzb"]},{"type":"string","title":"VATICAN CITY","enum":["https://demo.com/attr/relto/value/vat"]},{"type":"string","title":"SAINT VINCENT AND THE GRENADINES","enum":["https://demo.com/attr/relto/value/vct"]},{"type":"string","title":"VENEZUELA","enum":["https://demo.com/attr/relto/value/ven"]},{"type":"string","title":"VIRGIN ISLANDS, BRITISH","enum":["https://demo.com/attr/relto/value/vgb"]},{"type":"string","title":"VIRGIN ISLANDS, U.S.","enum":["https://demo.com/attr/relto/value/vir"]},{"type":"string","title":"VIETNAM","enum":["https://demo.com/attr/relto/value/vnm"]},{"type":"string","title":"VANUATU","enum":["https://demo.com/attr/relto/value/vut"]},{"type":"string","title":"WALLIS AND FUTUNA","enum":["https://demo.com/attr/relto/value/wlf"]},{"type":"string","title":"SAMOA","enum":["https://demo.com/attr/relto/value/wsm"]},{"type":"string","title":"YEMEN","enum":["https://demo.com/attr/relto/value/yem"]},{"type":"string","title":"SOUTH AFRICA","enum":["https://demo.com/attr/relto/value/zaf"]},{"type":"string","title":"ZAMBIA","enum":["https://demo.com/attr/relto/value/zmb"]},{"type":"string","title":"ZIMBABWE","enum":["https://demo.com/attr/relto/value/zwe"]}]},"countries":{"enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"],"enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}]},"milSymbols":{"enum":["SUP*------*****","SFP*------*****","SNP*------*****","SHP*------*****","SUP*S-----*****","SFP*S-----*****","SNP*S-----*****","SHP*S-----*****","SUP*V-----*****","SFP*V-----*****","SNP*V-----*****","SHP*V-----*****","SUP*T-----*****","SFP*T-----*****","SNP*T-----*****","SHP*T-----*****","SUP*L-----*****","SFP*L-----*****","SNP*L-----*****","SHP*L-----*****","SUA*------*****","SFA*------*****","SNA*------*****","SHA*------*****","SUA*M-----*****","SFA*M-----*****","SNA*M-----*****","SHA*M-----*****","SUA*MF----*****","SFA*MF----*****","SNA*MF----*****","SHA*MF----*****","SUA*MFB---*****","SFA*MFB---*****","SNA*MFB---*****","SHA*MFB---*****","SUA*MFF---*****","SFA*MFF---*****","SNA*MFF---*****","SHA*MFF---*****","SUA*MFFI--*****","SFA*MFFI--*****","SNA*MFFI--*****","SHA*MFFI--*****","SUA*MFT---*****","SFA*MFT---*****","SNA*MFT---*****","SHA*MFT---*****","SUA*MFA---*****","SFA*MFA---*****","SNA*MFA---*****","SHA*MFA---*****","SUA*MFL---*****","SFA*MFL---*****","SNA*MFL---*****","SHA*MFL---*****","SUA*MFK---*****","SFA*MFK---*****","SNA*MFK---*****","SHA*MFK---*****","SUA*MFKB--*****","SFA*MFKB--*****","SNA*MFKB--*****","SHA*MFKB--*****","SUA*MFKD--*****","SFA*MFKD--*****","SNA*MFKD--*****","SHA*MFKD--*****","SUA*MFC---*****","SFA*MFC---*****","SNA*MFC---*****","SHA*MFC---*****","SUA*MFCL--*****","SFA*MFCL--*****","SNA*MFCL--*****","SHA*MFCL--*****","SUA*MFCM--*****","SFA*MFCM--*****","SNA*MFCM--*****","SHA*MFCM--*****","SUA*MFCH--*****","SFA*MFCH--*****","SNA*MFCH--*****","SHA*MFCH--*****","SUA*MFJ---*****","SFA*MFJ---*****","SNA*MFJ---*****","SHA*MFJ---*****","SUA*MFO---*****","SFA*MFO---*****","SNA*MFO---*****","SHA*MFO---*****","SUA*MFR---*****","SFA*MFR---*****","SNA*MFR---*****","SHA*MFR---*****","SUA*MFRW--*****","SFA*MFRW--*****","SNA*MFRW--*****","SHA*MFRW--*****","SUA*MFRZ--*****","SFA*MFRZ--*****","SNA*MFRZ--*****","SHA*MFRZ--*****","SUA*MFRX--*****","SFA*MFRX--*****","SNA*MFRX--*****","SHA*MFRX--*****","SUA*MFP---*****","SFA*MFP---*****","SNA*MFP---*****","SHA*MFP---*****","SUA*MFPN--*****","SFA*MFPN--*****","SNA*MFPN--*****","SHA*MFPN--*****","SUA*MFPM--*****","SFA*MFPM--*****","SNA*MFPM--*****","SHA*MFPM--*****","SUA*MFU---*****","SFA*MFU---*****","SNA*MFU---*****","SHA*MFU---*****","SUA*MFUL--*****","SFA*MFUL--*****","SNA*MFUL--*****","SHA*MFUL--*****","SUA*MFUM--*****","SFA*MFUM--*****","SNA*MFUM--*****","SHA*MFUM--*****","SUA*MFUH--*****","SFA*MFUH--*****","SNA*MFUH--*****","SHA*MFUH--*****","SUA*MFY---*****","SFA*MFY---*****","SNA*MFY---*****","SHA*MFY---*****","SUA*MFH---*****","SFA*MFH---*****","SNA*MFH---*****","SHA*MFH---*****","SUA*MFD---*****","SFA*MFD---*****","SNA*MFD---*****","SHA*MFD---*****","SUA*MFQ---*****","SFA*MFQ---*****","SNA*MFQ---*****","SHA*MFQ---*****","SUA*MFQA--*****","SFA*MFQA--*****","SNA*MFQA--*****","SHA*MFQA--*****","SUA*MFQB--*****","SFA*MFQB--*****","SNA*MFQB--*****","SHA*MFQB--*****","SUA*MFQC--*****","SFA*MFQC--*****","SNA*MFQC--*****","SHA*MFQC--*****","SUA*MFQD--*****","SFA*MFQD--*****","SNA*MFQD--*****","SHA*MFQD--*****","SUA*MFQF--*****","SFA*MFQF--*****","SNA*MFQF--*****","SHA*MFQF--*****","SUA*MFQH--*****","SFA*MFQH--*****","SNA*MFQH--*****","SHA*MFQH--*****","SUA*MFQJ--*****","SFA*MFQJ--*****","SNA*MFQJ--*****","SHA*MFQJ--*****","SUA*MFQK--*****","SFA*MFQK--*****","SNA*MFQK--*****","SHA*MFQK--*****","SUA*MFQL--*****","SFA*MFQL--*****","SNA*MFQL--*****","SHA*MFQL--*****","SUA*MFQM--*****","SFA*MFQM--*****","SNA*MFQM--*****","SHA*MFQM--*****","SUA*MFQI--*****","SFA*MFQI--*****","SNA*MFQI--*****","SHA*MFQI--*****","SUA*MFQN--*****","SFA*MFQN--*****","SNA*MFQN--*****","SHA*MFQN--*****","SUA*MFQP--*****","SFA*MFQP--*****","SNA*MFQP--*****","SHA*MFQP--*****","SUA*MFQR--*****","SFA*MFQR--*****","SNA*MFQR--*****","SHA*MFQR--*****","SUA*MFQRW-*****","SFA*MFQRW-*****","SNA*MFQRW-*****","SHA*MFQRW-*****","SUA*MFQRZ-*****","SFA*MFQRZ-*****","SNA*MFQRZ-*****","SHA*MFQRZ-*****","SUA*MFQRX-*****","SFA*MFQRX-*****","SNA*MFQRX-*****","SHA*MFQRX-*****","SUA*MFQS--*****","SFA*MFQS--*****","SNA*MFQS--*****","SHA*MFQS--*****","SUA*MFQT--*****","SFA*MFQT--*****","SNA*MFQT--*****","SHA*MFQT--*****","SUA*MFQU--*****","SFA*MFQU--*****","SNA*MFQU--*****","SHA*MFQU--*****","SUA*MFQY--*****","SFA*MFQY--*****","SNA*MFQY--*****","SHA*MFQY--*****","SUA*MFQO--*****","SFA*MFQO--*****","SNA*MFQO--*****","SHA*MFQO--*****","SUA*MFS---*****","SFA*MFS---*****","SNA*MFS---*****","SHA*MFS---*****","SUA*MFM---*****","SFA*MFM---*****","SNA*MFM---*****","SHA*MFM---*****","SUA*MH----*****","SFA*MH----*****","SNA*MH----*****","SHA*MH----*****","SUA*MHA---*****","SFA*MHA---*****","SNA*MHA---*****","SHA*MHA---*****","SUA*MHS---*****","SFA*MHS---*****","SNA*MHS---*****","SHA*MHS---*****","SUA*MHU---*****","SFA*MHU---*****","SNA*MHU---*****","SHA*MHU---*****","SUA*MHUL--*****","SFA*MHUL--*****","SNA*MHUL--*****","SHA*MHUL--*****","SUA*MHUM--*****","SFA*MHUM--*****","SNA*MHUM--*****","SHA*MHUM--*****","SUA*MHUH--*****","SFA*MHUH--*****","SNA*MHUH--*****","SHA*MHUH--*****","SUA*MHI---*****","SFA*MHI---*****","SNA*MHI---*****","SHA*MHI---*****","SUA*MHH---*****","SFA*MHH---*****","SNA*MHH---*****","SHA*MHH---*****","SUA*MHR---*****","SFA*MHR---*****","SNA*MHR---*****","SHA*MHR---*****","SUA*MHQ---*****","SFA*MHQ---*****","SNA*MHQ---*****","SHA*MHQ---*****","SUA*MHC---*****","SFA*MHC---*****","SNA*MHC---*****","SHA*MHC---*****","SUA*MHCL--*****","SFA*MHCL--*****","SNA*MHCL--*****","SHA*MHCL--*****","SUA*MHCM--*****","SFA*MHCM--*****","SNA*MHCM--*****","SHA*MHCM--*****","SUA*MHCH--*****","SFA*MHCH--*****","SNA*MHCH--*****","SHA*MHCH--*****","SUA*MHT---*****","SFA*MHT---*****","SNA*MHT---*****","SHA*MHT---*****","SUA*MHO---*****","SFA*MHO---*****","SNA*MHO---*****","SHA*MHO---*****","SUA*MHM---*****","SFA*MHM---*****","SNA*MHM---*****","SHA*MHM---*****","SUA*MHD---*****","SFA*MHD---*****","SNA*MHD---*****","SHA*MHD---*****","SUA*MHK---*****","SFA*MHK---*****","SNA*MHK---*****","SHA*MHK---*****","SUA*MHJ---*****","SFA*MHJ---*****","SNA*MHJ---*****","SHA*MHJ---*****","SUA*ML----*****","SFA*ML----*****","SNA*ML----*****","SHA*ML----*****","SUA*MV----*****","SFA*MV----*****","SNA*MV----*****","SHA*MV----*****","SUA*ME----*****","SFA*ME----*****","SNA*ME----*****","SHA*ME----*****","SUA*W-----*****","SFA*W-----*****","SNA*W-----*****","SHA*W-----*****","SUA*WM----*****","SFA*WM----*****","SNA*WM----*****","SHA*WM----*****","SUA*WMS---*****","SFA*WMS---*****","SNA*WMS---*****","SHA*WMS---*****","SUA*WMSS--*****","SFA*WMSS--*****","SNA*WMSS--*****","SHA*WMSS--*****","SUA*WMSA--*****","SFA*WMSA--*****","SNA*WMSA--*****","SHA*WMSA--*****","SUA*WMSU--*****","SFA*WMSU--*****","SNA*WMSU--*****","SHA*WMSU--*****","SUA*WMSB--*****","SFA*WMSB--*****","SNA*WMSB--*****","SHA*WMSB--*****","SUA*WMA---*****","SFA*WMA---*****","SNA*WMA---*****","SHA*WMA---*****","SUA*WMAS--*****","SFA*WMAS--*****","SNA*WMAS--*****","SHA*WMAS--*****","SUA*WMAA--*****","SFA*WMAA--*****","SNA*WMAA--*****","SHA*WMAA--*****","SUA*WMAP--*****","SFA*WMAP--*****","SNA*WMAP--*****","SHA*WMAP--*****","SUA*WMU---*****","SFA*WMU---*****","SNA*WMU---*****","SHA*WMU---*****","SUA*WMCM--*****","SFA*WMCM--*****","SNA*WMCM--*****","SHA*WMCM--*****","SUA*WMB---*****","SFA*WMB---*****","SNA*WMB---*****","SHA*WMB---*****","SUA*WB----*****","SFA*WB----*****","SNA*WB----*****","SHA*WB----*****","SUA*WD----*****","SFA*WD----*****","SNA*WD----*****","SHA*WD----*****","SUA*C-----*****","SFA*C-----*****","SNA*C-----*****","SHA*C-----*****","SUA*CF----*****","SFA*CF----*****","SNA*CF----*****","SHA*CF----*****","SUA*CH----*****","SFA*CH----*****","SNA*CH----*****","SHA*CH----*****","SUA*CL----*****","SFA*CL----*****","SNA*CL----*****","SHA*CL----*****","SUG*------*****","SFG*------*****","SNG*------*****","SHG*------*****","SUG*U-----*****","SFG*U-----*****","SNG*U-----*****","SHG*U-----*****","SUG*UC----*****","SFG*UC----*****","SNG*UC----*****","SHG*UC----*****","SUG*UCD---*****","SFG*UCD---*****","SNG*UCD---*****","SHG*UCD---*****","SUG*UCDS--*****","SFG*UCDS--*****","SNG*UCDS--*****","SHG*UCDS--*****","SUG*UCDSC-*****","SFG*UCDSC-*****","SNG*UCDSC-*****","SHG*UCDSC-*****","SUG*UCDSS-*****","SFG*UCDSS-*****","SNG*UCDSS-*****","SHG*UCDSS-*****","SUG*UCDSV-*****","SFG*UCDSV-*****","SNG*UCDSV-*****","SHG*UCDSV-*****","SUG*UCDM--*****","SFG*UCDM--*****","SNG*UCDM--*****","SHG*UCDM--*****","SUG*UCDML-*****","SFG*UCDML-*****","SNG*UCDML-*****","SHG*UCDML-*****","SUG*UCDMLA*****","SFG*UCDMLA*****","SNG*UCDMLA*****","SHG*UCDMLA*****","SUG*UCDMM-*****","SFG*UCDMM-*****","SNG*UCDMM-*****","SHG*UCDMM-*****","SUG*UCDMH-*****","SFG*UCDMH-*****","SNG*UCDMH-*****","SHG*UCDMH-*****","SUG*UCDH--*****","SFG*UCDH--*****","SNG*UCDH--*****","SHG*UCDH--*****","SUG*UCDHH-*****","SFG*UCDHH-*****","SNG*UCDHH-*****","SHG*UCDHH-*****","SUG*UCDHP-*****","SFG*UCDHP-*****","SNG*UCDHP-*****","SHG*UCDHP-*****","SUG*UCDG--*****","SFG*UCDG--*****","SNG*UCDG--*****","SHG*UCDG--*****","SUG*UCDC--*****","SFG*UCDC--*****","SNG*UCDC--*****","SHG*UCDC--*****","SUG*UCDT--*****","SFG*UCDT--*****","SNG*UCDT--*****","SHG*UCDT--*****","SUG*UCDO--*****","SFG*UCDO--*****","SNG*UCDO--*****","SHG*UCDO--*****","SUG*UCA---*****","SFG*UCA---*****","SNG*UCA---*****","SHG*UCA---*****","SUG*UCAT--*****","SFG*UCAT--*****","SNG*UCAT--*****","SHG*UCAT--*****","SUG*UCATA-*****","SFG*UCATA-*****","SNG*UCATA-*****","SHG*UCATA-*****","SUG*UCATW-*****","SFG*UCATW-*****","SNG*UCATW-*****","SHG*UCATW-*****","SUG*UCATWR*****","SFG*UCATWR*****","SNG*UCATWR*****","SHG*UCATWR*****","SUG*UCATL-*****","SFG*UCATL-*****","SNG*UCATL-*****","SHG*UCATL-*****","SUG*UCATM-*****","SFG*UCATM-*****","SNG*UCATM-*****","SHG*UCATM-*****","SUG*UCATH-*****","SFG*UCATH-*****","SNG*UCATH-*****","SHG*UCATH-*****","SUG*UCATR-*****","SFG*UCATR-*****","SNG*UCATR-*****","SHG*UCATR-*****","SUG*UCAW--*****","SFG*UCAW--*****","SNG*UCAW--*****","SHG*UCAW--*****","SUG*UCAWS-*****","SFG*UCAWS-*****","SNG*UCAWS-*****","SHG*UCAWS-*****","SUG*UCAWA-*****","SFG*UCAWA-*****","SNG*UCAWA-*****","SHG*UCAWA-*****","SUG*UCAWW-*****","SFG*UCAWW-*****","SNG*UCAWW-*****","SHG*UCAWW-*****","SUG*UCAWWR*****","SFG*UCAWWR*****","SNG*UCAWWR*****","SHG*UCAWWR*****","SUG*UCAWL-*****","SFG*UCAWL-*****","SNG*UCAWL-*****","SHG*UCAWL-*****","SUG*UCAWM-*****","SFG*UCAWM-*****","SNG*UCAWM-*****","SHG*UCAWM-*****","SUG*UCAWH-*****","SFG*UCAWH-*****","SNG*UCAWH-*****","SHG*UCAWH-*****","SUG*UCAWR-*****","SFG*UCAWR-*****","SNG*UCAWR-*****","SHG*UCAWR-*****","SUG*UCAA--*****","SFG*UCAA--*****","SNG*UCAA--*****","SHG*UCAA--*****","SUG*UCAAD-*****","SFG*UCAAD-*****","SNG*UCAAD-*****","SHG*UCAAD-*****","SUG*UCAAL-*****","SFG*UCAAL-*****","SNG*UCAAL-*****","SHG*UCAAL-*****","SUG*UCAAM-*****","SFG*UCAAM-*****","SNG*UCAAM-*****","SHG*UCAAM-*****","SUG*UCAAS-*****","SFG*UCAAS-*****","SNG*UCAAS-*****","SHG*UCAAS-*****","SUG*UCAAU-*****","SFG*UCAAU-*****","SNG*UCAAU-*****","SHG*UCAAU-*****","SUG*UCAAC-*****","SFG*UCAAC-*****","SNG*UCAAC-*****","SHG*UCAAC-*****","SUG*UCAAA-*****","SFG*UCAAA-*****","SNG*UCAAA-*****","SHG*UCAAA-*****","SUG*UCAAAT*****","SFG*UCAAAT*****","SNG*UCAAAT*****","SHG*UCAAAT*****","SUG*UCAAAW*****","SFG*UCAAAW*****","SNG*UCAAAW*****","SHG*UCAAAW*****","SUG*UCAAAS*****","SFG*UCAAAS*****","SNG*UCAAAS*****","SHG*UCAAAS*****","SUG*UCAAO-*****","SFG*UCAAO-*****","SNG*UCAAO-*****","SHG*UCAAO-*****","SUG*UCAAOS*****","SFG*UCAAOS*****","SNG*UCAAOS*****","SHG*UCAAOS*****","SUG*UCV---*****","SFG*UCV---*****","SNG*UCV---*****","SHG*UCV---*****","SUG*UCVF--*****","SFG*UCVF--*****","SNG*UCVF--*****","SHG*UCVF--*****","SUG*UCVFU-*****","SFG*UCVFU-*****","SNG*UCVFU-*****","SHG*UCVFU-*****","SUG*UCVFA-*****","SFG*UCVFA-*****","SNG*UCVFA-*****","SHG*UCVFA-*****","SUG*UCVFR-*****","SFG*UCVFR-*****","SNG*UCVFR-*****","SHG*UCVFR-*****","SUG*UCVR--*****","SFG*UCVR--*****","SNG*UCVR--*****","SHG*UCVR--*****","SUG*UCVRA-*****","SFG*UCVRA-*****","SNG*UCVRA-*****","SHG*UCVRA-*****","SUG*UCVRS-*****","SFG*UCVRS-*****","SNG*UCVRS-*****","SHG*UCVRS-*****","SUG*UCVRW-*****","SFG*UCVRW-*****","SNG*UCVRW-*****","SHG*UCVRW-*****","SUG*UCVRU-*****","SFG*UCVRU-*****","SNG*UCVRU-*****","SHG*UCVRU-*****","SUG*UCVRUL*****","SFG*UCVRUL*****","SNG*UCVRUL*****","SHG*UCVRUL*****","SUG*UCVRUM*****","SFG*UCVRUM*****","SNG*UCVRUM*****","SHG*UCVRUM*****","SUG*UCVRUH*****","SFG*UCVRUH*****","SNG*UCVRUH*****","SHG*UCVRUH*****","SUG*UCVRUC*****","SFG*UCVRUC*****","SNG*UCVRUC*****","SHG*UCVRUC*****","SUG*UCVRUE*****","SFG*UCVRUE*****","SNG*UCVRUE*****","SHG*UCVRUE*****","SUG*UCVRM-*****","SFG*UCVRM-*****","SNG*UCVRM-*****","SHG*UCVRM-*****","SUG*UCVS--*****","SFG*UCVS--*****","SNG*UCVS--*****","SHG*UCVS--*****","SUG*UCVC--*****","SFG*UCVC--*****","SNG*UCVC--*****","SHG*UCVC--*****","SUG*UCVV--*****","SFG*UCVV--*****","SNG*UCVV--*****","SHG*UCVV--*****","SUG*UCVU--*****","SFG*UCVU--*****","SNG*UCVU--*****","SHG*UCVU--*****","SUG*UCVUF-*****","SFG*UCVUF-*****","SNG*UCVUF-*****","SHG*UCVUF-*****","SUG*UCVUR-*****","SFG*UCVUR-*****","SNG*UCVUR-*****","SHG*UCVUR-*****","SUG*UCI---*****","SFG*UCI---*****","SNG*UCI---*****","SHG*UCI---*****","SUG*UCIL--*****","SFG*UCIL--*****","SNG*UCIL--*****","SHG*UCIL--*****","SUG*UCIM--*****","SFG*UCIM--*****","SNG*UCIM--*****","SHG*UCIM--*****","SUG*UCIO--*****","SFG*UCIO--*****","SNG*UCIO--*****","SHG*UCIO--*****","SUG*UCIA--*****","SFG*UCIA--*****","SNG*UCIA--*****","SHG*UCIA--*****","SUG*UCIS--*****","SFG*UCIS--*****","SNG*UCIS--*****","SHG*UCIS--*****","SUG*UCIZ--*****","SFG*UCIZ--*****","SNG*UCIZ--*****","SHG*UCIZ--*****","SUG*UCIN--*****","SFG*UCIN--*****","SNG*UCIN--*****","SHG*UCIN--*****","SUG*UCII--*****","SFG*UCII--*****","SNG*UCII--*****","SHG*UCII--*****","SUG*UCIC--*****","SFG*UCIC--*****","SNG*UCIC--*****","SHG*UCIC--*****","SUG*UCE---*****","SFG*UCE---*****","SNG*UCE---*****","SHG*UCE---*****","SUG*UCEC--*****","SFG*UCEC--*****","SNG*UCEC--*****","SHG*UCEC--*****","SUG*UCECS-*****","SFG*UCECS-*****","SNG*UCECS-*****","SHG*UCECS-*****","SUG*UCECA-*****","SFG*UCECA-*****","SNG*UCECA-*****","SHG*UCECA-*****","SUG*UCECC-*****","SFG*UCECC-*****","SNG*UCECC-*****","SHG*UCECC-*****","SUG*UCECL-*****","SFG*UCECL-*****","SNG*UCECL-*****","SHG*UCECL-*****","SUG*UCECM-*****","SFG*UCECM-*****","SNG*UCECM-*****","SHG*UCECM-*****","SUG*UCECH-*****","SFG*UCECH-*****","SNG*UCECH-*****","SHG*UCECH-*****","SUG*UCECT-*****","SFG*UCECT-*****","SNG*UCECT-*****","SHG*UCECT-*****","SUG*UCECW-*****","SFG*UCECW-*****","SNG*UCECW-*****","SHG*UCECW-*****","SUG*UCECO-*****","SFG*UCECO-*****","SNG*UCECO-*****","SHG*UCECO-*****","SUG*UCECR-*****","SFG*UCECR-*****","SNG*UCECR-*****","SHG*UCECR-*****","SUG*UCEN--*****","SFG*UCEN--*****","SNG*UCEN--*****","SHG*UCEN--*****","SUG*UCENN-*****","SFG*UCENN-*****","SNG*UCENN-*****","SHG*UCENN-*****","SUG*UCF---*****","SFG*UCF---*****","SNG*UCF---*****","SHG*UCF---*****","SUG*UCFH--*****","SFG*UCFH--*****","SNG*UCFH--*****","SHG*UCFH--*****","SUG*UCFHE-*****","SFG*UCFHE-*****","SNG*UCFHE-*****","SHG*UCFHE-*****","SUG*UCFHS-*****","SFG*UCFHS-*****","SNG*UCFHS-*****","SHG*UCFHS-*****","SUG*UCFHA-*****","SFG*UCFHA-*****","SNG*UCFHA-*****","SHG*UCFHA-*****","SUG*UCFHC-*****","SFG*UCFHC-*****","SNG*UCFHC-*****","SHG*UCFHC-*****","SUG*UCFHO-*****","SFG*UCFHO-*****","SNG*UCFHO-*****","SHG*UCFHO-*****","SUG*UCFHL-*****","SFG*UCFHL-*****","SNG*UCFHL-*****","SHG*UCFHL-*****","SUG*UCFHM-*****","SFG*UCFHM-*****","SNG*UCFHM-*****","SHG*UCFHM-*****","SUG*UCFHH-*****","SFG*UCFHH-*****","SNG*UCFHH-*****","SHG*UCFHH-*****","SUG*UCFHX-*****","SFG*UCFHX-*****","SNG*UCFHX-*****","SHG*UCFHX-*****","SUG*UCFR--*****","SFG*UCFR--*****","SNG*UCFR--*****","SHG*UCFR--*****","SUG*UCFRS-*****","SFG*UCFRS-*****","SNG*UCFRS-*****","SHG*UCFRS-*****","SUG*UCFRSS*****","SFG*UCFRSS*****","SNG*UCFRSS*****","SHG*UCFRSS*****","SUG*UCFRSR*****","SFG*UCFRSR*****","SNG*UCFRSR*****","SHG*UCFRSR*****","SUG*UCFRST*****","SFG*UCFRST*****","SNG*UCFRST*****","SHG*UCFRST*****","SUG*UCFRM-*****","SFG*UCFRM-*****","SNG*UCFRM-*****","SHG*UCFRM-*****","SUG*UCFRMS*****","SFG*UCFRMS*****","SNG*UCFRMS*****","SHG*UCFRMS*****","SUG*UCFRMR*****","SFG*UCFRMR*****","SNG*UCFRMR*****","SHG*UCFRMR*****","SUG*UCFRMT*****","SFG*UCFRMT*****","SNG*UCFRMT*****","SHG*UCFRMT*****","SUG*UCFT--*****","SFG*UCFT--*****","SNG*UCFT--*****","SHG*UCFT--*****","SUG*UCFTR-*****","SFG*UCFTR-*****","SNG*UCFTR-*****","SHG*UCFTR-*****","SUG*UCFTS-*****","SFG*UCFTS-*****","SNG*UCFTS-*****","SHG*UCFTS-*****","SUG*UCFTF-*****","SFG*UCFTF-*****","SNG*UCFTF-*****","SHG*UCFTF-*****","SUG*UCFTC-*****","SFG*UCFTC-*****","SNG*UCFTC-*****","SHG*UCFTC-*****","SUG*UCFTCD*****","SFG*UCFTCD*****","SNG*UCFTCD*****","SHG*UCFTCD*****","SUG*UCFTCM*****","SFG*UCFTCM*****","SNG*UCFTCM*****","SHG*UCFTCM*****","SUG*UCFTA-*****","SFG*UCFTA-*****","SNG*UCFTA-*****","SHG*UCFTA-*****","SUG*UCFM--*****","SFG*UCFM--*****","SNG*UCFM--*****","SHG*UCFM--*****","SUG*UCFMS-*****","SFG*UCFMS-*****","SNG*UCFMS-*****","SHG*UCFMS-*****","SUG*UCFMW-*****","SFG*UCFMW-*****","SNG*UCFMW-*****","SHG*UCFMW-*****","SUG*UCFMT-*****","SFG*UCFMT-*****","SNG*UCFMT-*****","SHG*UCFMT-*****","SUG*UCFMTA*****","SFG*UCFMTA*****","SNG*UCFMTA*****","SHG*UCFMTA*****","SUG*UCFMTS*****","SFG*UCFMTS*****","SNG*UCFMTS*****","SHG*UCFMTS*****","SUG*UCFMTC*****","SFG*UCFMTC*****","SNG*UCFMTC*****","SHG*UCFMTC*****","SUG*UCFMTO*****","SFG*UCFMTO*****","SNG*UCFMTO*****","SHG*UCFMTO*****","SUG*UCFML-*****","SFG*UCFML-*****","SNG*UCFML-*****","SHG*UCFML-*****","SUG*UCFS--*****","SFG*UCFS--*****","SNG*UCFS--*****","SHG*UCFS--*****","SUG*UCFSS-*****","SFG*UCFSS-*****","SNG*UCFSS-*****","SHG*UCFSS-*****","SUG*UCFSA-*****","SFG*UCFSA-*****","SNG*UCFSA-*****","SHG*UCFSA-*****","SUG*UCFSL-*****","SFG*UCFSL-*****","SNG*UCFSL-*****","SHG*UCFSL-*****","SUG*UCFSO-*****","SFG*UCFSO-*****","SNG*UCFSO-*****","SHG*UCFSO-*****","SUG*UCFO--*****","SFG*UCFO--*****","SNG*UCFO--*****","SHG*UCFO--*****","SUG*UCFOS-*****","SFG*UCFOS-*****","SNG*UCFOS-*****","SHG*UCFOS-*****","SUG*UCFOA-*****","SFG*UCFOA-*****","SNG*UCFOA-*****","SHG*UCFOA-*****","SUG*UCFOL-*****","SFG*UCFOL-*****","SNG*UCFOL-*****","SHG*UCFOL-*****","SUG*UCFOO-*****","SFG*UCFOO-*****","SNG*UCFOO-*****","SHG*UCFOO-*****","SUG*UCR---*****","SFG*UCR---*****","SNG*UCR---*****","SHG*UCR---*****","SUG*UCRH--*****","SFG*UCRH--*****","SNG*UCRH--*****","SHG*UCRH--*****","SUG*UCRV--*****","SFG*UCRV--*****","SNG*UCRV--*****","SHG*UCRV--*****","SUG*UCRVA-*****","SFG*UCRVA-*****","SNG*UCRVA-*****","SHG*UCRVA-*****","SUG*UCRVM-*****","SFG*UCRVM-*****","SNG*UCRVM-*****","SHG*UCRVM-*****","SUG*UCRVG-*****","SFG*UCRVG-*****","SNG*UCRVG-*****","SHG*UCRVG-*****","SUG*UCRVO-*****","SFG*UCRVO-*****","SNG*UCRVO-*****","SHG*UCRVO-*****","SUG*UCRC--*****","SFG*UCRC--*****","SNG*UCRC--*****","SHG*UCRC--*****","SUG*UCRS--*****","SFG*UCRS--*****","SNG*UCRS--*****","SHG*UCRS--*****","SUG*UCRA--*****","SFG*UCRA--*****","SNG*UCRA--*****","SHG*UCRA--*****","SUG*UCRO--*****","SFG*UCRO--*****","SNG*UCRO--*****","SHG*UCRO--*****","SUG*UCRL--*****","SFG*UCRL--*****","SNG*UCRL--*****","SHG*UCRL--*****","SUG*UCRR--*****","SFG*UCRR--*****","SNG*UCRR--*****","SHG*UCRR--*****","SUG*UCRRD-*****","SFG*UCRRD-*****","SNG*UCRRD-*****","SHG*UCRRD-*****","SUG*UCRRF-*****","SFG*UCRRF-*****","SNG*UCRRF-*****","SHG*UCRRF-*****","SUG*UCRRL-*****","SFG*UCRRL-*****","SNG*UCRRL-*****","SHG*UCRRL-*****","SUG*UCRX--*****","SFG*UCRX--*****","SNG*UCRX--*****","SHG*UCRX--*****","SUG*UCM---*****","SFG*UCM---*****","SNG*UCM---*****","SHG*UCM---*****","SUG*UCMT--*****","SFG*UCMT--*****","SNG*UCMT--*****","SHG*UCMT--*****","SUG*UCMS--*****","SFG*UCMS--*****","SNG*UCMS--*****","SHG*UCMS--*****","SUG*UCS---*****","SFG*UCS---*****","SNG*UCS---*****","SHG*UCS---*****","SUG*UCSW--*****","SFG*UCSW--*****","SNG*UCSW--*****","SHG*UCSW--*****","SUG*UCSG--*****","SFG*UCSG--*****","SNG*UCSG--*****","SHG*UCSG--*****","SUG*UCSGD-*****","SFG*UCSGD-*****","SNG*UCSGD-*****","SHG*UCSGD-*****","SUG*UCSGM-*****","SFG*UCSGM-*****","SNG*UCSGM-*****","SHG*UCSGM-*****","SUG*UCSGA-*****","SFG*UCSGA-*****","SNG*UCSGA-*****","SHG*UCSGA-*****","SUG*UCSM--*****","SFG*UCSM--*****","SNG*UCSM--*****","SHG*UCSM--*****","SUG*UCSR--*****","SFG*UCSR--*****","SNG*UCSR--*****","SHG*UCSR--*****","SUG*UCSA--*****","SFG*UCSA--*****","SNG*UCSA--*****","SHG*UCSA--*****","SUG*UU----*****","SFG*UU----*****","SNG*UU----*****","SHG*UU----*****","SUG*UUA---*****","SFG*UUA---*****","SNG*UUA---*****","SHG*UUA---*****","SUG*UUAC--*****","SFG*UUAC--*****","SNG*UUAC--*****","SHG*UUAC--*****","SUG*UUACC-*****","SFG*UUACC-*****","SNG*UUACC-*****","SHG*UUACC-*****","SUG*UUACCK*****","SFG*UUACCK*****","SNG*UUACCK*****","SHG*UUACCK*****","SUG*UUACCM*****","SFG*UUACCM*****","SNG*UUACCM*****","SHG*UUACCM*****","SUG*UUACS-*****","SFG*UUACS-*****","SNG*UUACS-*****","SHG*UUACS-*****","SUG*UUACSM*****","SFG*UUACSM*****","SNG*UUACSM*****","SHG*UUACSM*****","SUG*UUACSA*****","SFG*UUACSA*****","SNG*UUACSA*****","SHG*UUACSA*****","SUG*UUACR-*****","SFG*UUACR-*****","SNG*UUACR-*****","SHG*UUACR-*****","SUG*UUACRW*****","SFG*UUACRW*****","SNG*UUACRW*****","SHG*UUACRW*****","SUG*UUACRS*****","SFG*UUACRS*****","SNG*UUACRS*****","SHG*UUACRS*****","SUG*UUAN--*****","SFG*UUAN--*****","SNG*UUAN--*****","SHG*UUAN--*****","SUG*UUAB--*****","SFG*UUAB--*****","SNG*UUAB--*****","SHG*UUAB--*****","SUG*UUABR-*****","SFG*UUABR-*****","SNG*UUABR-*****","SHG*UUABR-*****","SUG*UUAD--*****","SFG*UUAD--*****","SNG*UUAD--*****","SHG*UUAD--*****","SUG*UUM---*****","SFG*UUM---*****","SNG*UUM---*****","SHG*UUM---*****","SUG*UUMA--*****","SFG*UUMA--*****","SNG*UUMA--*****","SHG*UUMA--*****","SUG*UUMS--*****","SFG*UUMS--*****","SNG*UUMS--*****","SHG*UUMS--*****","SUG*UUMSE-*****","SFG*UUMSE-*****","SNG*UUMSE-*****","SHG*UUMSE-*****","SUG*UUMSEA*****","SFG*UUMSEA*****","SNG*UUMSEA*****","SHG*UUMSEA*****","SUG*UUMSED*****","SFG*UUMSED*****","SNG*UUMSED*****","SHG*UUMSED*****","SUG*UUMSEI*****","SFG*UUMSEI*****","SNG*UUMSEI*****","SHG*UUMSEI*****","SUG*UUMSEJ*****","SFG*UUMSEJ*****","SNG*UUMSEJ*****","SHG*UUMSEJ*****","SUG*UUMSET*****","SFG*UUMSET*****","SNG*UUMSET*****","SHG*UUMSET*****","SUG*UUMSEC*****","SFG*UUMSEC*****","SNG*UUMSEC*****","SHG*UUMSEC*****","SUG*UUMC--*****","SFG*UUMC--*****","SNG*UUMC--*****","SHG*UUMC--*****","SUG*UUMR--*****","SFG*UUMR--*****","SNG*UUMR--*****","SHG*UUMR--*****","SUG*UUMRG-*****","SFG*UUMRG-*****","SNG*UUMRG-*****","SHG*UUMRG-*****","SUG*UUMRS-*****","SFG*UUMRS-*****","SNG*UUMRS-*****","SHG*UUMRS-*****","SUG*UUMRSS*****","SFG*UUMRSS*****","SNG*UUMRSS*****","SHG*UUMRSS*****","SUG*UUMRX-*****","SFG*UUMRX-*****","SNG*UUMRX-*****","SHG*UUMRX-*****","SUG*UUMMO-*****","SFG*UUMMO-*****","SNG*UUMMO-*****","SHG*UUMMO-*****","SUG*UUMO--*****","SFG*UUMO--*****","SNG*UUMO--*****","SHG*UUMO--*****","SUG*UUMT--*****","SFG*UUMT--*****","SNG*UUMT--*****","SHG*UUMT--*****","SUG*UUMQ--*****","SFG*UUMQ--*****","SNG*UUMQ--*****","SHG*UUMQ--*****","SUG*UUMJ--*****","SFG*UUMJ--*****","SNG*UUMJ--*****","SHG*UUMJ--*****","SUG*UUL---*****","SFG*UUL---*****","SNG*UUL---*****","SHG*UUL---*****","SUG*UULS--*****","SFG*UULS--*****","SNG*UULS--*****","SHG*UULS--*****","SUG*UULM--*****","SFG*UULM--*****","SNG*UULM--*****","SHG*UULM--*****","SUG*UULC--*****","SFG*UULC--*****","SNG*UULC--*****","SHG*UULC--*****","SUG*UULF--*****","SFG*UULF--*****","SNG*UULF--*****","SHG*UULF--*****","SUG*UULD--*****","SFG*UULD--*****","SNG*UULD--*****","SHG*UULD--*****","SUG*UUS---*****","SFG*UUS---*****","SNG*UUS---*****","SHG*UUS---*****","SUG*UUSA--*****","SFG*UUSA--*****","SNG*UUSA--*****","SHG*UUSA--*****","SUG*UUSC--*****","SFG*UUSC--*****","SNG*UUSC--*****","SHG*UUSC--*****","SUG*UUSCL-*****","SFG*UUSCL-*****","SNG*UUSCL-*****","SHG*UUSCL-*****","SUG*UUSO--*****","SFG*UUSO--*****","SNG*UUSO--*****","SHG*UUSO--*****","SUG*UUSF--*****","SFG*UUSF--*****","SNG*UUSF--*****","SHG*UUSF--*****","SUG*UUSM--*****","SFG*UUSM--*****","SNG*UUSM--*****","SHG*UUSM--*****","SUG*UUSMS-*****","SFG*UUSMS-*****","SNG*UUSMS-*****","SHG*UUSMS-*****","SUG*UUSML-*****","SFG*UUSML-*****","SNG*UUSML-*****","SHG*UUSML-*****","SUG*UUSMN-*****","SFG*UUSMN-*****","SNG*UUSMN-*****","SHG*UUSMN-*****","SUG*UUSR--*****","SFG*UUSR--*****","SNG*UUSR--*****","SHG*UUSR--*****","SUG*UUSRS-*****","SFG*UUSRS-*****","SNG*UUSRS-*****","SHG*UUSRS-*****","SUG*UUSRT-*****","SFG*UUSRT-*****","SNG*UUSRT-*****","SHG*UUSRT-*****","SUG*UUSRW-*****","SFG*UUSRW-*****","SNG*UUSRW-*****","SHG*UUSRW-*****","SUG*UUSS--*****","SFG*UUSS--*****","SNG*UUSS--*****","SHG*UUSS--*****","SUG*UUSW--*****","SFG*UUSW--*****","SNG*UUSW--*****","SHG*UUSW--*****","SUG*UUSX--*****","SFG*UUSX--*****","SNG*UUSX--*****","SHG*UUSX--*****","SUG*UUI---*****","SFG*UUI---*****","SNG*UUI---*****","SHG*UUI---*****","SUG*UUP---*****","SFG*UUP---*****","SNG*UUP---*****","SHG*UUP---*****","SUG*UUE---*****","SFG*UUE---*****","SNG*UUE---*****","SHG*UUE---*****","SUG*US----*****","SFG*US----*****","SNG*US----*****","SHG*US----*****","SUG*USA---*****","SFG*USA---*****","SNG*USA---*****","SHG*USA---*****","SUG*USAT--*****","SFG*USAT--*****","SNG*USAT--*****","SHG*USAT--*****","SUG*USAC--*****","SFG*USAC--*****","SNG*USAC--*****","SHG*USAC--*****","SUG*USAJ--*****","SFG*USAJ--*****","SNG*USAJ--*****","SHG*USAJ--*****","SUG*USAJT-*****","SFG*USAJT-*****","SNG*USAJT-*****","SHG*USAJT-*****","SUG*USAJC-*****","SFG*USAJC-*****","SNG*USAJC-*****","SHG*USAJC-*****","SUG*USAO--*****","SFG*USAO--*****","SNG*USAO--*****","SHG*USAO--*****","SUG*USAOT-*****","SFG*USAOT-*****","SNG*USAOT-*****","SHG*USAOT-*****","SUG*USAOC-*****","SFG*USAOC-*****","SNG*USAOC-*****","SHG*USAOC-*****","SUG*USAF--*****","SFG*USAF--*****","SNG*USAF--*****","SHG*USAF--*****","SUG*USAFT-*****","SFG*USAFT-*****","SNG*USAFT-*****","SHG*USAFT-*****","SUG*USAFC-*****","SFG*USAFC-*****","SNG*USAFC-*****","SHG*USAFC-*****","SUG*USAS--*****","SFG*USAS--*****","SNG*USAS--*****","SHG*USAS--*****","SUG*USAST-*****","SFG*USAST-*****","SNG*USAST-*****","SHG*USAST-*****","SUG*USASC-*****","SFG*USASC-*****","SNG*USASC-*****","SHG*USASC-*****","SUG*USAM--*****","SFG*USAM--*****","SNG*USAM--*****","SHG*USAM--*****","SUG*USAMT-*****","SFG*USAMT-*****","SNG*USAMT-*****","SHG*USAMT-*****","SUG*USAMC-*****","SFG*USAMC-*****","SNG*USAMC-*****","SHG*USAMC-*****","SUG*USAR--*****","SFG*USAR--*****","SNG*USAR--*****","SHG*USAR--*****","SUG*USART-*****","SFG*USART-*****","SNG*USART-*****","SHG*USART-*****","SUG*USARC-*****","SFG*USARC-*****","SNG*USARC-*****","SHG*USARC-*****","SUG*USAP--*****","SFG*USAP--*****","SNG*USAP--*****","SHG*USAP--*****","SUG*USAPT-*****","SFG*USAPT-*****","SNG*USAPT-*****","SHG*USAPT-*****","SUG*USAPC-*****","SFG*USAPC-*****","SNG*USAPC-*****","SHG*USAPC-*****","SUG*USAPB-*****","SFG*USAPB-*****","SNG*USAPB-*****","SHG*USAPB-*****","SUG*USAPBT*****","SFG*USAPBT*****","SNG*USAPBT*****","SHG*USAPBT*****","SUG*USAPBC*****","SFG*USAPBC*****","SNG*USAPBC*****","SHG*USAPBC*****","SUG*USAPM-*****","SFG*USAPM-*****","SNG*USAPM-*****","SHG*USAPM-*****","SUG*USAPMT*****","SFG*USAPMT*****","SNG*USAPMT*****","SHG*USAPMT*****","SUG*USAPMC*****","SFG*USAPMC*****","SNG*USAPMC*****","SHG*USAPMC*****","SUG*USAX--*****","SFG*USAX--*****","SNG*USAX--*****","SHG*USAX--*****","SUG*USAXT-*****","SFG*USAXT-*****","SNG*USAXT-*****","SHG*USAXT-*****","SUG*USAXC-*****","SFG*USAXC-*****","SNG*USAXC-*****","SHG*USAXC-*****","SUG*USAL--*****","SFG*USAL--*****","SNG*USAL--*****","SHG*USAL--*****","SUG*USALT-*****","SFG*USALT-*****","SNG*USALT-*****","SHG*USALT-*****","SUG*USALC-*****","SFG*USALC-*****","SNG*USALC-*****","SHG*USALC-*****","SUG*USAW--*****","SFG*USAW--*****","SNG*USAW--*****","SHG*USAW--*****","SUG*USAWT-*****","SFG*USAWT-*****","SNG*USAWT-*****","SHG*USAWT-*****","SUG*USAWC-*****","SFG*USAWC-*****","SNG*USAWC-*****","SHG*USAWC-*****","SUG*USAQ--*****","SFG*USAQ--*****","SNG*USAQ--*****","SHG*USAQ--*****","SUG*USAQT-*****","SFG*USAQT-*****","SNG*USAQT-*****","SHG*USAQT-*****","SUG*USAQC-*****","SFG*USAQC-*****","SNG*USAQC-*****","SHG*USAQC-*****","SUG*USM---*****","SFG*USM---*****","SNG*USM---*****","SHG*USM---*****","SUG*USMT--*****","SFG*USMT--*****","SNG*USMT--*****","SHG*USMT--*****","SUG*USMC--*****","SFG*USMC--*****","SNG*USMC--*****","SHG*USMC--*****","SUG*USMM--*****","SFG*USMM--*****","SNG*USMM--*****","SHG*USMM--*****","SUG*USMMT-*****","SFG*USMMT-*****","SNG*USMMT-*****","SHG*USMMT-*****","SUG*USMMC-*****","SFG*USMMC-*****","SNG*USMMC-*****","SHG*USMMC-*****","SUG*USMV--*****","SFG*USMV--*****","SNG*USMV--*****","SHG*USMV--*****","SUG*USMVT-*****","SFG*USMVT-*****","SNG*USMVT-*****","SHG*USMVT-*****","SUG*USMVC-*****","SFG*USMVC-*****","SNG*USMVC-*****","SHG*USMVC-*****","SUG*USMD--*****","SFG*USMD--*****","SNG*USMD--*****","SHG*USMD--*****","SUG*USMDT-*****","SFG*USMDT-*****","SNG*USMDT-*****","SHG*USMDT-*****","SUG*USMDC-*****","SFG*USMDC-*****","SNG*USMDC-*****","SHG*USMDC-*****","SUG*USMP--*****","SFG*USMP--*****","SNG*USMP--*****","SHG*USMP--*****","SUG*USMPT-*****","SFG*USMPT-*****","SNG*USMPT-*****","SHG*USMPT-*****","SUG*USMPC-*****","SFG*USMPC-*****","SNG*USMPC-*****","SHG*USMPC-*****","SUG*USS---*****","SFG*USS---*****","SNG*USS---*****","SHG*USS---*****","SUG*USST--*****","SFG*USST--*****","SNG*USST--*****","SHG*USST--*****","SUG*USSC--*****","SFG*USSC--*****","SNG*USSC--*****","SHG*USSC--*****","SUG*USS1--*****","SFG*USS1--*****","SNG*USS1--*****","SHG*USS1--*****","SUG*USS1T-*****","SFG*USS1T-*****","SNG*USS1T-*****","SHG*USS1T-*****","SUG*USS1C-*****","SFG*USS1C-*****","SNG*USS1C-*****","SHG*USS1C-*****","SUG*USS2--*****","SFG*USS2--*****","SNG*USS2--*****","SHG*USS2--*****","SUG*USS2T-*****","SFG*USS2T-*****","SNG*USS2T-*****","SHG*USS2T-*****","SUG*USS2C-*****","SFG*USS2C-*****","SNG*USS2C-*****","SHG*USS2C-*****","SUG*USS3--*****","SFG*USS3--*****","SNG*USS3--*****","SHG*USS3--*****","SUG*USS3T-*****","SFG*USS3T-*****","SNG*USS3T-*****","SHG*USS3T-*****","SUG*USS3C-*****","SFG*USS3C-*****","SNG*USS3C-*****","SHG*USS3C-*****","SUG*USS3A-*****","SFG*USS3A-*****","SNG*USS3A-*****","SHG*USS3A-*****","SUG*USS3AT*****","SFG*USS3AT*****","SNG*USS3AT*****","SHG*USS3AT*****","SUG*USS3AC*****","SFG*USS3AC*****","SNG*USS3AC*****","SHG*USS3AC*****","SUG*USS4--*****","SFG*USS4--*****","SNG*USS4--*****","SHG*USS4--*****","SUG*USS4T-*****","SFG*USS4T-*****","SNG*USS4T-*****","SHG*USS4T-*****","SUG*USS4C-*****","SFG*USS4C-*****","SNG*USS4C-*****","SHG*USS4C-*****","SUG*USS5--*****","SFG*USS5--*****","SNG*USS5--*****","SHG*USS5--*****","SUG*USS5T-*****","SFG*USS5T-*****","SNG*USS5T-*****","SHG*USS5T-*****","SUG*USS5C-*****","SFG*USS5C-*****","SNG*USS5C-*****","SHG*USS5C-*****","SUG*USS6--*****","SFG*USS6--*****","SNG*USS6--*****","SHG*USS6--*****","SUG*USS6T-*****","SFG*USS6T-*****","SNG*USS6T-*****","SHG*USS6T-*****","SUG*USS6C-*****","SFG*USS6C-*****","SNG*USS6C-*****","SHG*USS6C-*****","SUG*USS7--*****","SFG*USS7--*****","SNG*USS7--*****","SHG*USS7--*****","SUG*USS7T-*****","SFG*USS7T-*****","SNG*USS7T-*****","SHG*USS7T-*****","SUG*USS7C-*****","SFG*USS7C-*****","SNG*USS7C-*****","SHG*USS7C-*****","SUG*USS8--*****","SFG*USS8--*****","SNG*USS8--*****","SHG*USS8--*****","SUG*USS8T-*****","SFG*USS8T-*****","SNG*USS8T-*****","SHG*USS8T-*****","SUG*USS8C-*****","SFG*USS8C-*****","SNG*USS8C-*****","SHG*USS8C-*****","SUG*USS9--*****","SFG*USS9--*****","SNG*USS9--*****","SHG*USS9--*****","SUG*USS9T-*****","SFG*USS9T-*****","SNG*USS9T-*****","SHG*USS9T-*****","SUG*USS9C-*****","SFG*USS9C-*****","SNG*USS9C-*****","SHG*USS9C-*****","SUG*USSX--*****","SFG*USSX--*****","SNG*USSX--*****","SHG*USSX--*****","SUG*USSXT-*****","SFG*USSXT-*****","SNG*USSXT-*****","SHG*USSXT-*****","SUG*USSXC-*****","SFG*USSXC-*****","SNG*USSXC-*****","SHG*USSXC-*****","SUG*USSL--*****","SFG*USSL--*****","SNG*USSL--*****","SHG*USSL--*****","SUG*USSLT-*****","SFG*USSLT-*****","SNG*USSLT-*****","SHG*USSLT-*****","SUG*USSLC-*****","SFG*USSLC-*****","SNG*USSLC-*****","SHG*USSLC-*****","SUG*USSW--*****","SFG*USSW--*****","SNG*USSW--*****","SHG*USSW--*****","SUG*USSWT-*****","SFG*USSWT-*****","SNG*USSWT-*****","SHG*USSWT-*****","SUG*USSWC-*****","SFG*USSWC-*****","SNG*USSWC-*****","SHG*USSWC-*****","SUG*USSWP-*****","SFG*USSWP-*****","SNG*USSWP-*****","SHG*USSWP-*****","SUG*USSWPT*****","SFG*USSWPT*****","SNG*USSWPT*****","SHG*USSWPT*****","SUG*USSWPC*****","SFG*USSWPC*****","SNG*USSWPC*****","SHG*USSWPC*****","SUG*UST---*****","SFG*UST---*****","SNG*UST---*****","SHG*UST---*****","SUG*USTT--*****","SFG*USTT--*****","SNG*USTT--*****","SHG*USTT--*****","SUG*USTC--*****","SFG*USTC--*****","SNG*USTC--*****","SHG*USTC--*****","SUG*USTM--*****","SFG*USTM--*****","SNG*USTM--*****","SHG*USTM--*****","SUG*USTMT-*****","SFG*USTMT-*****","SNG*USTMT-*****","SHG*USTMT-*****","SUG*USTMC-*****","SFG*USTMC-*****","SNG*USTMC-*****","SHG*USTMC-*****","SUG*USTR--*****","SFG*USTR--*****","SNG*USTR--*****","SHG*USTR--*****","SUG*USTRT-*****","SFG*USTRT-*****","SNG*USTRT-*****","SHG*USTRT-*****","SUG*USTRC-*****","SFG*USTRC-*****","SNG*USTRC-*****","SHG*USTRC-*****","SUG*USTS--*****","SFG*USTS--*****","SNG*USTS--*****","SHG*USTS--*****","SUG*USTST-*****","SFG*USTST-*****","SNG*USTST-*****","SHG*USTST-*****","SUG*USTSC-*****","SFG*USTSC-*****","SNG*USTSC-*****","SHG*USTSC-*****","SUG*USTA--*****","SFG*USTA--*****","SNG*USTA--*****","SHG*USTA--*****","SUG*USTAT-*****","SFG*USTAT-*****","SNG*USTAT-*****","SHG*USTAT-*****","SUG*USTAC-*****","SFG*USTAC-*****","SNG*USTAC-*****","SHG*USTAC-*****","SUG*USTI--*****","SFG*USTI--*****","SNG*USTI--*****","SHG*USTI--*****","SUG*USTIT-*****","SFG*USTIT-*****","SNG*USTIT-*****","SHG*USTIT-*****","SUG*USTIC-*****","SFG*USTIC-*****","SNG*USTIC-*****","SHG*USTIC-*****","SUG*USX---*****","SFG*USX---*****","SNG*USX---*****","SHG*USX---*****","SUG*USXT--*****","SFG*USXT--*****","SNG*USXT--*****","SHG*USXT--*****","SUG*USXC--*****","SFG*USXC--*****","SNG*USXC--*****","SHG*USXC--*****","SUG*USXH--*****","SFG*USXH--*****","SNG*USXH--*****","SHG*USXH--*****","SUG*USXHT-*****","SFG*USXHT-*****","SNG*USXHT-*****","SHG*USXHT-*****","SUG*USXHC-*****","SFG*USXHC-*****","SNG*USXHC-*****","SHG*USXHC-*****","SUG*USXR--*****","SFG*USXR--*****","SNG*USXR--*****","SHG*USXR--*****","SUG*USXRT-*****","SFG*USXRT-*****","SNG*USXRT-*****","SHG*USXRT-*****","SUG*USXRC-*****","SFG*USXRC-*****","SNG*USXRC-*****","SHG*USXRC-*****","SUG*USXO--*****","SFG*USXO--*****","SNG*USXO--*****","SHG*USXO--*****","SUG*USXOT-*****","SFG*USXOT-*****","SNG*USXOT-*****","SHG*USXOT-*****","SUG*USXOC-*****","SFG*USXOC-*****","SNG*USXOC-*****","SHG*USXOC-*****","SUG*USXOM-*****","SFG*USXOM-*****","SNG*USXOM-*****","SHG*USXOM-*****","SUG*USXOMT*****","SFG*USXOMT*****","SNG*USXOMT*****","SHG*USXOMT*****","SUG*USXOMC*****","SFG*USXOMC*****","SNG*USXOMC*****","SHG*USXOMC*****","SUG*USXE--*****","SFG*USXE--*****","SNG*USXE--*****","SHG*USXE--*****","SUG*USXET-*****","SFG*USXET-*****","SNG*USXET-*****","SHG*USXET-*****","SUG*USXEC-*****","SFG*USXEC-*****","SNG*USXEC-*****","SHG*USXEC-*****","SUG*UH----*****","SFG*UH----*****","SNG*UH----*****","SHG*UH----*****","SUG*E-----*****","SFG*E-----*****","SNG*E-----*****","SHG*E-----*****","SUG*EW----*****","SFG*EW----*****","SNG*EW----*****","SHG*EW----*****","SUG*EWM---*****","SFG*EWM---*****","SNG*EWM---*****","SHG*EWM---*****","SUG*EWMA--*****","SFG*EWMA--*****","SNG*EWMA--*****","SHG*EWMA--*****","SUG*EWMAS-*****","SFG*EWMAS-*****","SNG*EWMAS-*****","SHG*EWMAS-*****","SUG*EWMASR*****","SFG*EWMASR*****","SNG*EWMASR*****","SHG*EWMASR*****","SUG*EWMASE*****","SFG*EWMASE*****","SNG*EWMASE*****","SHG*EWMASE*****","SUG*EWMAI-*****","SFG*EWMAI-*****","SNG*EWMAI-*****","SHG*EWMAI-*****","SUG*EWMAIR*****","SFG*EWMAIR*****","SNG*EWMAIR*****","SHG*EWMAIR*****","SUG*EWMAIE*****","SFG*EWMAIE*****","SNG*EWMAIE*****","SHG*EWMAIE*****","SUG*EWMAL-*****","SFG*EWMAL-*****","SNG*EWMAL-*****","SHG*EWMAL-*****","SUG*EWMALR*****","SFG*EWMALR*****","SNG*EWMALR*****","SHG*EWMALR*****","SUG*EWMALE*****","SFG*EWMALE*****","SNG*EWMALE*****","SHG*EWMALE*****","SUG*EWMAT-*****","SFG*EWMAT-*****","SNG*EWMAT-*****","SHG*EWMAT-*****","SUG*EWMATR*****","SFG*EWMATR*****","SNG*EWMATR*****","SHG*EWMATR*****","SUG*EWMATE*****","SFG*EWMATE*****","SNG*EWMATE*****","SHG*EWMATE*****","SUG*EWMS--*****","SFG*EWMS--*****","SNG*EWMS--*****","SHG*EWMS--*****","SUG*EWMSS-*****","SFG*EWMSS-*****","SNG*EWMSS-*****","SHG*EWMSS-*****","SUG*EWMSI-*****","SFG*EWMSI-*****","SNG*EWMSI-*****","SHG*EWMSI-*****","SUG*EWMSL-*****","SFG*EWMSL-*****","SNG*EWMSL-*****","SHG*EWMSL-*****","SUG*EWMT--*****","SFG*EWMT--*****","SNG*EWMT--*****","SHG*EWMT--*****","SUG*EWMTL-*****","SFG*EWMTL-*****","SNG*EWMTL-*****","SHG*EWMTL-*****","SUG*EWMTM-*****","SFG*EWMTM-*****","SNG*EWMTM-*****","SHG*EWMTM-*****","SUG*EWMTH-*****","SFG*EWMTH-*****","SNG*EWMTH-*****","SHG*EWMTH-*****","SUG*EWS---*****","SFG*EWS---*****","SNG*EWS---*****","SHG*EWS---*****","SUG*EWSL--*****","SFG*EWSL--*****","SNG*EWSL--*****","SHG*EWSL--*****","SUG*EWSM--*****","SFG*EWSM--*****","SNG*EWSM--*****","SHG*EWSM--*****","SUG*EWSH--*****","SFG*EWSH--*****","SNG*EWSH--*****","SHG*EWSH--*****","SUG*EWX---*****","SFG*EWX---*****","SNG*EWX---*****","SHG*EWX---*****","SUG*EWXL--*****","SFG*EWXL--*****","SNG*EWXL--*****","SHG*EWXL--*****","SUG*EWXM--*****","SFG*EWXM--*****","SNG*EWXM--*****","SHG*EWXM--*****","SUG*EWXH--*****","SFG*EWXH--*****","SNG*EWXH--*****","SHG*EWXH--*****","SUG*EWT---*****","SFG*EWT---*****","SNG*EWT---*****","SHG*EWT---*****","SUG*EWTL--*****","SFG*EWTL--*****","SNG*EWTL--*****","SHG*EWTL--*****","SUG*EWTM--*****","SFG*EWTM--*****","SNG*EWTM--*****","SHG*EWTM--*****","SUG*EWTH--*****","SFG*EWTH--*****","SNG*EWTH--*****","SHG*EWTH--*****","SUG*EWR---*****","SFG*EWR---*****","SNG*EWR---*****","SHG*EWR---*****","SUG*EWRR--*****","SFG*EWRR--*****","SNG*EWRR--*****","SHG*EWRR--*****","SUG*EWRL--*****","SFG*EWRL--*****","SNG*EWRL--*****","SHG*EWRL--*****","SUG*EWRH--*****","SFG*EWRH--*****","SNG*EWRH--*****","SHG*EWRH--*****","SUG*EWZ---*****","SFG*EWZ---*****","SNG*EWZ---*****","SHG*EWZ---*****","SUG*EWZL--*****","SFG*EWZL--*****","SNG*EWZL--*****","SHG*EWZL--*****","SUG*EWZM--*****","SFG*EWZM--*****","SNG*EWZM--*****","SHG*EWZM--*****","SUG*EWZH--*****","SFG*EWZH--*****","SNG*EWZH--*****","SHG*EWZH--*****","SUG*EWO---*****","SFG*EWO---*****","SNG*EWO---*****","SHG*EWO---*****","SUG*EWOL--*****","SFG*EWOL--*****","SNG*EWOL--*****","SHG*EWOL--*****","SUG*EWOM--*****","SFG*EWOM--*****","SNG*EWOM--*****","SHG*EWOM--*****","SUG*EWOH--*****","SFG*EWOH--*****","SNG*EWOH--*****","SHG*EWOH--*****","SUG*EWH---*****","SFG*EWH---*****","SNG*EWH---*****","SHG*EWH---*****","SUG*EWHL--*****","SFG*EWHL--*****","SNG*EWHL--*****","SHG*EWHL--*****","SUG*EWHLS-*****","SFG*EWHLS-*****","SNG*EWHLS-*****","SHG*EWHLS-*****","SUG*EWHM--*****","SFG*EWHM--*****","SNG*EWHM--*****","SHG*EWHM--*****","SUG*EWHMS-*****","SFG*EWHMS-*****","SNG*EWHMS-*****","SHG*EWHMS-*****","SUG*EWHH--*****","SFG*EWHH--*****","SNG*EWHH--*****","SHG*EWHH--*****","SUG*EWHHS-*****","SFG*EWHHS-*****","SNG*EWHHS-*****","SHG*EWHHS-*****","SUG*EWG---*****","SFG*EWG---*****","SNG*EWG---*****","SHG*EWG---*****","SUG*EWGL--*****","SFG*EWGL--*****","SNG*EWGL--*****","SHG*EWGL--*****","SUG*EWGM--*****","SFG*EWGM--*****","SNG*EWGM--*****","SHG*EWGM--*****","SUG*EWGH--*****","SFG*EWGH--*****","SNG*EWGH--*****","SHG*EWGH--*****","SUG*EWGR--*****","SFG*EWGR--*****","SNG*EWGR--*****","SHG*EWGR--*****","SUG*EWD---*****","SFG*EWD---*****","SNG*EWD---*****","SHG*EWD---*****","SUG*EWDL--*****","SFG*EWDL--*****","SNG*EWDL--*****","SHG*EWDL--*****","SUG*EWDLS-*****","SFG*EWDLS-*****","SNG*EWDLS-*****","SHG*EWDLS-*****","SUG*EWDM--*****","SFG*EWDM--*****","SNG*EWDM--*****","SHG*EWDM--*****","SUG*EWDMS-*****","SFG*EWDMS-*****","SNG*EWDMS-*****","SHG*EWDMS-*****","SUG*EWDH--*****","SFG*EWDH--*****","SNG*EWDH--*****","SHG*EWDH--*****","SUG*EWDHS-*****","SFG*EWDHS-*****","SNG*EWDHS-*****","SHG*EWDHS-*****","SUG*EWA---*****","SFG*EWA---*****","SNG*EWA---*****","SHG*EWA---*****","SUG*EWAL--*****","SFG*EWAL--*****","SNG*EWAL--*****","SHG*EWAL--*****","SUG*EWAM--*****","SFG*EWAM--*****","SNG*EWAM--*****","SHG*EWAM--*****","SUG*EWAH--*****","SFG*EWAH--*****","SNG*EWAH--*****","SHG*EWAH--*****","SUG*EV----*****","SFG*EV----*****","SNG*EV----*****","SHG*EV----*****","SUG*EVA---*****","SFG*EVA---*****","SNG*EVA---*****","SHG*EVA---*****","SUG*EVAT--*****","SFG*EVAT--*****","SNG*EVAT--*****","SHG*EVAT--*****","SUG*EVATL-*****","SFG*EVATL-*****","SNG*EVATL-*****","SHG*EVATL-*****","SUG*EVATLR*****","SFG*EVATLR*****","SNG*EVATLR*****","SHG*EVATLR*****","SUG*EVATM-*****","SFG*EVATM-*****","SNG*EVATM-*****","SHG*EVATM-*****","SUG*EVATMR*****","SFG*EVATMR*****","SNG*EVATMR*****","SHG*EVATMR*****","SUG*EVATH-*****","SFG*EVATH-*****","SNG*EVATH-*****","SHG*EVATH-*****","SUG*EVATHR*****","SFG*EVATHR*****","SNG*EVATHR*****","SHG*EVATHR*****","SUG*EVAA--*****","SFG*EVAA--*****","SNG*EVAA--*****","SHG*EVAA--*****","SUG*EVAAR-*****","SFG*EVAAR-*****","SNG*EVAAR-*****","SHG*EVAAR-*****","SUG*EVAI--*****","SFG*EVAI--*****","SNG*EVAI--*****","SHG*EVAI--*****","SUG*EVAC--*****","SFG*EVAC--*****","SNG*EVAC--*****","SHG*EVAC--*****","SUG*EVAS--*****","SFG*EVAS--*****","SNG*EVAS--*****","SHG*EVAS--*****","SUG*EVAL--*****","SFG*EVAL--*****","SNG*EVAL--*****","SHG*EVAL--*****","SUG*EVU---*****","SFG*EVU---*****","SNG*EVU---*****","SHG*EVU---*****","SUG*EVUB--*****","SFG*EVUB--*****","SNG*EVUB--*****","SHG*EVUB--*****","SUG*EVUS--*****","SFG*EVUS--*****","SNG*EVUS--*****","SHG*EVUS--*****","SUG*EVUSL-*****","SFG*EVUSL-*****","SNG*EVUSL-*****","SHG*EVUSL-*****","SUG*EVUSM-*****","SFG*EVUSM-*****","SNG*EVUSM-*****","SHG*EVUSM-*****","SUG*EVUSH-*****","SFG*EVUSH-*****","SNG*EVUSH-*****","SHG*EVUSH-*****","SUG*EVUL--*****","SFG*EVUL--*****","SNG*EVUL--*****","SHG*EVUL--*****","SUG*EVUX--*****","SFG*EVUX--*****","SNG*EVUX--*****","SHG*EVUX--*****","SUG*EVUR--*****","SFG*EVUR--*****","SNG*EVUR--*****","SHG*EVUR--*****","SUG*EVUT--*****","SFG*EVUT--*****","SNG*EVUT--*****","SHG*EVUT--*****","SUG*EVUTL-*****","SFG*EVUTL-*****","SNG*EVUTL-*****","SHG*EVUTL-*****","SUG*EVUTH-*****","SFG*EVUTH-*****","SNG*EVUTH-*****","SHG*EVUTH-*****","SUG*EVUA--*****","SFG*EVUA--*****","SNG*EVUA--*****","SHG*EVUA--*****","SUG*EVUAA-*****","SFG*EVUAA-*****","SNG*EVUAA-*****","SHG*EVUAA-*****","SUG*EVE---*****","SFG*EVE---*****","SNG*EVE---*****","SHG*EVE---*****","SUG*EVEB--*****","SFG*EVEB--*****","SNG*EVEB--*****","SHG*EVEB--*****","SUG*EVEE--*****","SFG*EVEE--*****","SNG*EVEE--*****","SHG*EVEE--*****","SUG*EVEC--*****","SFG*EVEC--*****","SNG*EVEC--*****","SHG*EVEC--*****","SUG*EVEM--*****","SFG*EVEM--*****","SNG*EVEM--*****","SHG*EVEM--*****","SUG*EVEMV-*****","SFG*EVEMV-*****","SNG*EVEMV-*****","SHG*EVEMV-*****","SUG*EVEML-*****","SFG*EVEML-*****","SNG*EVEML-*****","SHG*EVEML-*****","SUG*EVEA--*****","SFG*EVEA--*****","SNG*EVEA--*****","SHG*EVEA--*****","SUG*EVEAA-*****","SFG*EVEAA-*****","SNG*EVEAA-*****","SHG*EVEAA-*****","SUG*EVEAT-*****","SFG*EVEAT-*****","SNG*EVEAT-*****","SHG*EVEAT-*****","SUG*EVED--*****","SFG*EVED--*****","SNG*EVED--*****","SHG*EVED--*****","SUG*EVEDA-*****","SFG*EVEDA-*****","SNG*EVEDA-*****","SHG*EVEDA-*****","SUG*EVES--*****","SFG*EVES--*****","SNG*EVES--*****","SHG*EVES--*****","SUG*EVER--*****","SFG*EVER--*****","SNG*EVER--*****","SHG*EVER--*****","SUG*EVEH--*****","SFG*EVEH--*****","SNG*EVEH--*****","SHG*EVEH--*****","SUG*EVEF--*****","SFG*EVEF--*****","SNG*EVEF--*****","SHG*EVEF--*****","SUG*EVT---*****","SFG*EVT---*****","SNG*EVT---*****","SHG*EVT---*****","SUG*EVC---*****","SFG*EVC---*****","SNG*EVC---*****","SHG*EVC---*****","SUG*EVCA--*****","SFG*EVCA--*****","SNG*EVCA--*****","SHG*EVCA--*****","SUG*EVCAL-*****","SFG*EVCAL-*****","SNG*EVCAL-*****","SHG*EVCAL-*****","SUG*EVCAM-*****","SFG*EVCAM-*****","SNG*EVCAM-*****","SHG*EVCAM-*****","SUG*EVCAH-*****","SFG*EVCAH-*****","SNG*EVCAH-*****","SHG*EVCAH-*****","SUG*EVCO--*****","SFG*EVCO--*****","SNG*EVCO--*****","SHG*EVCO--*****","SUG*EVCOL-*****","SFG*EVCOL-*****","SNG*EVCOL-*****","SHG*EVCOL-*****","SUG*EVCOM-*****","SFG*EVCOM-*****","SNG*EVCOM-*****","SHG*EVCOM-*****","SUG*EVCOH-*****","SFG*EVCOH-*****","SNG*EVCOH-*****","SHG*EVCOH-*****","SUG*EVCM--*****","SFG*EVCM--*****","SNG*EVCM--*****","SHG*EVCM--*****","SUG*EVCML-*****","SFG*EVCML-*****","SNG*EVCML-*****","SHG*EVCML-*****","SUG*EVCMM-*****","SFG*EVCMM-*****","SNG*EVCMM-*****","SHG*EVCMM-*****","SUG*EVCMH-*****","SFG*EVCMH-*****","SNG*EVCMH-*****","SHG*EVCMH-*****","SUG*EVCU--*****","SFG*EVCU--*****","SNG*EVCU--*****","SHG*EVCU--*****","SUG*EVCUL-*****","SFG*EVCUL-*****","SNG*EVCUL-*****","SHG*EVCUL-*****","SUG*EVCUM-*****","SFG*EVCUM-*****","SNG*EVCUM-*****","SHG*EVCUM-*****","SUG*EVCUH-*****","SFG*EVCUH-*****","SNG*EVCUH-*****","SHG*EVCUH-*****","SUG*EVCJ--*****","SFG*EVCJ--*****","SNG*EVCJ--*****","SHG*EVCJ--*****","SUG*EVCJL-*****","SFG*EVCJL-*****","SNG*EVCJL-*****","SHG*EVCJL-*****","SUG*EVCJM-*****","SFG*EVCJM-*****","SNG*EVCJM-*****","SHG*EVCJM-*****","SUG*EVCJH-*****","SFG*EVCJH-*****","SNG*EVCJH-*****","SHG*EVCJH-*****","SUG*EVCT--*****","SFG*EVCT--*****","SNG*EVCT--*****","SHG*EVCT--*****","SUG*EVCTL-*****","SFG*EVCTL-*****","SNG*EVCTL-*****","SHG*EVCTL-*****","SUG*EVCTM-*****","SFG*EVCTM-*****","SNG*EVCTM-*****","SHG*EVCTM-*****","SUG*EVCTH-*****","SFG*EVCTH-*****","SNG*EVCTH-*****","SHG*EVCTH-*****","SUG*EVCF--*****","SFG*EVCF--*****","SNG*EVCF--*****","SHG*EVCF--*****","SUG*EVCFL-*****","SFG*EVCFL-*****","SNG*EVCFL-*****","SHG*EVCFL-*****","SUG*EVCFM-*****","SFG*EVCFM-*****","SNG*EVCFM-*****","SHG*EVCFM-*****","SUG*EVCFH-*****","SFG*EVCFH-*****","SNG*EVCFH-*****","SHG*EVCFH-*****","SUG*EVM---*****","SFG*EVM---*****","SNG*EVM---*****","SHG*EVM---*****","SUG*EVS---*****","SFG*EVS---*****","SNG*EVS---*****","SHG*EVS---*****","SUG*EVST--*****","SFG*EVST--*****","SNG*EVST--*****","SHG*EVST--*****","SUG*EVSR--*****","SFG*EVSR--*****","SNG*EVSR--*****","SHG*EVSR--*****","SUG*EVSC--*****","SFG*EVSC--*****","SNG*EVSC--*****","SHG*EVSC--*****","SUG*EVSP--*****","SFG*EVSP--*****","SNG*EVSP--*****","SHG*EVSP--*****","SUG*EVSW--*****","SFG*EVSW--*****","SNG*EVSW--*****","SHG*EVSW--*****","SUG*ES----*****","SFG*ES----*****","SNG*ES----*****","SHG*ES----*****","SUG*ESR---*****","SFG*ESR---*****","SNG*ESR---*****","SHG*ESR---*****","SUG*ESE---*****","SFG*ESE---*****","SNG*ESE---*****","SHG*ESE---*****","SUG*EX----*****","SFG*EX----*****","SNG*EX----*****","SHG*EX----*****","SUG*EXI---*****","SFG*EXI---*****","SNG*EXI---*****","SHG*EXI---*****","SUG*EXL---*****","SFG*EXL---*****","SNG*EXL---*****","SHG*EXL---*****","SUG*EXN---*****","SFG*EXN---*****","SNG*EXN---*****","SHG*EXN---*****","SUG*EXF---*****","SFG*EXF---*****","SNG*EXF---*****","SHG*EXF---*****","SUG*EXM---*****","SFG*EXM---*****","SNG*EXM---*****","SHG*EXM---*****","SUG*EXMC--*****","SFG*EXMC--*****","SNG*EXMC--*****","SHG*EXMC--*****","SUG*EXML--*****","SFG*EXML--*****","SNG*EXML--*****","SHG*EXML--*****","SUG*I-----H****","SFG*I-----H****","SNG*I-----H****","SHG*I-----H****","SUG*IR----H****","SFG*IR----H****","SNG*IR----H****","SHG*IR----H****","SUG*IRM---H****","SFG*IRM---H****","SNG*IRM---H****","SHG*IRM---H****","SUG*IRP---H****","SFG*IRP---H****","SNG*IRP---H****","SHG*IRP---H****","SUG*IRN---H****","SFG*IRN---H****","SNG*IRN---H****","SHG*IRN---H****","SUG*IRNB--H****","SFG*IRNB--H****","SNG*IRNB--H****","SHG*IRNB--H****","SUG*IRNC--H****","SFG*IRNC--H****","SNG*IRNC--H****","SHG*IRNC--H****","SUG*IRNN--H****","SFG*IRNN--H****","SNG*IRNN--H****","SHG*IRNN--H****","SUG*IP----H****","SFG*IP----H****","SNG*IP----H****","SHG*IP----H****","SUG*IPD---H****","SFG*IPD---H****","SNG*IPD---H****","SHG*IPD---H****","SUG*IE----H****","SFG*IE----H****","SNG*IE----H****","SHG*IE----H****","SUG*IU----H****","SFG*IU----H****","SNG*IU----H****","SHG*IU----H****","SUG*IUR---H****","SFG*IUR---H****","SNG*IUR---H****","SHG*IUR---H****","SUG*IUT---H****","SFG*IUT---H****","SNG*IUT---H****","SHG*IUT---H****","SUG*IUE---H****","SFG*IUE---H****","SNG*IUE---H****","SHG*IUE---H****","SUG*IUEN--H****","SFG*IUEN--H****","SNG*IUEN--H****","SHG*IUEN--H****","SUG*IUED--H****","SFG*IUED--H****","SNG*IUED--H****","SHG*IUED--H****","SUG*IUEF--H****","SFG*IUEF--H****","SNG*IUEF--H****","SHG*IUEF--H****","SUG*IUP---H****","SFG*IUP---H****","SNG*IUP---H****","SHG*IUP---H****","SUG*IM----H****","SFG*IM----H****","SNG*IM----H****","SHG*IM----H****","SUG*IMF---H****","SFG*IMF---H****","SNG*IMF---H****","SHG*IMF---H****","SUG*IMFA--H****","SFG*IMFA--H****","SNG*IMFA--H****","SHG*IMFA--H****","SUG*IMFP--H****","SFG*IMFP--H****","SNG*IMFP--H****","SHG*IMFP--H****","SUG*IMFPW-H****","SFG*IMFPW-H****","SNG*IMFPW-H****","SHG*IMFPW-H****","SUG*IMFS--H****","SFG*IMFS--H****","SNG*IMFS--H****","SHG*IMFS--H****","SUG*IMA---H****","SFG*IMA---H****","SNG*IMA---H****","SHG*IMA---H****","SUG*IME---H****","SFG*IME---H****","SNG*IME---H****","SHG*IME---H****","SUG*IMG---H****","SFG*IMG---H****","SNG*IMG---H****","SHG*IMG---H****","SUG*IMV---H****","SFG*IMV---H****","SNG*IMV---H****","SHG*IMV---H****","SUG*IMN---H****","SFG*IMN---H****","SNG*IMN---H****","SHG*IMN---H****","SUG*IMNB--H****","SFG*IMNB--H****","SNG*IMNB--H****","SHG*IMNB--H****","SUG*IMC---H****","SFG*IMC---H****","SNG*IMC---H****","SHG*IMC---H****","SUG*IMS---H****","SFG*IMS---H****","SNG*IMS---H****","SHG*IMS---H****","SUG*IMM---H****","SFG*IMM---H****","SNG*IMM---H****","SHG*IMM---H****","SUG*IG----H****","SFG*IG----H****","SNG*IG----H****","SHG*IG----H****","SUG*IB----H****","SFG*IB----H****","SNG*IB----H****","SHG*IB----H****","SUG*IBA---H****","SFG*IBA---H****","SNG*IBA---H****","SHG*IBA---H****","SUG*IBN---H****","SFG*IBN---H****","SNG*IBN---H****","SHG*IBN---H****","SUG*IT----H****","SFG*IT----H****","SNG*IT----H****","SHG*IT----H****","SUG*IX----H****","SFG*IX----H****","SNG*IX----H****","SHG*IX----H****","SUG*IXH---H****","SFG*IXH---H****","SNG*IXH---H****","SHG*IXH---H****","SUS*------*****","SFS*------*****","SNS*------*****","SHS*------*****","SUS*C-----*****","SFS*C-----*****","SNS*C-----*****","SHS*C-----*****","SUS*CL----*****","SFS*CL----*****","SNS*CL----*****","SHS*CL----*****","SUS*CLCV--*****","SFS*CLCV--*****","SNS*CLCV--*****","SHS*CLCV--*****","SUS*CLBB--*****","SFS*CLBB--*****","SNS*CLBB--*****","SHS*CLBB--*****","SUS*CLCC--*****","SFS*CLCC--*****","SNS*CLCC--*****","SHS*CLCC--*****","SUS*CLDD--*****","SFS*CLDD--*****","SNS*CLDD--*****","SHS*CLDD--*****","SUS*CLFF--*****","SFS*CLFF--*****","SNS*CLFF--*****","SHS*CLFF--*****","SUS*CLLL--*****","SFS*CLLL--*****","SNS*CLLL--*****","SHS*CLLL--*****","SUS*CLLLAS*****","SFS*CLLLAS*****","SNS*CLLLAS*****","SHS*CLLLAS*****","SUS*CLLLMI*****","SFS*CLLLMI*****","SNS*CLLLMI*****","SHS*CLLLMI*****","SUS*CLLLSU*****","SFS*CLLLSU*****","SNS*CLLLSU*****","SHS*CLLLSU*****","SUS*CA----*****","SFS*CA----*****","SNS*CA----*****","SHS*CA----*****","SUS*CALA--*****","SFS*CALA--*****","SNS*CALA--*****","SHS*CALA--*****","SUS*CALS--*****","SFS*CALS--*****","SNS*CALS--*****","SHS*CALS--*****","SUS*CALSM-*****","SFS*CALSM-*****","SNS*CALSM-*****","SHS*CALSM-*****","SUS*CALST-*****","SFS*CALST-*****","SNS*CALST-*****","SHS*CALST-*****","SUS*CALC--*****","SFS*CALC--*****","SNS*CALC--*****","SHS*CALC--*****","SUS*CM----*****","SFS*CM----*****","SNS*CM----*****","SHS*CM----*****","SUS*CMML--*****","SFS*CMML--*****","SNS*CMML--*****","SHS*CMML--*****","SUS*CMMS--*****","SFS*CMMS--*****","SNS*CMMS--*****","SHS*CMMS--*****","SUS*CMMH--*****","SFS*CMMH--*****","SNS*CMMH--*****","SHS*CMMH--*****","SUS*CMMA--*****","SFS*CMMA--*****","SNS*CMMA--*****","SHS*CMMA--*****","SUS*CP----*****","SFS*CP----*****","SNS*CP----*****","SHS*CP----*****","SUS*CPSB--*****","SFS*CPSB--*****","SNS*CPSB--*****","SHS*CPSB--*****","SUS*CPSU--*****","SFS*CPSU--*****","SNS*CPSU--*****","SHS*CPSU--*****","SUS*CPSUM-*****","SFS*CPSUM-*****","SNS*CPSUM-*****","SHS*CPSUM-*****","SUS*CPSUT-*****","SFS*CPSUT-*****","SNS*CPSUT-*****","SHS*CPSUT-*****","SUS*CPSUG-*****","SFS*CPSUG-*****","SNS*CPSUG-*****","SHS*CPSUG-*****","SUS*CH----*****","SFS*CH----*****","SNS*CH----*****","SHS*CH----*****","SUS*G-----*****","SFS*G-----*****","SNS*G-----*****","SHS*G-----*****","SUS*GT----*****","SFS*GT----*****","SNS*GT----*****","SHS*GT----*****","SUS*GG----*****","SFS*GG----*****","SNS*GG----*****","SHS*GG----*****","SUS*GU----*****","SFS*GU----*****","SNS*GU----*****","SHS*GU----*****","SUS*GC----*****","SFS*GC----*****","SNS*GC----*****","SHS*GC----*****","SUS*CD----*****","SFS*CD----*****","SNS*CD----*****","SHS*CD----*****","SUS*CU----*****","SFS*CU----*****","SNS*CU----*****","SHS*CU----*****","SUS*CUM---*****","SFS*CUM---*****","SNS*CUM---*****","SHS*CUM---*****","SUS*CUS---*****","SFS*CUS---*****","SNS*CUS---*****","SHS*CUS---*****","SUS*CUN---*****","SFS*CUN---*****","SNS*CUN---*****","SHS*CUN---*****","SUS*CUR---*****","SFS*CUR---*****","SNS*CUR---*****","SHS*CUR---*****","SUS*N-----*****","SFS*N-----*****","SNS*N-----*****","SHS*N-----*****","SUS*NR----*****","SFS*NR----*****","SNS*NR----*****","SHS*NR----*****","SUS*NF----*****","SFS*NF----*****","SNS*NF----*****","SHS*NF----*****","SUS*NI----*****","SFS*NI----*****","SNS*NI----*****","SHS*NI----*****","SUS*NS----*****","SFS*NS----*****","SNS*NS----*****","SHS*NS----*****","SUS*NM----*****","SFS*NM----*****","SNS*NM----*****","SHS*NM----*****","SUS*NH----*****","SFS*NH----*****","SNS*NH----*****","SHS*NH----*****","SUS*X-----*****","SFS*X-----*****","SNS*X-----*****","SHS*X-----*****","SUS*XM----*****","SFS*XM----*****","SNS*XM----*****","SHS*XM----*****","SUS*XMC---*****","SFS*XMC---*****","SNS*XMC---*****","SHS*XMC---*****","SUS*XMR---*****","SFS*XMR---*****","SNS*XMR---*****","SHS*XMR---*****","SUS*XMO---*****","SFS*XMO---*****","SNS*XMO---*****","SHS*XMO---*****","SUS*XMTU--*****","SFS*XMTU--*****","SNS*XMTU--*****","SHS*XMTU--*****","SUS*XMF---*****","SFS*XMF---*****","SNS*XMF---*****","SHS*XMF---*****","SUS*XMP---*****","SFS*XMP---*****","SNS*XMP---*****","SHS*XMP---*****","SUS*XMH---*****","SFS*XMH---*****","SNS*XMH---*****","SHS*XMH---*****","SUS*XMTO--*****","SFS*XMTO--*****","SNS*XMTO--*****","SHS*XMTO--*****","SUS*XF----*****","SFS*XF----*****","SNS*XF----*****","SHS*XF----*****","SUS*XFDF--*****","SFS*XFDF--*****","SNS*XFDF--*****","SHS*XFDF--*****","SUS*XFDR--*****","SFS*XFDR--*****","SNS*XFDR--*****","SHS*XFDR--*****","SUS*XFTR--*****","SFS*XFTR--*****","SNS*XFTR--*****","SHS*XFTR--*****","SUS*XR----*****","SFS*XR----*****","SNS*XR----*****","SHS*XR----*****","SUS*XL----*****","SFS*XL----*****","SNS*XL----*****","SHS*XL----*****","SUS*XH----*****","SFS*XH----*****","SNS*XH----*****","SHS*XH----*****","SUS*XA----*****","SFS*XA----*****","SNS*XA----*****","SHS*XA----*****","SUS*XAR---*****","SFS*XAR---*****","SNS*XAR---*****","SHS*XAR---*****","SUS*XAS---*****","SFS*XAS---*****","SNS*XAS---*****","SHS*XAS---*****","SUS*XP----*****","SFS*XP----*****","SNS*XP----*****","SHS*XP----*****","SUS*O-----*****","SFS*O-----*****","SNS*O-----*****","SHS*O-----*****","SUU*------*****","SFU*------*****","SNU*------*****","SHU*------*****","SUU*S-----*****","SFU*S-----*****","SNU*S-----*****","SHU*S-----*****","SUU*SF----*****","SFU*SF----*****","SNU*SF----*****","SHU*SF----*****","SUU*SB----*****","SFU*SB----*****","SNU*SB----*****","SHU*SB----*****","SUU*SR----*****","SFU*SR----*****","SNU*SR----*****","SHU*SR----*****","SUU*SX----*****","SFU*SX----*****","SNU*SX----*****","SHU*SX----*****","SUU*SN----*****","SFU*SN----*****","SNU*SN----*****","SHU*SN----*****","SUU*SNF---*****","SFU*SNF---*****","SNU*SNF---*****","SHU*SNF---*****","SUU*SNA---*****","SFU*SNA---*****","SNU*SNA---*****","SHU*SNA---*****","SUU*SNM---*****","SFU*SNM---*****","SNU*SNM---*****","SHU*SNM---*****","SUU*SNG---*****","SFU*SNG---*****","SNU*SNG---*****","SHU*SNG---*****","SUU*SNB---*****","SFU*SNB---*****","SNU*SNB---*****","SHU*SNB---*****","SUU*SC----*****","SFU*SC----*****","SNU*SC----*****","SHU*SC----*****","SUU*SCF---*****","SFU*SCF---*****","SNU*SCF---*****","SHU*SCF---*****","SUU*SCA---*****","SFU*SCA---*****","SNU*SCA---*****","SHU*SCA---*****","SUU*SCM---*****","SFU*SCM---*****","SNU*SCM---*****","SHU*SCM---*****","SUU*SCG---*****","SFU*SCG---*****","SNU*SCG---*****","SHU*SCG---*****","SUU*SCB---*****","SFU*SCB---*****","SNU*SCB---*****","SHU*SCB---*****","SUU*SO----*****","SFU*SO----*****","SNU*SO----*****","SHU*SO----*****","SUU*SOF---*****","SFU*SOF---*****","SNU*SOF---*****","SHU*SOF---*****","SUU*SU----*****","SFU*SU----*****","SNU*SU----*****","SHU*SU----*****","SUU*SUM---*****","SFU*SUM---*****","SNU*SUM---*****","SHU*SUM---*****","SUU*SUS---*****","SFU*SUS---*****","SNU*SUS---*****","SHU*SUS---*****","SUU*SUN---*****","SFU*SUN---*****","SNU*SUN---*****","SHU*SUN---*****","SUU*S1----*****","SFU*S1----*****","SNU*S1----*****","SHU*S1----*****","SUU*S2----*****","SFU*S2----*****","SNU*S2----*****","SHU*S2----*****","SUU*S3----*****","SFU*S3----*****","SNU*S3----*****","SHU*S3----*****","SUU*S4----*****","SFU*S4----*****","SNU*S4----*****","SHU*S4----*****","SUU*SL----*****","SFU*SL----*****","SNU*SL----*****","SHU*SL----*****","SUU*SK----*****","SFU*SK----*****","SNU*SK----*****","SHU*SK----*****","SUU*W-----*****","SFU*W-----*****","SNU*W-----*****","SHU*W-----*****","SUU*WT----*****","SFU*WT----*****","SNU*WT----*****","SHU*WT----*****","SUU*WM----*****","SFU*WM----*****","SNU*WM----*****","SHU*WM----*****","SUU*WMD---*****","SFU*WMD---*****","SNU*WMD---*****","SHU*WMD---*****","SUU*WMG---*****","SFU*WMG---*****","SNU*WMG---*****","SHU*WMG---*****","SUU*WMGD--*****","SFU*WMGD--*****","SNU*WMGD--*****","SHU*WMGD--*****","SUU*WMGX--*****","SFU*WMGX--*****","SNU*WMGX--*****","SHU*WMGX--*****","SUU*WMGE--*****","SFU*WMGE--*****","SNU*WMGE--*****","SHU*WMGE--*****","SUU*WMGC--*****","SFU*WMGC--*****","SNU*WMGC--*****","SHU*WMGC--*****","SUU*WMGR--*****","SFU*WMGR--*****","SNU*WMGR--*****","SHU*WMGR--*****","SUU*WMGO--*****","SFU*WMGO--*****","SNU*WMGO--*****","SHU*WMGO--*****","SUU*WMM---*****","SFU*WMM---*****","SNU*WMM---*****","SHU*WMM---*****","SUU*WMMD--*****","SFU*WMMD--*****","SNU*WMMD--*****","SHU*WMMD--*****","SUU*WMMX--*****","SFU*WMMX--*****","SNU*WMMX--*****","SHU*WMMX--*****","SUU*WMME--*****","SFU*WMME--*****","SNU*WMME--*****","SHU*WMME--*****","SUU*WMMC--*****","SFU*WMMC--*****","SNU*WMMC--*****","SHU*WMMC--*****","SUU*WMMR--*****","SFU*WMMR--*****","SNU*WMMR--*****","SHU*WMMR--*****","SUU*WMMO--*****","SFU*WMMO--*****","SNU*WMMO--*****","SHU*WMMO--*****","SUU*WMF---*****","SFU*WMF---*****","SNU*WMF---*****","SHU*WMF---*****","SUU*WMFD--*****","SFU*WMFD--*****","SNU*WMFD--*****","SHU*WMFD--*****","SUU*WMFX--*****","SFU*WMFX--*****","SNU*WMFX--*****","SHU*WMFX--*****","SUU*WMFE--*****","SFU*WMFE--*****","SNU*WMFE--*****","SHU*WMFE--*****","SUU*WMFC--*****","SFU*WMFC--*****","SNU*WMFC--*****","SHU*WMFC--*****","SUU*WMFR--*****","SFU*WMFR--*****","SNU*WMFR--*****","SHU*WMFR--*****","SUU*WMFO--*****","SFU*WMFO--*****","SNU*WMFO--*****","SHU*WMFO--*****","SUU*WMO---*****","SFU*WMO---*****","SNU*WMO---*****","SHU*WMO---*****","SUU*WMOD--*****","SFU*WMOD--*****","SNU*WMOD--*****","SHU*WMOD--*****","SUU*WMX---*****","SFU*WMX---*****","SNU*WMX---*****","SHU*WMX---*****","SUU*WME---*****","SFU*WME---*****","SNU*WME---*****","SHU*WME---*****","SUU*WMA---*****","SFU*WMA---*****","SNU*WMA---*****","SHU*WMA---*****","SUU*WMC---*****","SFU*WMC---*****","SNU*WMC---*****","SHU*WMC---*****","SUU*WMR---*****","SFU*WMR---*****","SNU*WMR---*****","SHU*WMR---*****","SUU*WMB---*****","SFU*WMB---*****","SNU*WMB---*****","SHU*WMB---*****","SUU*WMBD--*****","SFU*WMBD--*****","SNU*WMBD--*****","SHU*WMBD--*****","SUU*WMN---*****","SFU*WMN---*****","SNU*WMN---*****","SHU*WMN---*****","SUU*WMS---*****","SFU*WMS---*****","SNU*WMS---*****","SHU*WMS---*****","SUU*WMSX--*****","SFU*WMSX--*****","SNU*WMSX--*****","SHU*WMSX--*****","SUU*WMSD--*****","SFU*WMSD--*****","SNU*WMSD--*****","SHU*WMSD--*****","SUU*WD----*****","SFU*WD----*****","SNU*WD----*****","SHU*WD----*****","SUU*WDM---*****","SFU*WDM---*****","SNU*WDM---*****","SHU*WDM---*****","SUU*WDMG--*****","SFU*WDMG--*****","SNU*WDMG--*****","SHU*WDMG--*****","SUU*WDMM--*****","SFU*WDMM--*****","SNU*WDMM--*****","SHU*WDMM--*****","SUU*N-----*****","SFU*N-----*****","SNU*N-----*****","SHU*N-----*****","SUU*ND----*****","SFU*ND----*****","SNU*ND----*****","SHU*ND----*****","SUU*E-----*****","SFU*E-----*****","SNU*E-----*****","SHU*E-----*****","SUU*V-----*****","SFU*V-----*****","SNU*V-----*****","SHU*V-----*****","SUU*X-----*****","SFU*X-----*****","SNU*X-----*****","SHU*X-----*****","SUF*------*****","SFF*------*****","SNF*------*****","SHF*------*****","SUF*A-----*****","SFF*A-----*****","SNF*A-----*****","SHF*A-----*****","SUF*AF----*****","SFF*AF----*****","SNF*AF----*****","SHF*AF----*****","SUF*AFA---*****","SFF*AFA---*****","SNF*AFA---*****","SHF*AFA---*****","SUF*AFK---*****","SFF*AFK---*****","SNF*AFK---*****","SHF*AFK---*****","SUF*AFU---*****","SFF*AFU---*****","SNF*AFU---*****","SHF*AFU---*****","SUF*AFUL--*****","SFF*AFUL--*****","SNF*AFUL--*****","SHF*AFUL--*****","SUF*AFUM--*****","SFF*AFUM--*****","SNF*AFUM--*****","SHF*AFUM--*****","SUF*AFUH--*****","SFF*AFUH--*****","SNF*AFUH--*****","SHF*AFUH--*****","SUF*AV----*****","SFF*AV----*****","SNF*AV----*****","SHF*AV----*****","SUF*AH----*****","SFF*AH----*****","SNF*AH----*****","SHF*AH----*****","SUF*AHH---*****","SFF*AHH---*****","SNF*AHH---*****","SHF*AHH---*****","SUF*AHA---*****","SFF*AHA---*****","SNF*AHA---*****","SHF*AHA---*****","SUF*AHU---*****","SFF*AHU---*****","SNF*AHU---*****","SHF*AHU---*****","SUF*AHUL--*****","SFF*AHUL--*****","SNF*AHUL--*****","SHF*AHUL--*****","SUF*AHUM--*****","SFF*AHUM--*****","SNF*AHUM--*****","SHF*AHUM--*****","SUF*AHUH--*****","SFF*AHUH--*****","SNF*AHUH--*****","SHF*AHUH--*****","SUF*N-----*****","SFF*N-----*****","SNF*N-----*****","SHF*N-----*****","SUF*NS----*****","SFF*NS----*****","SNF*NS----*****","SHF*NS----*****","SUF*NU----*****","SFF*NU----*****","SNF*NU----*****","SHF*NU----*****","SUF*NB----*****","SFF*NB----*****","SNF*NB----*****","SHF*NB----*****","SUF*NN----*****","SFF*NN----*****","SNF*NN----*****","SHF*NN----*****","SUF*G-----*****","SFF*G-----*****","SNF*G-----*****","SHF*G-----*****","SUF*GS----*****","SFF*GS----*****","SNF*GS----*****","SHF*GS----*****","SUF*GR----*****","SFF*GR----*****","SNF*GR----*****","SHF*GR----*****","SUF*GP----*****","SFF*GP----*****","SNF*GP----*****","SHF*GP----*****","SUF*GPA---*****","SFF*GPA---*****","SNF*GPA---*****","SHF*GPA---*****","SUF*GC----*****","SFF*GC----*****","SNF*GC----*****","SHF*GC----*****","SUF*B-----*****","SFF*B-----*****","SNF*B-----*****","SHF*B-----*****"]}},"properties":{"attrClassification":{"title":"Classification","type":"string","$ref":"#/definitions/attrClassification"},"attrNeedToKnow":{"title":"Need To Know","type":"array","uniqueItems":true,"items":{"$ref":"#/definitions/attrNeedToKnow"}},"attrRelTo":{"title":"Rel To","type":"array","uniqueItems":true,"items":{"$ref":"#/definitions/attributeRelTo"}},"symbolCode2525b":{"title":"Symbol Code","$ref":"#/definitions/milSymbols"},"facilityName":{"title":"Facility Name","type":"string"},"location":{"title":"Location","$ref":"#/definitions/countries"}}}', - '{"order":["attrClassification","attrRelTo","attrNeedToKnow","facilityName","location","symbolCode2525b"],"location":{"widget":"LocationAutocomplete"},"attrClassification":{"widget":"AttributeAutocomplete"},"attrNeedToKnow":{"widget":"AttributeAutocomplete","multiple":true},"attrRelTo":{"widget":"AttributeAutocomplete","multiple":true}}', - '{"geoField":"location","searchFields":["facilityName","attrClassification","attrNeedToKnow","attrRelTo"],"attrFields":["attrClassification","attrNeedToKnow","attrRelTo"],"tsField":"createdTimestamp","displayFields":{"header":"facilityName","details":["attrClassification","symbolCode2525b","lastInfoTimestamp","createdTimestamp","location.country"]},"mapFields":{"iconDefault":"sitrep","iconConfig":[{"field":"symbolCode2525b","valueMap":{"isMilSymbol":"true"}},{"field":"symbolCode2525c","valueMap":{"isMilSymbol":"true"}},{"field":"symbolCode2525d","valueMap":{"isMilSymbol":"true"}},{"field":"attrClassification","valueMap":{"topsecret-sci":"topsecret-sci","topsecret":"topsecret","secret":"secret","confidential":"confidential","controlled":"controlled","unclassified":"unclassified"}}],"colorDefault":"sitrep","colorConfig":[{"field":"attrClassification","valueMap":{"topsecret-sci":"topsecret-sci","topsecret":"topsecret","secret":"secret","confidential":"confidential","controlled":"controlled","unclassified":"unclassified"}}]}}' + 'vehicles', + '{ + "type":"object", + "required":["attrClassification","vehicleName"], + "default":{}, + "definitions": { + "attrClassification": { + "oneOf": [ + {"type":"string","title":"TOPSECRET","enum":["https://demo.com/attr/classification/value/topsecret"]},{"type":"string","title":"SECRET","enum":["https://demo.com/attr/classification/value/secret"]},{"type":"string","title":"CONFIDENTIAL","enum":["https://demo.com/attr/classification/value/confidential"]},{"type":"string","title":"UNCLASSIFIED","enum":["https://demo.com/attr/classification/value/unclassified"]} + ] + }, + "attrNeedToKnow": { + "anyOf": [ + {"type":"string","title":"AAA","enum":["https://demo.com/attr/needtoknow/value/aaa"]},{"type":"string","title":"BBB","enum":["https://demo.com/attr/needtoknow/value/bbb"]},{"type":"string","title":"INT","enum":["https://demo.com/attr/needtoknow/value/int"]},{"type":"string","title":"OPS","enum":["https://demo.com/attr/needtoknow/value/ops"]} + ] + }, + "attributeRelTo": { + "anyOf": [ + {"type":"string","title":"AUSTRALIA","enum":["https://demo.com/attr/relto/value/aus"]},{"type":"string","title":"FRANCE","enum":["https://demo.com/attr/relto/value/fra"]},{"type":"string","title":"FVEY","enum":["https://demo.com/attr/relto/value/fvey"]},{"type":"string","title":"UNITED KINGDOM","enum":["https://demo.com/attr/relto/value/gbr"]},{"type":"string","title":"NATO","enum":["https://demo.com/attr/relto/value/nato"]},{"type":"string","title":"PINK","enum":["https://demo.com/attr/relto/value/pink"]},{"type":"string","title":"UNITED STATES","enum":["https://demo.com/attr/relto/value/usa"]},{"type":"string","title":"ARUBA","enum":["https://demo.com/attr/relto/value/abw"]},{"type":"string","title":"AFGHANISTAN","enum":["https://demo.com/attr/relto/value/afg"]},{"type":"string","title":"ANGOLA","enum":["https://demo.com/attr/relto/value/ago"]},{"type":"string","title":"ANGUILLA","enum":["https://demo.com/attr/relto/value/aia"]},{"type":"string","title":"ALAND ISLANDS","enum":["https://demo.com/attr/relto/value/ala"]},{"type":"string","title":"ALBANIA","enum":["https://demo.com/attr/relto/value/alb"]},{"type":"string","title":"ANDORRA","enum":["https://demo.com/attr/relto/value/and"]},{"type":"string","title":"UNITED ARAB EMIRATES","enum":["https://demo.com/attr/relto/value/are"]},{"type":"string","title":"ARGENTINA","enum":["https://demo.com/attr/relto/value/arg"]},{"type":"string","title":"ARMENIA","enum":["https://demo.com/attr/relto/value/arm"]},{"type":"string","title":"AMERICAN SAMOA","enum":["https://demo.com/attr/relto/value/asm"]},{"type":"string","title":"ANTARCTICA","enum":["https://demo.com/attr/relto/value/ata"]},{"type":"string","title":"FRENCH SOUTHERN AND ANTARCTIC LANDS","enum":["https://demo.com/attr/relto/value/atf"]},{"type":"string","title":"ANTIGUA AND BARBUDA","enum":["https://demo.com/attr/relto/value/atg"]},{"type":"string","title":"AUSTRIA","enum":["https://demo.com/attr/relto/value/aut"]},{"type":"string","title":"AZERBAIJAN","enum":["https://demo.com/attr/relto/value/aze"]},{"type":"string","title":"BURUNDI","enum":["https://demo.com/attr/relto/value/bdi"]},{"type":"string","title":"BELGIUM","enum":["https://demo.com/attr/relto/value/bel"]},{"type":"string","title":"BENIN","enum":["https://demo.com/attr/relto/value/ben"]},{"type":"string","title":"BONAIRE, SINT EUSTATIUS AND SABA","enum":["https://demo.com/attr/relto/value/bes"]},{"type":"string","title":"BURKINA FASO","enum":["https://demo.com/attr/relto/value/bfa"]},{"type":"string","title":"BANGLADESH","enum":["https://demo.com/attr/relto/value/bgd"]},{"type":"string","title":"BULGARIA","enum":["https://demo.com/attr/relto/value/bgr"]},{"type":"string","title":"BAHRAIN","enum":["https://demo.com/attr/relto/value/bhr"]},{"type":"string","title":"BAHAMAS, THE","enum":["https://demo.com/attr/relto/value/bhs"]},{"type":"string","title":"BOSNIA AND HERZEGOVINA","enum":["https://demo.com/attr/relto/value/bih"]},{"type":"string","title":"SAINT BARTHELEMY","enum":["https://demo.com/attr/relto/value/blm"]},{"type":"string","title":"BELARUS","enum":["https://demo.com/attr/relto/value/blr"]},{"type":"string","title":"BELIZE","enum":["https://demo.com/attr/relto/value/blz"]},{"type":"string","title":"BERMUDA","enum":["https://demo.com/attr/relto/value/bmu"]},{"type":"string","title":"BOLIVIA","enum":["https://demo.com/attr/relto/value/bol"]},{"type":"string","title":"BRAZIL","enum":["https://demo.com/attr/relto/value/bra"]},{"type":"string","title":"BARBADOS","enum":["https://demo.com/attr/relto/value/brb"]},{"type":"string","title":"BRUNEI","enum":["https://demo.com/attr/relto/value/brn"]},{"type":"string","title":"BHUTAN","enum":["https://demo.com/attr/relto/value/btn"]},{"type":"string","title":"BOUVET ISLAND","enum":["https://demo.com/attr/relto/value/bvt"]},{"type":"string","title":"BOTSWANA","enum":["https://demo.com/attr/relto/value/bwa"]},{"type":"string","title":"CENTRAL AFRICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/caf"]},{"type":"string","title":"CANADA","enum":["https://demo.com/attr/relto/value/can"]},{"type":"string","title":"COCOS (KEELING) ISLANDS","enum":["https://demo.com/attr/relto/value/cck"]},{"type":"string","title":"SWITZERLAND","enum":["https://demo.com/attr/relto/value/che"]},{"type":"string","title":"CHILE","enum":["https://demo.com/attr/relto/value/chl"]},{"type":"string","title":"CHINA","enum":["https://demo.com/attr/relto/value/chn"]},{"type":"string","title":"CÔTE D''IVOIRE","enum":["https://demo.com/attr/relto/value/civ"]},{"type":"string","title":"CAMEROON","enum":["https://demo.com/attr/relto/value/cmr"]},{"type":"string","title":"CONGO(KINSHASA)","enum":["https://demo.com/attr/relto/value/cod"]},{"type":"string","title":"CONGO (BRAZZAVILLE)","enum":["https://demo.com/attr/relto/value/cog"]},{"type":"string","title":"COOK ISLANDS","enum":["https://demo.com/attr/relto/value/cok"]},{"type":"string","title":"COLOMBIA","enum":["https://demo.com/attr/relto/value/col"]},{"type":"string","title":"COMOROS","enum":["https://demo.com/attr/relto/value/com"]},{"type":"string","title":"CABO VERDE","enum":["https://demo.com/attr/relto/value/cpv"]},{"type":"string","title":"COSTA RICA","enum":["https://demo.com/attr/relto/value/cri"]},{"type":"string","title":"CUBA","enum":["https://demo.com/attr/relto/value/cub"]},{"type":"string","title":"CURAÇAO","enum":["https://demo.com/attr/relto/value/cuw"]},{"type":"string","title":"CHRISTMAS ISLAND","enum":["https://demo.com/attr/relto/value/cxr"]},{"type":"string","title":"CAYMAN ISLANDS","enum":["https://demo.com/attr/relto/value/cym"]},{"type":"string","title":"CYPRUS","enum":["https://demo.com/attr/relto/value/cyp"]},{"type":"string","title":"CZECH REPUBLIC","enum":["https://demo.com/attr/relto/value/cze"]},{"type":"string","title":"GERMANY","enum":["https://demo.com/attr/relto/value/deu"]},{"type":"string","title":"DJIBOUTI","enum":["https://demo.com/attr/relto/value/dji"]},{"type":"string","title":"DOMINICA","enum":["https://demo.com/attr/relto/value/dma"]},{"type":"string","title":"DENMARK","enum":["https://demo.com/attr/relto/value/dnk"]},{"type":"string","title":"DOMINICAN REPUBLIC","enum":["https://demo.com/attr/relto/value/dom"]},{"type":"string","title":"ALGERIA","enum":["https://demo.com/attr/relto/value/dza"]},{"type":"string","title":"ECUADOR","enum":["https://demo.com/attr/relto/value/ecu"]},{"type":"string","title":"EGYPT","enum":["https://demo.com/attr/relto/value/egy"]},{"type":"string","title":"ERITREA","enum":["https://demo.com/attr/relto/value/eri"]},{"type":"string","title":"WESTERN SAHARA","enum":["https://demo.com/attr/relto/value/esh"]},{"type":"string","title":"SPAIN","enum":["https://demo.com/attr/relto/value/esp"]},{"type":"string","title":"ESTONIA","enum":["https://demo.com/attr/relto/value/est"]},{"type":"string","title":"ETHIOPIA","enum":["https://demo.com/attr/relto/value/eth"]},{"type":"string","title":"FINLAND","enum":["https://demo.com/attr/relto/value/fin"]},{"type":"string","title":"FIJI","enum":["https://demo.com/attr/relto/value/fji"]},{"type":"string","title":"FALKLAND ISLANDS (ISLAS MALVINAS)","enum":["https://demo.com/attr/relto/value/flk"]},{"type":"string","title":"FAROE ISLANDS","enum":["https://demo.com/attr/relto/value/fro"]},{"type":"string","title":"MICRONESIA, FEDERATED STATES OF","enum":["https://demo.com/attr/relto/value/fsm"]},{"type":"string","title":"GABON","enum":["https://demo.com/attr/relto/value/gab"]},{"type":"string","title":"GEORGIA","enum":["https://demo.com/attr/relto/value/geo"]},{"type":"string","title":"GUERNSEY","enum":["https://demo.com/attr/relto/value/ggy"]},{"type":"string","title":"GHANA","enum":["https://demo.com/attr/relto/value/gha"]},{"type":"string","title":"GIBRALTAR","enum":["https://demo.com/attr/relto/value/gib"]},{"type":"string","title":"GUINEA","enum":["https://demo.com/attr/relto/value/gin"]},{"type":"string","title":"GUADELOUPE","enum":["https://demo.com/attr/relto/value/glp"]},{"type":"string","title":"GAMBIA, THE","enum":["https://demo.com/attr/relto/value/gmb"]},{"type":"string","title":"GUINEA-BISSAU","enum":["https://demo.com/attr/relto/value/gnb"]},{"type":"string","title":"EQUATORIAL GUINEA","enum":["https://demo.com/attr/relto/value/gnq"]},{"type":"string","title":"GREECE","enum":["https://demo.com/attr/relto/value/grc"]},{"type":"string","title":"GRENADA","enum":["https://demo.com/attr/relto/value/grd"]},{"type":"string","title":"GREENLAND","enum":["https://demo.com/attr/relto/value/grl"]},{"type":"string","title":"GUATEMALA","enum":["https://demo.com/attr/relto/value/gtm"]},{"type":"string","title":"FRENCH GUIANA","enum":["https://demo.com/attr/relto/value/guf"]},{"type":"string","title":"GUAM","enum":["https://demo.com/attr/relto/value/gum"]},{"type":"string","title":"GUYANA","enum":["https://demo.com/attr/relto/value/guy"]},{"type":"string","title":"HONG KONG","enum":["https://demo.com/attr/relto/value/hkg"]},{"type":"string","title":"HEARD ISLAND AND MCDONALD ISLANDS","enum":["https://demo.com/attr/relto/value/hmd"]},{"type":"string","title":"HONDURAS","enum":["https://demo.com/attr/relto/value/hnd"]},{"type":"string","title":"CROATIA","enum":["https://demo.com/attr/relto/value/hrv"]},{"type":"string","title":"HAITI","enum":["https://demo.com/attr/relto/value/hti"]},{"type":"string","title":"HUNGARY","enum":["https://demo.com/attr/relto/value/hun"]},{"type":"string","title":"INDONESIA","enum":["https://demo.com/attr/relto/value/idn"]},{"type":"string","title":"ISLE OF MAN","enum":["https://demo.com/attr/relto/value/imn"]},{"type":"string","title":"INDIA","enum":["https://demo.com/attr/relto/value/ind"]},{"type":"string","title":"BRITISH INDIAN OCEAN TERRITORY","enum":["https://demo.com/attr/relto/value/iot"]},{"type":"string","title":"IRELAND","enum":["https://demo.com/attr/relto/value/irl"]},{"type":"string","title":"IRAN","enum":["https://demo.com/attr/relto/value/irn"]},{"type":"string","title":"IRAQ","enum":["https://demo.com/attr/relto/value/irq"]},{"type":"string","title":"ICELAND","enum":["https://demo.com/attr/relto/value/isl"]},{"type":"string","title":"ISRAEL","enum":["https://demo.com/attr/relto/value/isr"]},{"type":"string","title":"ITALY","enum":["https://demo.com/attr/relto/value/ita"]},{"type":"string","title":"JAMAICA","enum":["https://demo.com/attr/relto/value/jam"]},{"type":"string","title":"JERSEY","enum":["https://demo.com/attr/relto/value/jey"]},{"type":"string","title":"JORDAN","enum":["https://demo.com/attr/relto/value/jor"]},{"type":"string","title":"JAPAN","enum":["https://demo.com/attr/relto/value/jpn"]},{"type":"string","title":"KAZAKHSTAN","enum":["https://demo.com/attr/relto/value/kaz"]},{"type":"string","title":"KENYA","enum":["https://demo.com/attr/relto/value/ken"]},{"type":"string","title":"KYRGYZSTAN","enum":["https://demo.com/attr/relto/value/kgz"]},{"type":"string","title":"CAMBODIA","enum":["https://demo.com/attr/relto/value/khm"]},{"type":"string","title":"KIRIBATI","enum":["https://demo.com/attr/relto/value/kir"]},{"type":"string","title":"SAINT KITTS AND NEVIS","enum":["https://demo.com/attr/relto/value/kna"]},{"type":"string","title":"KOREA, SOUTH","enum":["https://demo.com/attr/relto/value/kor"]},{"type":"string","title":"KUWAIT","enum":["https://demo.com/attr/relto/value/kwt"]},{"type":"string","title":"LAOS","enum":["https://demo.com/attr/relto/value/lao"]},{"type":"string","title":"LEBANON","enum":["https://demo.com/attr/relto/value/lbn"]},{"type":"string","title":"LIBERIA","enum":["https://demo.com/attr/relto/value/lbr"]},{"type":"string","title":"LIBYA","enum":["https://demo.com/attr/relto/value/lby"]},{"type":"string","title":"SAINT LUCIA","enum":["https://demo.com/attr/relto/value/lca"]},{"type":"string","title":"LIECHTENSTEIN","enum":["https://demo.com/attr/relto/value/lie"]},{"type":"string","title":"SRI LANKA","enum":["https://demo.com/attr/relto/value/lka"]},{"type":"string","title":"LESOTHO","enum":["https://demo.com/attr/relto/value/lso"]},{"type":"string","title":"LITHUANIA","enum":["https://demo.com/attr/relto/value/ltu"]},{"type":"string","title":"LUXEMBOURG","enum":["https://demo.com/attr/relto/value/lux"]},{"type":"string","title":"LATVIA","enum":["https://demo.com/attr/relto/value/lva"]},{"type":"string","title":"MACAU","enum":["https://demo.com/attr/relto/value/mac"]},{"type":"string","title":"SAINT MARTIN","enum":["https://demo.com/attr/relto/value/maf"]},{"type":"string","title":"MOROCCO","enum":["https://demo.com/attr/relto/value/mar"]},{"type":"string","title":"MONACO","enum":["https://demo.com/attr/relto/value/mco"]},{"type":"string","title":"MOLDOVA","enum":["https://demo.com/attr/relto/value/mda"]},{"type":"string","title":"MADAGASCAR","enum":["https://demo.com/attr/relto/value/mdg"]},{"type":"string","title":"MALDIVES","enum":["https://demo.com/attr/relto/value/mdv"]},{"type":"string","title":"MEXICO","enum":["https://demo.com/attr/relto/value/mex"]},{"type":"string","title":"MARSHALL ISLANDS","enum":["https://demo.com/attr/relto/value/mhl"]},{"type":"string","title":"MACEDONIA","enum":["https://demo.com/attr/relto/value/mkd"]},{"type":"string","title":"MALI","enum":["https://demo.com/attr/relto/value/mli"]},{"type":"string","title":"MALTA","enum":["https://demo.com/attr/relto/value/mlt"]},{"type":"string","title":"BURMA","enum":["https://demo.com/attr/relto/value/mmr"]},{"type":"string","title":"MONTENEGRO","enum":["https://demo.com/attr/relto/value/mne"]},{"type":"string","title":"MONGOLIA","enum":["https://demo.com/attr/relto/value/mng"]},{"type":"string","title":"NORTHERN MARIANA ISLANDS","enum":["https://demo.com/attr/relto/value/mnp"]},{"type":"string","title":"MOZAMBIQUE","enum":["https://demo.com/attr/relto/value/moz"]},{"type":"string","title":"MAURITANIA","enum":["https://demo.com/attr/relto/value/mrt"]},{"type":"string","title":"MONTSERRAT","enum":["https://demo.com/attr/relto/value/msr"]},{"type":"string","title":"MARTINIQUE","enum":["https://demo.com/attr/relto/value/mtq"]},{"type":"string","title":"MAURITIUS","enum":["https://demo.com/attr/relto/value/mus"]},{"type":"string","title":"MALAWI","enum":["https://demo.com/attr/relto/value/mwi"]},{"type":"string","title":"MALAYSIA","enum":["https://demo.com/attr/relto/value/mys"]},{"type":"string","title":"MAYOTTE","enum":["https://demo.com/attr/relto/value/myt"]},{"type":"string","title":"NAMIBIA","enum":["https://demo.com/attr/relto/value/nam"]},{"type":"string","title":"NEW CALEDONIA","enum":["https://demo.com/attr/relto/value/ncl"]},{"type":"string","title":"NIGER","enum":["https://demo.com/attr/relto/value/ner"]},{"type":"string","title":"NORFOLK ISLAND","enum":["https://demo.com/attr/relto/value/nfk"]},{"type":"string","title":"NIGERIA","enum":["https://demo.com/attr/relto/value/nga"]},{"type":"string","title":"NICARAGUA","enum":["https://demo.com/attr/relto/value/nic"]},{"type":"string","title":"NIUE","enum":["https://demo.com/attr/relto/value/niu"]},{"type":"string","title":"NETHERLANDS","enum":["https://demo.com/attr/relto/value/nld"]},{"type":"string","title":"NORWAY","enum":["https://demo.com/attr/relto/value/nor"]},{"type":"string","title":"NEPAL","enum":["https://demo.com/attr/relto/value/npl"]},{"type":"string","title":"NAURU","enum":["https://demo.com/attr/relto/value/nru"]},{"type":"string","title":"NEW ZEALAND","enum":["https://demo.com/attr/relto/value/nzl"]},{"type":"string","title":"OMAN","enum":["https://demo.com/attr/relto/value/omn"]},{"type":"string","title":"PAKISTAN","enum":["https://demo.com/attr/relto/value/pak"]},{"type":"string","title":"PANAMA","enum":["https://demo.com/attr/relto/value/pan"]},{"type":"string","title":"PITCAIRN ISLANDS","enum":["https://demo.com/attr/relto/value/pcn"]},{"type":"string","title":"PERU","enum":["https://demo.com/attr/relto/value/per"]},{"type":"string","title":"PHILIPPINES","enum":["https://demo.com/attr/relto/value/phl"]},{"type":"string","title":"PALAU","enum":["https://demo.com/attr/relto/value/plw"]},{"type":"string","title":"PAPUA NEW GUINEA","enum":["https://demo.com/attr/relto/value/png"]},{"type":"string","title":"POLAND","enum":["https://demo.com/attr/relto/value/pol"]},{"type":"string","title":"PUERTO RICO","enum":["https://demo.com/attr/relto/value/pri"]},{"type":"string","title":"KOREA, NORTH","enum":["https://demo.com/attr/relto/value/prk"]},{"type":"string","title":"PORTUGAL","enum":["https://demo.com/attr/relto/value/prt"]},{"type":"string","title":"PARAGUAY","enum":["https://demo.com/attr/relto/value/pry"]},{"type":"string","title":"PALESTINE","enum":["https://demo.com/attr/relto/value/pse"]},{"type":"string","title":"FRENCH POLYNESIA","enum":["https://demo.com/attr/relto/value/pyf"]},{"type":"string","title":"QATAR","enum":["https://demo.com/attr/relto/value/qat"]},{"type":"string","title":"REUNION","enum":["https://demo.com/attr/relto/value/reu"]},{"type":"string","title":"ROMANIA","enum":["https://demo.com/attr/relto/value/rou"]},{"type":"string","title":"RUSSIA","enum":["https://demo.com/attr/relto/value/rus"]},{"type":"string","title":"RWANDA","enum":["https://demo.com/attr/relto/value/rwa"]},{"type":"string","title":"SAUDI ARABIA","enum":["https://demo.com/attr/relto/value/sau"]},{"type":"string","title":"SUDAN","enum":["https://demo.com/attr/relto/value/sdn"]},{"type":"string","title":"SENEGAL","enum":["https://demo.com/attr/relto/value/sen"]},{"type":"string","title":"SINGAPORE","enum":["https://demo.com/attr/relto/value/sgp"]},{"type":"string","title":"SOUTH GEORGIA AND SOUTH SANDWICH ISLANDS","enum":["https://demo.com/attr/relto/value/sgs"]},{"type":"string","title":"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA","enum":["https://demo.com/attr/relto/value/shn"]},{"type":"string","title":"SVALBARD","enum":["https://demo.com/attr/relto/value/sjm"]},{"type":"string","title":"SOLOMON ISLANDS","enum":["https://demo.com/attr/relto/value/slb"]},{"type":"string","title":"SIERRA LEONE","enum":["https://demo.com/attr/relto/value/sle"]},{"type":"string","title":"EL SALVADOR","enum":["https://demo.com/attr/relto/value/slv"]},{"type":"string","title":"SAN MARINO","enum":["https://demo.com/attr/relto/value/smr"]},{"type":"string","title":"SOMALIA","enum":["https://demo.com/attr/relto/value/som"]},{"type":"string","title":"SAINT PIERRE AND MIQUELON","enum":["https://demo.com/attr/relto/value/spm"]},{"type":"string","title":"SERBIA","enum":["https://demo.com/attr/relto/value/srb"]},{"type":"string","title":"SOUTH SUDAN","enum":["https://demo.com/attr/relto/value/ssd"]},{"type":"string","title":"SAO TOME AND PRINCIPE","enum":["https://demo.com/attr/relto/value/stp"]},{"type":"string","title":"SURINAME","enum":["https://demo.com/attr/relto/value/sur"]},{"type":"string","title":"SLOVAKIA","enum":["https://demo.com/attr/relto/value/svk"]},{"type":"string","title":"SLOVENIA","enum":["https://demo.com/attr/relto/value/svn"]},{"type":"string","title":"SWEDEN","enum":["https://demo.com/attr/relto/value/swe"]},{"type":"string","title":"SWAZILAND","enum":["https://demo.com/attr/relto/value/swz"]},{"type":"string","title":"SINT MAARTEN","enum":["https://demo.com/attr/relto/value/sxm"]},{"type":"string","title":"SEYCHELLES","enum":["https://demo.com/attr/relto/value/syc"]},{"type":"string","title":"SYRIA","enum":["https://demo.com/attr/relto/value/syr"]},{"type":"string","title":"TURKS AND CAICOS ISLANDS","enum":["https://demo.com/attr/relto/value/tca"]},{"type":"string","title":"CHAD","enum":["https://demo.com/attr/relto/value/tcd"]},{"type":"string","title":"TOGO","enum":["https://demo.com/attr/relto/value/tgo"]},{"type":"string","title":"THAILAND","enum":["https://demo.com/attr/relto/value/tha"]},{"type":"string","title":"TAJIKISTAN","enum":["https://demo.com/attr/relto/value/tjk"]},{"type":"string","title":"TOKELAU","enum":["https://demo.com/attr/relto/value/tkl"]},{"type":"string","title":"TURKMENISTAN","enum":["https://demo.com/attr/relto/value/tkm"]},{"type":"string","title":"TIMOR-LESTE","enum":["https://demo.com/attr/relto/value/tls"]},{"type":"string","title":"TONGA","enum":["https://demo.com/attr/relto/value/ton"]},{"type":"string","title":"TRINIDAD AND TOBAGO","enum":["https://demo.com/attr/relto/value/tto"]},{"type":"string","title":"TUNISIA","enum":["https://demo.com/attr/relto/value/tun"]},{"type":"string","title":"TURKEY","enum":["https://demo.com/attr/relto/value/tur"]},{"type":"string","title":"TUVALU","enum":["https://demo.com/attr/relto/value/tuv"]},{"type":"string","title":"TAIWAN","enum":["https://demo.com/attr/relto/value/twn"]},{"type":"string","title":"TANZANIA","enum":["https://demo.com/attr/relto/value/tza"]},{"type":"string","title":"UGANDA","enum":["https://demo.com/attr/relto/value/uga"]},{"type":"string","title":"UKRAINE","enum":["https://demo.com/attr/relto/value/ukr"]},{"type":"string","title":"US MINOR OUTLYING ISLANDS","enum":["https://demo.com/attr/relto/value/umi"]},{"type":"string","title":"URUGUAY","enum":["https://demo.com/attr/relto/value/ury"]},{"type":"string","title":"UZBEKISTAN","enum":["https://demo.com/attr/relto/value/uzb"]},{"type":"string","title":"VATICAN CITY","enum":["https://demo.com/attr/relto/value/vat"]},{"type":"string","title":"SAINT VINCENT AND THE GRENADINES","enum":["https://demo.com/attr/relto/value/vct"]},{"type":"string","title":"VENEZUELA","enum":["https://demo.com/attr/relto/value/ven"]},{"type":"string","title":"VIRGIN ISLANDS, BRITISH","enum":["https://demo.com/attr/relto/value/vgb"]},{"type":"string","title":"VIRGIN ISLANDS, U.S.","enum":["https://demo.com/attr/relto/value/vir"]},{"type":"string","title":"VIETNAM","enum":["https://demo.com/attr/relto/value/vnm"]} + ] + }, + "countries": { + "enumNames":["Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia, Plurinational State of","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Congo, the Democratic Republic of the","Cook Islands","Costa Rica","Côte d''Ivoire","Croatia","Cuba","Cyprus","Czech Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands (Malvinas)","Faroe Islands","Fiji","Finland","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guernsey","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Holy See (Vatican City State)","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran, Islamic Republic of","Iraq","Ireland","Isle of Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Korea, Democratic People''s Republic of","Korea, Republic of","Kuwait","Kyrgyzstan","Lao People''s Democratic Republic","Latvia","Lebanon","Lesotho","Liberia","Libyan Arab Jamahiriya","Liechtenstein","Lithuania","Luxembourg","Macao","Macedonia, the former Yugoslav Republic of","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia, Federated States of","Moldova, Republic of","Monaco","Mongolia","Montenegro","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","Northern Mariana Islands","Norway","Oman","Pakistan","Palau","Palestinian Territory, Occupied","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn","Poland","Portugal","Puerto Rico","Qatar","Réunion","Romania","Russian Federation","Rwanda","Saint Helena, Ascension and Tristan da Cunha","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syrian Arab Republic","Taiwan, Province of China","Tajikistan","Tanzania, United Republic of","Thailand","Timor-Leste","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Venezuela, Bolivarian Republic of","Viet Nam","Virgin Islands, British","Virgin Islands, U.S.","Wallis and Futuna","Western Sahara","Yemen","Zambia","Zimbabwe","Afghanistan"], + "enum":[{"country":"Albania","alpha2":"AL","alpha3":"ALB","numeric":8,"latitude":41,"longitude":20},{"country":"Algeria","alpha2":"DZ","alpha3":"DZA","numeric":12,"latitude":28,"longitude":3},{"country":"American Samoa","alpha2":"AS","alpha3":"ASM","numeric":16,"latitude":-14.3333,"longitude":-170},{"country":"Andorra","alpha2":"AD","alpha3":"AND","numeric":20,"latitude":42.5,"longitude":1.6},{"country":"Angola","alpha2":"AO","alpha3":"AGO","numeric":24,"latitude":-12.5,"longitude":18.5},{"country":"Anguilla","alpha2":"AI","alpha3":"AIA","numeric":660,"latitude":18.25,"longitude":-63.1667},{"country":"Antarctica","alpha2":"AQ","alpha3":"ATA","numeric":10,"latitude":-90,"longitude":0},{"country":"Antigua and Barbuda","alpha2":"AG","alpha3":"ATG","numeric":28,"latitude":17.05,"longitude":-61.8},{"country":"Argentina","alpha2":"AR","alpha3":"ARG","numeric":32,"latitude":-34,"longitude":-64},{"country":"Armenia","alpha2":"AM","alpha3":"ARM","numeric":51,"latitude":40,"longitude":45},{"country":"Aruba","alpha2":"AW","alpha3":"ABW","numeric":533,"latitude":12.5,"longitude":-69.9667},{"country":"Australia","alpha2":"AU","alpha3":"AUS","numeric":36,"latitude":-27,"longitude":133},{"country":"Austria","alpha2":"AT","alpha3":"AUT","numeric":40,"latitude":47.3333,"longitude":13.3333},{"country":"Azerbaijan","alpha2":"AZ","alpha3":"AZE","numeric":31,"latitude":40.5,"longitude":47.5},{"country":"Bahamas","alpha2":"BS","alpha3":"BHS","numeric":44,"latitude":24.25,"longitude":-76},{"country":"Bahrain","alpha2":"BH","alpha3":"BHR","numeric":48,"latitude":26,"longitude":50.55},{"country":"Bangladesh","alpha2":"BD","alpha3":"BGD","numeric":50,"latitude":24,"longitude":90},{"country":"Barbados","alpha2":"BB","alpha3":"BRB","numeric":52,"latitude":13.1667,"longitude":-59.5333},{"country":"Belarus","alpha2":"BY","alpha3":"BLR","numeric":112,"latitude":53,"longitude":28},{"country":"Belgium","alpha2":"BE","alpha3":"BEL","numeric":56,"latitude":50.8333,"longitude":4},{"country":"Belize","alpha2":"BZ","alpha3":"BLZ","numeric":84,"latitude":17.25,"longitude":-88.75},{"country":"Benin","alpha2":"BJ","alpha3":"BEN","numeric":204,"latitude":9.5,"longitude":2.25},{"country":"Bermuda","alpha2":"BM","alpha3":"BMU","numeric":60,"latitude":32.3333,"longitude":-64.75},{"country":"Bhutan","alpha2":"BT","alpha3":"BTN","numeric":64,"latitude":27.5,"longitude":90.5},{"country":"Bolivia, Plurinational State of","alpha2":"BO","alpha3":"BOL","numeric":68,"latitude":-17,"longitude":-65},{"country":"Bosnia and Herzegovina","alpha2":"BA","alpha3":"BIH","numeric":70,"latitude":44,"longitude":18},{"country":"Botswana","alpha2":"BW","alpha3":"BWA","numeric":72,"latitude":-22,"longitude":24},{"country":"Bouvet Island","alpha2":"BV","alpha3":"BVT","numeric":74,"latitude":-54.4333,"longitude":3.4},{"country":"Brazil","alpha2":"BR","alpha3":"BRA","numeric":76,"latitude":-10,"longitude":-55},{"country":"British Indian Ocean Territory","alpha2":"IO","alpha3":"IOT","numeric":86,"latitude":-6,"longitude":71.5},{"country":"Brunei Darussalam","alpha2":"BN","alpha3":"BRN","numeric":96,"latitude":4.5,"longitude":114.6667},{"country":"Bulgaria","alpha2":"BG","alpha3":"BGR","numeric":100,"latitude":43,"longitude":25},{"country":"Burkina Faso","alpha2":"BF","alpha3":"BFA","numeric":854,"latitude":13,"longitude":-2},{"country":"Burundi","alpha2":"BI","alpha3":"BDI","numeric":108,"latitude":-3.5,"longitude":30},{"country":"Cambodia","alpha2":"KH","alpha3":"KHM","numeric":116,"latitude":13,"longitude":105},{"country":"Cameroon","alpha2":"CM","alpha3":"CMR","numeric":120,"latitude":6,"longitude":12},{"country":"Canada","alpha2":"CA","alpha3":"CAN","numeric":124,"latitude":60,"longitude":-95},{"country":"Cape Verde","alpha2":"CV","alpha3":"CPV","numeric":132,"latitude":16,"longitude":-24},{"country":"Cayman Islands","alpha2":"KY","alpha3":"CYM","numeric":136,"latitude":19.5,"longitude":-80.5},{"country":"Central African Republic","alpha2":"CF","alpha3":"CAF","numeric":140,"latitude":7,"longitude":21},{"country":"Chad","alpha2":"TD","alpha3":"TCD","numeric":148,"latitude":15,"longitude":19},{"country":"Chile","alpha2":"CL","alpha3":"CHL","numeric":152,"latitude":-30,"longitude":-71},{"country":"China","alpha2":"CN","alpha3":"CHN","numeric":156,"latitude":35,"longitude":105},{"country":"Christmas Island","alpha2":"CX","alpha3":"CXR","numeric":162,"latitude":-10.5,"longitude":105.6667},{"country":"Cocos (Keeling) Islands","alpha2":"CC","alpha3":"CCK","numeric":166,"latitude":-12.5,"longitude":96.8333},{"country":"Colombia","alpha2":"CO","alpha3":"COL","numeric":170,"latitude":4,"longitude":-72},{"country":"Comoros","alpha2":"KM","alpha3":"COM","numeric":174,"latitude":-12.1667,"longitude":44.25},{"country":"Congo","alpha2":"CG","alpha3":"COG","numeric":178,"latitude":-1,"longitude":15},{"country":"Congo, the Democratic Republic of the","alpha2":"CD","alpha3":"COD","numeric":180,"latitude":0,"longitude":25},{"country":"Cook Islands","alpha2":"CK","alpha3":"COK","numeric":184,"latitude":-21.2333,"longitude":-159.7667},{"country":"Costa Rica","alpha2":"CR","alpha3":"CRI","numeric":188,"latitude":10,"longitude":-84},{"country":"Côte d''Ivoire","alpha2":"CI","alpha3":"CIV","numeric":384,"latitude":8,"longitude":-5},{"country":"Croatia","alpha2":"HR","alpha3":"HRV","numeric":191,"latitude":45.1667,"longitude":15.5},{"country":"Cuba","alpha2":"CU","alpha3":"CUB","numeric":192,"latitude":21.5,"longitude":-80},{"country":"Cyprus","alpha2":"CY","alpha3":"CYP","numeric":196,"latitude":35,"longitude":33},{"country":"Czech Republic","alpha2":"CZ","alpha3":"CZE","numeric":203,"latitude":49.75,"longitude":15.5},{"country":"Denmark","alpha2":"DK","alpha3":"DNK","numeric":208,"latitude":56,"longitude":10},{"country":"Djibouti","alpha2":"DJ","alpha3":"DJI","numeric":262,"latitude":11.5,"longitude":43},{"country":"Dominica","alpha2":"DM","alpha3":"DMA","numeric":212,"latitude":15.4167,"longitude":-61.3333},{"country":"Dominican Republic","alpha2":"DO","alpha3":"DOM","numeric":214,"latitude":19,"longitude":-70.6667},{"country":"Ecuador","alpha2":"EC","alpha3":"ECU","numeric":218,"latitude":-2,"longitude":-77.5},{"country":"Egypt","alpha2":"EG","alpha3":"EGY","numeric":818,"latitude":27,"longitude":30},{"country":"El Salvador","alpha2":"SV","alpha3":"SLV","numeric":222,"latitude":13.8333,"longitude":-88.9167},{"country":"Equatorial Guinea","alpha2":"GQ","alpha3":"GNQ","numeric":226,"latitude":2,"longitude":10},{"country":"Eritrea","alpha2":"ER","alpha3":"ERI","numeric":232,"latitude":15,"longitude":39},{"country":"Estonia","alpha2":"EE","alpha3":"EST","numeric":233,"latitude":59,"longitude":26},{"country":"Ethiopia","alpha2":"ET","alpha3":"ETH","numeric":231,"latitude":8,"longitude":38},{"country":"Falkland Islands (Malvinas)","alpha2":"FK","alpha3":"FLK","numeric":238,"latitude":-51.75,"longitude":-59},{"country":"Faroe Islands","alpha2":"FO","alpha3":"FRO","numeric":234,"latitude":62,"longitude":-7},{"country":"Fiji","alpha2":"FJ","alpha3":"FJI","numeric":242,"latitude":-18,"longitude":175},{"country":"Finland","alpha2":"FI","alpha3":"FIN","numeric":246,"latitude":64,"longitude":26},{"country":"France","alpha2":"FR","alpha3":"FRA","numeric":250,"latitude":46,"longitude":2},{"country":"French Guiana","alpha2":"GF","alpha3":"GUF","numeric":254,"latitude":4,"longitude":-53},{"country":"French Polynesia","alpha2":"PF","alpha3":"PYF","numeric":258,"latitude":-15,"longitude":-140},{"country":"French Southern Territories","alpha2":"TF","alpha3":"ATF","numeric":260,"latitude":-43,"longitude":67},{"country":"Gabon","alpha2":"GA","alpha3":"GAB","numeric":266,"latitude":-1,"longitude":11.75},{"country":"Gambia","alpha2":"GM","alpha3":"GMB","numeric":270,"latitude":13.4667,"longitude":-16.5667},{"country":"Georgia","alpha2":"GE","alpha3":"GEO","numeric":268,"latitude":42,"longitude":43.5},{"country":"Germany","alpha2":"DE","alpha3":"DEU","numeric":276,"latitude":51,"longitude":9},{"country":"Ghana","alpha2":"GH","alpha3":"GHA","numeric":288,"latitude":8,"longitude":-2},{"country":"Gibraltar","alpha2":"GI","alpha3":"GIB","numeric":292,"latitude":36.1833,"longitude":-5.3667},{"country":"Greece","alpha2":"GR","alpha3":"GRC","numeric":300,"latitude":39,"longitude":22},{"country":"Greenland","alpha2":"GL","alpha3":"GRL","numeric":304,"latitude":72,"longitude":-40},{"country":"Grenada","alpha2":"GD","alpha3":"GRD","numeric":308,"latitude":12.1167,"longitude":-61.6667},{"country":"Guadeloupe","alpha2":"GP","alpha3":"GLP","numeric":312,"latitude":16.25,"longitude":-61.5833},{"country":"Guam","alpha2":"GU","alpha3":"GUM","numeric":316,"latitude":13.4667,"longitude":144.7833},{"country":"Guatemala","alpha2":"GT","alpha3":"GTM","numeric":320,"latitude":15.5,"longitude":-90.25},{"country":"Guernsey","alpha2":"GG","alpha3":"GGY","numeric":831,"latitude":49.5,"longitude":-2.56},{"country":"Guinea","alpha2":"GN","alpha3":"GIN","numeric":324,"latitude":11,"longitude":-10},{"country":"Guinea-Bissau","alpha2":"GW","alpha3":"GNB","numeric":624,"latitude":12,"longitude":-15},{"country":"Guyana","alpha2":"GY","alpha3":"GUY","numeric":328,"latitude":5,"longitude":-59},{"country":"Haiti","alpha2":"HT","alpha3":"HTI","numeric":332,"latitude":19,"longitude":-72.4167},{"country":"Heard Island and McDonald Islands","alpha2":"HM","alpha3":"HMD","numeric":334,"latitude":-53.1,"longitude":72.5167},{"country":"Holy See (Vatican City State)","alpha2":"VA","alpha3":"VAT","numeric":336,"latitude":41.9,"longitude":12.45},{"country":"Honduras","alpha2":"HN","alpha3":"HND","numeric":340,"latitude":15,"longitude":-86.5},{"country":"Hong Kong","alpha2":"HK","alpha3":"HKG","numeric":344,"latitude":22.25,"longitude":114.1667},{"country":"Hungary","alpha2":"HU","alpha3":"HUN","numeric":348,"latitude":47,"longitude":20},{"country":"Iceland","alpha2":"IS","alpha3":"ISL","numeric":352,"latitude":65,"longitude":-18},{"country":"India","alpha2":"IN","alpha3":"IND","numeric":356,"latitude":20,"longitude":77},{"country":"Indonesia","alpha2":"ID","alpha3":"IDN","numeric":360,"latitude":-5,"longitude":120},{"country":"Iran, Islamic Republic of","alpha2":"IR","alpha3":"IRN","numeric":364,"latitude":32,"longitude":53},{"country":"Iraq","alpha2":"IQ","alpha3":"IRQ","numeric":368,"latitude":33,"longitude":44},{"country":"Ireland","alpha2":"IE","alpha3":"IRL","numeric":372,"latitude":53,"longitude":-8},{"country":"Isle of Man","alpha2":"IM","alpha3":"IMN","numeric":833,"latitude":54.23,"longitude":-4.55},{"country":"Israel","alpha2":"IL","alpha3":"ISR","numeric":376,"latitude":31.5,"longitude":34.75},{"country":"Italy","alpha2":"IT","alpha3":"ITA","numeric":380,"latitude":42.8333,"longitude":12.8333},{"country":"Jamaica","alpha2":"JM","alpha3":"JAM","numeric":388,"latitude":18.25,"longitude":-77.5},{"country":"Japan","alpha2":"JP","alpha3":"JPN","numeric":392,"latitude":36,"longitude":138},{"country":"Jersey","alpha2":"JE","alpha3":"JEY","numeric":832,"latitude":49.21,"longitude":-2.13},{"country":"Jordan","alpha2":"JO","alpha3":"JOR","numeric":400,"latitude":31,"longitude":36},{"country":"Kazakhstan","alpha2":"KZ","alpha3":"KAZ","numeric":398,"latitude":48,"longitude":68},{"country":"Kenya","alpha2":"KE","alpha3":"KEN","numeric":404,"latitude":1,"longitude":38},{"country":"Kiribati","alpha2":"KI","alpha3":"KIR","numeric":296,"latitude":1.4167,"longitude":173},{"country":"Korea, Democratic People''s Republic of","alpha2":"KP","alpha3":"PRK","numeric":408,"latitude":40,"longitude":127},{"country":"Korea, Republic of","alpha2":"KR","alpha3":"KOR","numeric":410,"latitude":37,"longitude":127.5},{"country":"Kuwait","alpha2":"KW","alpha3":"KWT","numeric":414,"latitude":29.3375,"longitude":47.6581},{"country":"Kyrgyzstan","alpha2":"KG","alpha3":"KGZ","numeric":417,"latitude":41,"longitude":75},{"country":"Lao People''s Democratic Republic","alpha2":"LA","alpha3":"LAO","numeric":418,"latitude":18,"longitude":105},{"country":"Latvia","alpha2":"LV","alpha3":"LVA","numeric":428,"latitude":57,"longitude":25},{"country":"Lebanon","alpha2":"LB","alpha3":"LBN","numeric":422,"latitude":33.8333,"longitude":35.8333},{"country":"Lesotho","alpha2":"LS","alpha3":"LSO","numeric":426,"latitude":-29.5,"longitude":28.5},{"country":"Liberia","alpha2":"LR","alpha3":"LBR","numeric":430,"latitude":6.5,"longitude":-9.5},{"country":"Libyan Arab Jamahiriya","alpha2":"LY","alpha3":"LBY","numeric":434,"latitude":25,"longitude":17},{"country":"Liechtenstein","alpha2":"LI","alpha3":"LIE","numeric":438,"latitude":47.1667,"longitude":9.5333},{"country":"Lithuania","alpha2":"LT","alpha3":"LTU","numeric":440,"latitude":56,"longitude":24},{"country":"Luxembourg","alpha2":"LU","alpha3":"LUX","numeric":442,"latitude":49.75,"longitude":6.1667},{"country":"Macao","alpha2":"MO","alpha3":"MAC","numeric":446,"latitude":22.1667,"longitude":113.55},{"country":"Macedonia, the former Yugoslav Republic of","alpha2":"MK","alpha3":"MKD","numeric":807,"latitude":41.8333,"longitude":22},{"country":"Madagascar","alpha2":"MG","alpha3":"MDG","numeric":450,"latitude":-20,"longitude":47},{"country":"Malawi","alpha2":"MW","alpha3":"MWI","numeric":454,"latitude":-13.5,"longitude":34},{"country":"Malaysia","alpha2":"MY","alpha3":"MYS","numeric":458,"latitude":2.5,"longitude":112.5},{"country":"Maldives","alpha2":"MV","alpha3":"MDV","numeric":462,"latitude":3.25,"longitude":73},{"country":"Mali","alpha2":"ML","alpha3":"MLI","numeric":466,"latitude":17,"longitude":-4},{"country":"Malta","alpha2":"MT","alpha3":"MLT","numeric":470,"latitude":35.8333,"longitude":14.5833},{"country":"Marshall Islands","alpha2":"MH","alpha3":"MHL","numeric":584,"latitude":9,"longitude":168},{"country":"Martinique","alpha2":"MQ","alpha3":"MTQ","numeric":474,"latitude":14.6667,"longitude":-61},{"country":"Mauritania","alpha2":"MR","alpha3":"MRT","numeric":478,"latitude":20,"longitude":-12},{"country":"Mauritius","alpha2":"MU","alpha3":"MUS","numeric":480,"latitude":-20.2833,"longitude":57.55},{"country":"Mayotte","alpha2":"YT","alpha3":"MYT","numeric":175,"latitude":-12.8333,"longitude":45.1667},{"country":"Mexico","alpha2":"MX","alpha3":"MEX","numeric":484,"latitude":23,"longitude":-102},{"country":"Micronesia, Federated States of","alpha2":"FM","alpha3":"FSM","numeric":583,"latitude":6.9167,"longitude":158.25},{"country":"Moldova, Republic of","alpha2":"MD","alpha3":"MDA","numeric":498,"latitude":47,"longitude":29},{"country":"Monaco","alpha2":"MC","alpha3":"MCO","numeric":492,"latitude":43.7333,"longitude":7.4},{"country":"Mongolia","alpha2":"MN","alpha3":"MNG","numeric":496,"latitude":46,"longitude":105},{"country":"Montenegro","alpha2":"ME","alpha3":"MNE","numeric":499,"latitude":42,"longitude":19},{"country":"Montserrat","alpha2":"MS","alpha3":"MSR","numeric":500,"latitude":16.75,"longitude":-62.2},{"country":"Morocco","alpha2":"MA","alpha3":"MAR","numeric":504,"latitude":32,"longitude":-5},{"country":"Mozambique","alpha2":"MZ","alpha3":"MOZ","numeric":508,"latitude":-18.25,"longitude":35},{"country":"Myanmar","alpha2":"MM","alpha3":"MMR","numeric":104,"latitude":22,"longitude":98},{"country":"Namibia","alpha2":"NA","alpha3":"NAM","numeric":516,"latitude":-22,"longitude":17},{"country":"Nauru","alpha2":"NR","alpha3":"NRU","numeric":520,"latitude":-0.5333,"longitude":166.9167},{"country":"Nepal","alpha2":"NP","alpha3":"NPL","numeric":524,"latitude":28,"longitude":84},{"country":"Netherlands","alpha2":"NL","alpha3":"NLD","numeric":528,"latitude":52.5,"longitude":5.75},{"country":"Netherlands Antilles","alpha2":"AN","alpha3":"ANT","numeric":530,"latitude":12.25,"longitude":-68.75},{"country":"New Caledonia","alpha2":"NC","alpha3":"NCL","numeric":540,"latitude":-21.5,"longitude":165.5},{"country":"New Zealand","alpha2":"NZ","alpha3":"NZL","numeric":554,"latitude":-41,"longitude":174},{"country":"Nicaragua","alpha2":"NI","alpha3":"NIC","numeric":558,"latitude":13,"longitude":-85},{"country":"Niger","alpha2":"NE","alpha3":"NER","numeric":562,"latitude":16,"longitude":8},{"country":"Nigeria","alpha2":"NG","alpha3":"NGA","numeric":566,"latitude":10,"longitude":8},{"country":"Niue","alpha2":"NU","alpha3":"NIU","numeric":570,"latitude":-19.0333,"longitude":-169.8667},{"country":"Norfolk Island","alpha2":"NF","alpha3":"NFK","numeric":574,"latitude":-29.0333,"longitude":167.95},{"country":"Northern Mariana Islands","alpha2":"MP","alpha3":"MNP","numeric":580,"latitude":15.2,"longitude":145.75},{"country":"Norway","alpha2":"NO","alpha3":"NOR","numeric":578,"latitude":62,"longitude":10},{"country":"Oman","alpha2":"OM","alpha3":"OMN","numeric":512,"latitude":21,"longitude":57},{"country":"Pakistan","alpha2":"PK","alpha3":"PAK","numeric":586,"latitude":30,"longitude":70},{"country":"Palau","alpha2":"PW","alpha3":"PLW","numeric":585,"latitude":7.5,"longitude":134.5},{"country":"Palestinian Territory, Occupied","alpha2":"PS","alpha3":"PSE","numeric":275,"latitude":32,"longitude":35.25},{"country":"Panama","alpha2":"PA","alpha3":"PAN","numeric":591,"latitude":9,"longitude":-80},{"country":"Papua New Guinea","alpha2":"PG","alpha3":"PNG","numeric":598,"latitude":-6,"longitude":147},{"country":"Paraguay","alpha2":"PY","alpha3":"PRY","numeric":600,"latitude":-23,"longitude":-58},{"country":"Peru","alpha2":"PE","alpha3":"PER","numeric":604,"latitude":-10,"longitude":-76},{"country":"Philippines","alpha2":"PH","alpha3":"PHL","numeric":608,"latitude":13,"longitude":122},{"country":"Pitcairn","alpha2":"PN","alpha3":"PCN","numeric":612,"latitude":-24.7,"longitude":-127.4},{"country":"Poland","alpha2":"PL","alpha3":"POL","numeric":616,"latitude":52,"longitude":20},{"country":"Portugal","alpha2":"PT","alpha3":"PRT","numeric":620,"latitude":39.5,"longitude":-8},{"country":"Puerto Rico","alpha2":"PR","alpha3":"PRI","numeric":630,"latitude":18.25,"longitude":-66.5},{"country":"Qatar","alpha2":"QA","alpha3":"QAT","numeric":634,"latitude":25.5,"longitude":51.25},{"country":"Réunion","alpha2":"RE","alpha3":"REU","numeric":638,"latitude":-21.1,"longitude":55.6},{"country":"Romania","alpha2":"RO","alpha3":"ROU","numeric":642,"latitude":46,"longitude":25},{"country":"Russian Federation","alpha2":"RU","alpha3":"RUS","numeric":643,"latitude":60,"longitude":100},{"country":"Rwanda","alpha2":"RW","alpha3":"RWA","numeric":646,"latitude":-2,"longitude":30},{"country":"Saint Helena, Ascension and Tristan da Cunha","alpha2":"SH","alpha3":"SHN","numeric":654,"latitude":-15.9333,"longitude":-5.7},{"country":"Saint Kitts and Nevis","alpha2":"KN","alpha3":"KNA","numeric":659,"latitude":17.3333,"longitude":-62.75},{"country":"Saint Lucia","alpha2":"LC","alpha3":"LCA","numeric":662,"latitude":13.8833,"longitude":-61.1333},{"country":"Saint Pierre and Miquelon","alpha2":"PM","alpha3":"SPM","numeric":666,"latitude":46.8333,"longitude":-56.3333},{"country":"Saint Vincent and the Grenadines","alpha2":"VC","alpha3":"VCT","numeric":670,"latitude":13.25,"longitude":-61.2},{"country":"Samoa","alpha2":"WS","alpha3":"WSM","numeric":882,"latitude":-13.5833,"longitude":-172.3333},{"country":"San Marino","alpha2":"SM","alpha3":"SMR","numeric":674,"latitude":43.7667,"longitude":12.4167},{"country":"Sao Tome and Principe","alpha2":"ST","alpha3":"STP","numeric":678,"latitude":1,"longitude":7},{"country":"Saudi Arabia","alpha2":"SA","alpha3":"SAU","numeric":682,"latitude":25,"longitude":45},{"country":"Senegal","alpha2":"SN","alpha3":"SEN","numeric":686,"latitude":14,"longitude":-14},{"country":"Serbia","alpha2":"RS","alpha3":"SRB","numeric":688,"latitude":44,"longitude":21},{"country":"Seychelles","alpha2":"SC","alpha3":"SYC","numeric":690,"latitude":-4.5833,"longitude":55.6667},{"country":"Sierra Leone","alpha2":"SL","alpha3":"SLE","numeric":694,"latitude":8.5,"longitude":-11.5},{"country":"Singapore","alpha2":"SG","alpha3":"SGP","numeric":702,"latitude":1.3667,"longitude":103.8},{"country":"Slovakia","alpha2":"SK","alpha3":"SVK","numeric":703,"latitude":48.6667,"longitude":19.5},{"country":"Slovenia","alpha2":"SI","alpha3":"SVN","numeric":705,"latitude":46,"longitude":15},{"country":"Solomon Islands","alpha2":"SB","alpha3":"SLB","numeric":90,"latitude":-8,"longitude":159},{"country":"Somalia","alpha2":"SO","alpha3":"SOM","numeric":706,"latitude":10,"longitude":49},{"country":"South Africa","alpha2":"ZA","alpha3":"ZAF","numeric":710,"latitude":-29,"longitude":24},{"country":"South Georgia and the South Sandwich Islands","alpha2":"GS","alpha3":"SGS","numeric":239,"latitude":-54.5,"longitude":-37},{"country":"Spain","alpha2":"ES","alpha3":"ESP","numeric":724,"latitude":40,"longitude":-4},{"country":"Sri Lanka","alpha2":"LK","alpha3":"LKA","numeric":144,"latitude":7,"longitude":81},{"country":"Sudan","alpha2":"SD","alpha3":"SDN","numeric":736,"latitude":15,"longitude":30},{"country":"Suriname","alpha2":"SR","alpha3":"SUR","numeric":740,"latitude":4,"longitude":-56},{"country":"Svalbard and Jan Mayen","alpha2":"SJ","alpha3":"SJM","numeric":744,"latitude":78,"longitude":20},{"country":"Swaziland","alpha2":"SZ","alpha3":"SWZ","numeric":748,"latitude":-26.5,"longitude":31.5},{"country":"Sweden","alpha2":"SE","alpha3":"SWE","numeric":752,"latitude":62,"longitude":15},{"country":"Switzerland","alpha2":"CH","alpha3":"CHE","numeric":756,"latitude":47,"longitude":8},{"country":"Syrian Arab Republic","alpha2":"SY","alpha3":"SYR","numeric":760,"latitude":35,"longitude":38},{"country":"Taiwan, Province of China","alpha2":"TW","alpha3":"TWN","numeric":158,"latitude":23.5,"longitude":121},{"country":"Tajikistan","alpha2":"TJ","alpha3":"TJK","numeric":762,"latitude":39,"longitude":71},{"country":"Tanzania, United Republic of","alpha2":"TZ","alpha3":"TZA","numeric":834,"latitude":-6,"longitude":35},{"country":"Thailand","alpha2":"TH","alpha3":"THA","numeric":764,"latitude":15,"longitude":100},{"country":"Timor-Leste","alpha2":"TL","alpha3":"TLS","numeric":626,"latitude":-8.55,"longitude":125.5167},{"country":"Togo","alpha2":"TG","alpha3":"TGO","numeric":768,"latitude":8,"longitude":1.1667},{"country":"Tokelau","alpha2":"TK","alpha3":"TKL","numeric":772,"latitude":-9,"longitude":-172},{"country":"Tonga","alpha2":"TO","alpha3":"TON","numeric":776,"latitude":-20,"longitude":-175},{"country":"Trinidad and Tobago","alpha2":"TT","alpha3":"TTO","numeric":780,"latitude":11,"longitude":-61},{"country":"Tunisia","alpha2":"TN","alpha3":"TUN","numeric":788,"latitude":34,"longitude":9},{"country":"Turkey","alpha2":"TR","alpha3":"TUR","numeric":792,"latitude":39,"longitude":35},{"country":"Turkmenistan","alpha2":"TM","alpha3":"TKM","numeric":795,"latitude":40,"longitude":60},{"country":"Turks and Caicos Islands","alpha2":"TC","alpha3":"TCA","numeric":796,"latitude":21.75,"longitude":-71.5833},{"country":"Tuvalu","alpha2":"TV","alpha3":"TUV","numeric":798,"latitude":-8,"longitude":178},{"country":"Uganda","alpha2":"UG","alpha3":"UGA","numeric":800,"latitude":1,"longitude":32},{"country":"Ukraine","alpha2":"UA","alpha3":"UKR","numeric":804,"latitude":49,"longitude":32},{"country":"United Arab Emirates","alpha2":"AE","alpha3":"ARE","numeric":784,"latitude":24,"longitude":54},{"country":"United Kingdom","alpha2":"GB","alpha3":"GBR","numeric":826,"latitude":54,"longitude":-2},{"country":"United States","alpha2":"US","alpha3":"USA","numeric":840,"latitude":38,"longitude":-97},{"country":"United States Minor Outlying Islands","alpha2":"UM","alpha3":"UMI","numeric":581,"latitude":19.2833,"longitude":166.6},{"country":"Uruguay","alpha2":"UY","alpha3":"URY","numeric":858,"latitude":-33,"longitude":-56},{"country":"Uzbekistan","alpha2":"UZ","alpha3":"UZB","numeric":860,"latitude":41,"longitude":64},{"country":"Vanuatu","alpha2":"VU","alpha3":"VUT","numeric":548,"latitude":-16,"longitude":167},{"country":"Venezuela, Bolivarian Republic of","alpha2":"VE","alpha3":"VEN","numeric":862,"latitude":8,"longitude":-66},{"country":"Viet Nam","alpha2":"VN","alpha3":"VNM","numeric":704,"latitude":16,"longitude":106},{"country":"Virgin Islands, British","alpha2":"VG","alpha3":"VGB","numeric":92,"latitude":18.5,"longitude":-64.5},{"country":"Virgin Islands, U.S.","alpha2":"VI","alpha3":"VIR","numeric":850,"latitude":18.3333,"longitude":-64.8333},{"country":"Wallis and Futuna","alpha2":"WF","alpha3":"WLF","numeric":876,"latitude":-13.3,"longitude":-176.2},{"country":"Western Sahara","alpha2":"EH","alpha3":"ESH","numeric":732,"latitude":24.5,"longitude":-13},{"country":"Yemen","alpha2":"YE","alpha3":"YEM","numeric":887,"latitude":15,"longitude":48},{"country":"Zambia","alpha2":"ZM","alpha3":"ZMB","numeric":894,"latitude":-15,"longitude":30},{"country":"Zimbabwe","alpha2":"ZW","alpha3":"ZWE","numeric":716,"latitude":-20,"longitude":30},{"country":"Afghanistan","alpha2":"AF","alpha3":"AFG","numeric":4,"latitude":33,"longitude":65}] + } + }, + "properties": { + "attrClassification": { + "title":"Classification", + "type":"string", + "$ref":"#/definitions/attrClassification" + }, + "attrNeedToKnow": { + "title":"Need To Know", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attrNeedToKnow"} + }, + "attrRelTo": { + "title":"Rel To", + "type":"array", + "uniqueItems":true, + "items":{"$ref":"#/definitions/attributeRelTo"} + }, + "vehicleName": { + "title":"Vehicle Name", + "type":"string", + "minLength":1 + }, + "callsign": { + "title":"Callsign", + "type":"string", + "minLength":1 + }, + "origin": { + "title":"Origin", + "type":"string", + "minLength":1 + }, + "destination": { + "title":"Destination", + "type":"string", + "minLength":1 + }, + "aircraft_type": { + "title":"Aircraft Type", + "type":"string", + "minLength":1 + } + } + }', + '{ + "order": ["attrClassification","attrNeedToKnow","attrRelTo","vehicleName","callsign","origin","destination","aircraft_type","speed","altitude","heading"], + "attrClassification":{"widget":"AttributeAutocomplete"}, + "attrNeedToKnow":{"widget":"AttributeAutocomplete","multiple":true}, + "attrRelTo":{"widget":"AttributeAutocomplete","multiple":true}, + "vehicleName":{"ui:placeholder":"Enter vehicle name"}, + "callsign":{"ui:placeholder":"Enter callsign"}, + "origin":{"ui:placeholder":"Enter origin"}, + "destination":{"ui:placeholder":"Enter destination"}, + "aircraft_type":{"ui:placeholder":"Enter aircraft type"}, + "speed":{"ui:placeholder":"Enter speed"}, + "altitude":{"ui:placeholder":"Enter altitude"}, + "heading":{"ui:placeholder":"Enter heading"} + }', + '{ + "searchFields":["attrClassification","attrNeedToKnow","attrRelTo"], + "attrFields":["attrClassification","attrNeedToKnow","attrRelTo"], + "displayFields": { + "header":"callsign", + "details":["attrClassification","attrNeedToKnow","attrRelTo","vehicleName","callsign","origin","destination","aircraft_type","speed","altitude","heading"] + } + }' ) + -- TODO add information for vehicles above, should both allow vehicle level filtering & + -- control its display in the search results box (at least I think.) -- update columns on conflict - ON CONFLICT (id) DO UPDATE SET - form_schema = EXCLUDED.form_schema, - ui_schema = EXCLUDED.ui_schema, - metadata = EXCLUDED.metadata; + +ON CONFLICT (id) DO UPDATE SET + form_schema = EXCLUDED.form_schema, + ui_schema = EXCLUDED.ui_schema, + metadata = EXCLUDED.metadata; \ No newline at end of file diff --git a/common-operating-picture/dev.dsp.Dockerfile b/common-operating-picture/dev.dsp.Dockerfile index 7643460..cd3c95b 100644 --- a/common-operating-picture/dev.dsp.Dockerfile +++ b/common-operating-picture/dev.dsp.Dockerfile @@ -1,11 +1,9 @@ # syntax=docker/dockerfile:1.6 # Set your runtime image (override with --build-arg) -#ARG DSP_IMAGE=us-docker.pkg.dev/prj-infra-automation-ktbz/internal/data-security-platform:v2.6.2 -ARG DSP_IMAGE=localhost:5000/virtru/data-security-platform:v2.6.2 -#ARG DSP_IMAGE=us-docker.pkg.dev/prj-infra-automation-ktbz/internal/data-security-platform:v2.5.0-build.e8c8e8a +ARG DSP_IMAGE=localhost:5000/virtru/data-security-platform:v2.7.1 # ---------- prep stage: build CA bundle & stage files ---------- -FROM alpine:3.20.2 AS prep +FROM alpine:latest AS prep WORKDIR /work # CA tools and trust store @@ -14,9 +12,7 @@ RUN apk add --no-cache ca-certificates && update-ca-certificates # TLS materials # (Only certificates belong in /usr/local/share/ca-certificates; keep private keys elsewhere.) COPY ./dsp-keys/local-dsp.virtru.com.pem /usr/local/share/ca-certificates/local-dsp.virtru.com.crt -#COPY ./dsp-keys/local-dsp.virtru.com.key.pem /usr/local/share/ca-certificates/local-dsp.virtru.com.key.pem COPY ./dsp-keys/local-dsp.virtru.com.key.pem /work/dsp-keys/local-dsp.virtru.com.key.pem -#COPY ./dsp-keys/local-dsp.virtru.com.pem /work/dsp-keys/ca-certificates/local-dsp.virtru.com.crt # Merge our cert into the system bundle and stash it to copy later @@ -55,5 +51,3 @@ COPY --from=prep /work/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt ENTRYPOINT ["/usr/bin/dsp"] - - diff --git a/common-operating-picture/docker-compose.all.yaml b/common-operating-picture/docker-compose.all.yaml deleted file mode 100755 index f242cef..0000000 --- a/common-operating-picture/docker-compose.all.yaml +++ /dev/null @@ -1,115 +0,0 @@ -################################################################################ -# -# Data Security Platform (DSP) Common Operating Picture (COP) Docker Compose -# -# This file is used to define the services that make up the DSP COP application. -################################################################################ - -### Exposed Ports ### -# 15432:5432 - COP database -# 8888:8888 - Keycloak HTTP -# 8443:8443 - Keycloak HTTPS -# 25434:5432 - Keycloak database -# 35433:5432 - DSP database -# 8080:8080 - DSP services -# 18080:8080 - NiFi - -name: virtru-dsp-cop-dev - -### -# The following services are primarily defined in the docker-compose.base.yaml file. -services: - -#================================================================ -# Start the COP database -#---------------------------------------------------------------- - cop-db: - extends: - file: ./compose/docker-compose.cop-db.yaml - service: cop-db - -#================================================================ -# Setup the COP database -#---------------------------------------------------------------- - cop-db-setup: - extends: - file: ./compose/docker-compose.cop-db.yaml - service: cop-db-setup - -#================================================================ -# Start Keycloak -#---------------------------------------------------------------- - keycloak: - extends: - file: ./compose/docker-compose.keycloak.yaml - service: keycloak - -#================================================================ -# Provisioning Keycloak with expected realm, clients, and users -#---------------------------------------------------------------- - dsp-keycloak-provisioning: - extends: - file: ./compose/docker-compose.dsp.yaml - service: dsp-keycloak-provisioning - -#================================================================ -# Start the DSP database -#---------------------------------------------------------------- - dsp-db: - extends: - file: ./compose/docker-compose.dsp.yaml - service: dsp-db - -#================================================================ -# Start the DSP services -#---------------------------------------------------------------- - dsp: - extends: - file: ./compose/docker-compose.dsp.yaml - service: dsp - -#================================================================ -# Provision the DSP with DSP COP federal policy -#---------------------------------------------------------------- - dsp-provision-federal-policy: - extends: - file: ./compose/docker-compose.dsp.yaml - service: dsp-provision-federal-policy - -#================================================================ -# Wait for someone needing a shell -#---------------------------------------------------------------- - dsp-cli-user: - extends: - file: ./compose/docker-compose.dsp.yaml - service: dsp-cli-user - -#================================================================ -# Start the COP Web Server -#---------------------------------------------------------------- - cop-web-server: - extends: - file: ./compose/docker-compose.cop-web-server.yaml - #file: ./compose/docker-compose.dsp.yaml - service: cop-web-server - depends_on: - - dsp-db - - dsp - - cop-db - - keycloak - - -#================================================================ -# Start NiFi - EXPERIMENTAL AND NOT YET SUPPORTED -#---------------------------------------------------------------- - nifi: - profiles: [nifi] - extends: - file: ./compose/docker-compose.nifi.yaml - service: nifi - - tagging: - profiles: [nifi] - extends: - file: ./compose/docker-compose.tagging.yaml - service: tagging diff --git a/common-operating-picture/docker-compose.cop.yaml b/common-operating-picture/docker-compose.cop.yaml index ba8fdfe..264e3ab 100644 --- a/common-operating-picture/docker-compose.cop.yaml +++ b/common-operating-picture/docker-compose.cop.yaml @@ -8,7 +8,7 @@ services: extends: file: ./compose/docker-compose.cop-web-server.yaml service: cop-web-server - + #================================================================ # Start the COP database #---------------------------------------------------------------- diff --git a/common-operating-picture/docker-compose.dev.yaml b/common-operating-picture/docker-compose.dev.yaml index 22afaca..f63f8ff 100644 --- a/common-operating-picture/docker-compose.dev.yaml +++ b/common-operating-picture/docker-compose.dev.yaml @@ -36,6 +36,14 @@ services: file: ./compose/docker-compose.cop-db.yaml service: cop-db-setup +#================================================================ +# Start the COP web server (go process + react app) +#---------------------------------------------------------------- + cop-web-server: + extends: + file: ./compose/docker-compose.cop-web-server.yaml + service: cop-web-server + #================================================================ # Start Keycloak #---------------------------------------------------------------- @@ -87,14 +95,14 @@ services: #================================================================ # Start NiFi - EXPERIMENTAL AND NOT YET SUPPORTED #---------------------------------------------------------------- - # nifi: - # profiles: [nifi] - # extends: - # file: ./compose/docker-compose.nifi.yaml - # service: nifi + nifi: + profiles: [nifi] + extends: + file: ./compose/docker-compose.nifi.yaml + service: nifi - # tagging: - # profiles: [nifi] - # extends: - # file: ./compose/docker-compose.tagging.yaml - # service: tagging + tagging: + profiles: [nifi] + extends: + file: ./compose/docker-compose.tagging.yaml + service: tagging diff --git a/common-operating-picture/dsp-cop-main.iml b/common-operating-picture/dsp-cop-main.iml new file mode 100755 index 0000000..f246b67 --- /dev/null +++ b/common-operating-picture/dsp-cop-main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common-operating-picture/dsp.yaml b/common-operating-picture/dsp.yaml index b429fd3..5ed5ee6 100644 --- a/common-operating-picture/dsp.yaml +++ b/common-operating-picture/dsp.yaml @@ -4,10 +4,11 @@ issuerEndpoint: &issuerEndpoint https://local-dsp.virtru.com:8443/auth/realms/op tokenEndpoint: &tokenEndpoint https://local-dsp.virtru.com:8443/auth/realms/opentdf/protocol/openid-connect/token entityResolutionServiceUrl: &entityResolutionServiceUrl https://local-dsp.virtru.com:8080/entityresolution/resolve platformEndoint: &platformEndpoint https://local-dsp.virtru.com:8080 -#taggingEndpoint: &taggingEndpoint localhost:9001 +taggingEndpoint: &taggingEndpoint localhost:9001 mode: all # default mode is all + logger: - level: debug + level: info type: text output: stdout # DB and Server configurations are defaulted for local development @@ -26,6 +27,7 @@ services: privatesignkey: dsp-keys/policyimportexport/cosign.key privatesignkeypassphrasepath: dsp-keys/policyimportexport/cosign.pass truststore: dsp-keys/policyimportexport + kas: keyring: - kid: e1 @@ -82,9 +84,9 @@ services: classifyFlotFormat: '[{classification}][//RELTO {relto}][//NTK {needtoknow}]' services: tagging: - enabled: true #true #false #true + enabled: false #true name: Tagging API - #url: *taggingEndpoint + url: *taggingEndpoint sharepoint: serviceHostName: sharepoint platformEndpoint: *platformEndpoint @@ -113,17 +115,16 @@ services: # usernameRegex: ^(.*)\\(.*)$ services: tagging: - enabled: true #true #false #true + enabled: false #true name: Tagging API - #url: *taggingEndpoint + url: *taggingEndpoint web-admin: enabled: true clientId: dsp-web-admin issuerEndpoint: *issuerEndpoint taggingpdp: - #enabled: true #UNTESTED - configFilePath: dsp.yaml #"samples/tagging-pdp/fed-config.go.yaml" - #tikaServerUrl: "http://localhost:9998" #UNTESTED + configFilePath: "dsp.yaml" + tikaServerUrl: "http://localhost:9998" tdfviewer: platform_endpoint: *platformEndpoint # Server-side decrypt uses client_id and client_secret @@ -212,7 +213,7 @@ server: cors: enabled: true # '*' to allow any origin or a specific domain like 'https://yourdomain.com' - allowedorigins: + allowedorigins: - '*' # List of methods. Examples: 'GET,POST,PUT' allowedmethods: @@ -229,11 +230,11 @@ server: - Content-Type - X-CSRF-Token - virtru-ntdf-version + - connect-protocol-version # List of response headers that browsers are allowed to access exposedheaders: - Link # Sets whether credentials are included in the CORS request allowcredentials: true # Sets the maximum age (in seconds) of a specific CORS preflight request - maxage: 3600 - + maxage: 3600 \ No newline at end of file diff --git a/common-operating-picture/env/default.env b/common-operating-picture/env/default.env index 6b37a3e..29e7d0d 100644 --- a/common-operating-picture/env/default.env +++ b/common-operating-picture/env/default.env @@ -4,7 +4,6 @@ DB_PASSWORD=changeme DB_USERNAME=postgres DB_NAME=postgres - PLATFORM_ENDPOINT=local-dsp.virtru.com:8080 KAS_TDF_URL=https://local-dsp.virtru.com:8080/kas KAS_NANO_URL=https://local-dsp.virtru.com:8080/kas @@ -12,7 +11,7 @@ KAS_NANO_URL=https://local-dsp.virtru.com:8080/kas # NiFi Configuration # Tagging endpoint - using internal docker service name TAGGING_PDP_ENDPOINT=local-dsp.virtru.com:9001 -NIFI_IMAGE=ghcr.io/ttschampel/nifi/nifi-1.25.0-jre17:latest +NIFI_IMAGE:ghcr.io/ttschampel/nifi/nifi-1.25.0-jre17:latest NIFI_CLIENT_ID=opentdf NIFI_CLIENT_SECRET=secret @@ -20,3 +19,5 @@ NIFI_CLIENT_SECRET=secret TAGGING_IMAGE=us-docker.pkg.dev/prj-infra-automation-ktbz/internal/tagging-pdp-grpc:v2.1.1 ENCRYPTED_TOKEN_KEY=49e9a28af998c2678e6651ad4e60a2dbba2f3d284f58b224b3382919c1de7d55 TOKEN_ENDPOINT=https://local-dsp.virtru.com:8443/auth/realms/opentdf/protocol/openid-connect/token + +ENCRYPTED_TOKEN_KEY=”not needed” \ No newline at end of file diff --git a/common-operating-picture/fed-config.go.yaml b/common-operating-picture/fed-config.go.yaml new file mode 100644 index 0000000..028ca41 --- /dev/null +++ b/common-operating-picture/fed-config.go.yaml @@ -0,0 +1,895 @@ +# Virtru Tagging PDP Configuration +# Map and normalize terms extracted from the tag processors + +classificationAttributeFQN: &classificationAttributeFQN "https://demo.com/attr/classification" +needToKnowAttributeFQN: &needToKnowAttributeFQN "https://demo.com/attr/needtoknow" +relToAttributeFQN: &relToAttributeFQN "https://demo.com/attr/relto" +sciAttributeFQN: &sciAttributeFQN "https://demo.com/attr/sci" +coiAttributeFQN: &coiAttributeFQN "https://demo.com/attr/poi" +pcoiAttributeFQN: &pcoiAttributeFQN "https://demo.com/attr/pcoi" + +ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF: &ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF 1 +ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF: &ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF 2 +ATTRIBUTE_RULE_TYPE_ENUM_HIERARCHY: &ATTRIBUTE_RULE_TYPE_ENUM_HIERARCHY 3 + + +#Mappings from STANAG Classifications to IC-EDH enum compatible values +ic-edh-cls-mappings: &ic-edh-cls-mappings + - key: RESTRICTED + value: R + - key: CONFIDENTIAL + value: C + - key: SECRET + value: S + - key: TOP SECRET + value: TS + - key: UNCLASSIFIED + value: U + +resourceMappingSets: + # Entries mapping synonyms to one or more normalized terms. + - id: "classification-dict" + entries: + - terms: ["TS", "TOP SECRET", "TOPSECRET"] + attributevalue: + value: "topsecret" + - terms: ["S", "SECRET", "SEC"] + attributevalue: + value: "secret" + - terms: ["C", "CONFIDENTIAL", "CONTROLLED UNCLASSIFIED", + "OFFICIAL-SENSITIVE", "CUI"] + attributevalue: + value: "confidential" + - terms: ["U", "UNCLASSIFIED", "OFFICIAL"] + attributevalue: + value: "unclassified" + - id: "relto-dict" + entries: + - terms: ["US"] + attributevalue: + value: "USA" + - terms: ["UK"] + attributevalue: + value: "GBR" + - id: "abac-to-snag4774" + entries: + - terms: ["Releasable To"] + attributevalue: + attribute: + fqn: *relToAttributeFQN + - terms: ["TOP SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/topsecret" + - terms: ["SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/secret" + - terms: ["UNCLASSIFIED"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/unclassified" + - terms: ["CONFIDENTIAL"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/confidential" + +icEDHSecAccessMappings: &icEDHSecAccessMappings + # Mapping of EDH Security Access values for ism:classification + - ismAttribute: classification + # Optional Handling Statement Scope: ALL|TOD|PAYL; default=ALL + #scope: + # The tag templates + mappings: + # Optional flag for requiring tag templates have a synonym match. default = false + # synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Mapping of EDH Security Access values for ism:releasableTo + - ismAttribute: releasableTo + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + - ismAttribute: SCIcontrols + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *sciAttributeFQN + - ismAttribute: SARIdentifier + mappings: + delimiters: [ ",",";"," " ] + synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + namespace: *coiAttributeFQN + synonymDictionary: "coi-dict" + - type: "ATTRIBUTE" + namespace: *pcoiAttributeFQN + synonymDictionary: "pcoi-dict" + +snag5636-attributeInputs: &snag5636-attributeInputs + classificationFQN: *classificationAttributeFQN + mapAllAttributeToCategory: false + requireMappedAttributes: false + categoryFQNs: + - *relToAttributeFQN + - *needToKnowAttributeFQN + - *sciAttributeFQN + resourceMappingSet: "abac-to-snag4774" + +ismNamespace: &ismNamespace "urn:us:gov:ic:ism" +agencyNamespace: &agencyNamespace "urn:us:gov:ic:usagency" +arhNamespace: &arhNamespace "urn:us:gov:ic:arh" +edhNamespace: &edhNamespace "urn:us:gov:ic:edh" +icidNamespace: &icidNamespace "urn:us:gov:ic:id" + +# Mapping from STANAG 5636->IC-EDH +stanag-icedh-mappings: &stanag-icedh-mappings + mappingExpressions: + - type: LITERAL + value: "202111" + targets: + - namespace: *edhNamespace + path: "Edh.DESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: *ismNamespace + path: "Edh.DESVersion" + - type: LITERAL + value: "202205" + targets: + - namespace: *ismNamespace + path: "Edh.ISMCATCESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: "urn:us:gov:ic:ntk" + path: "Edh.DESVersion" + - type: LITERAL + value: "202207" + targets: + - namespace: *arhNamespace + path: "Edh.DESVersion" + - namespace: *arhNamespace + path: "Edh.Security.DESVersion" + - type: LITERAL + value: "202100" + targets: + - path: "Edh.DESVersion" + namespace: *icidNamespace + - type: LITERAL + value: "202207" + targets: + - path: "Edh.CESVersion" + namespace: *agencyNamespace + - type: AUTOGENERATED_DATETIME + targets: + - path: "Edh.DataItemCreateDateTime" + - type: JSONPATH + # STANAG confidential label category named Releasable To + value: "$.ocl.cls" + targets: + - path: "Edh.Security.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - path: "Edh.Security.Access.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - type: JSONPATH + # STANAG confidential label category named Releasable -> ism:releasableTo + value: "$.ocl.catl[?(@.name == 'Releasable To')].vals" + targets: + - path: "Edh.Security.Access.releasableTo" + namespace: *ismNamespace + - type: JSONPATH + # STANAG confidential label category named Restricted To Compartments -> ism:SCIControls + value: "$.ocl.catl[?(@.name == 'Restricted To Compartments')].vals" + targets: + - path: "Edh.Security.Access.SCIcontrols" + namespace: *ismNamespace + - type: LITERAL + value: "REL" + targets: + - path: "Edh.Security.Access.disseminationControls" + namespace: *ismNamespace + +# Responsible for consuming input content and extracting content +contentExtractors: + # Processor Type: "tika-content-extraction" processor: loading the + # standard tika content extraction processor + - type: "tika-content-extraction" + id: "std-content-extraction" + ocr: true + tikaServerUrl: "http://localhost:9998" + # tikaClientTimeout: "30s" #configure the timeout for the http client that calls tika + # Processor Type: "titus-metadata" processor: Introspects Content + # metadata for base64 encoded Titus Metadata (JSON) + - type: "titus-metadata" + id: "titus-metadata-extractor-email" + metadataKeys: + - "Message:Raw-Header:x-titus-metadata-40" + +# Creates tags from extracted content. e.g. regex: Produce tags based on +# regex matching. Each processor in the flow is identified by standard +# configuration properties: +# id: unique ID of the processor, used primarily in provenance tracking +# type: a well known type used to discover the processor at runtime. +# The discovery process first checks for well known standard +# processors then falls back to processor discovery using +# META-INF/taggingproviders and processor specific configuration. +tagExtractionRules: + # The TDF ZIP attribute extractor + - id: "tdf3" + type: "tdf3-tag-processor" + # The TDF XML attribute extractor + - id: "tdfxml_extraction" + type: "tdfxml" + ztdfClassificationTemplate: + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + ztdfRelToTemplate: + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + ictdfEDHSecAccessMappings: *icEDHSecAccessMappings + - id: "ic-edh-processor" + type: "ic-edh" + icEDHSecAccessMappings: *icEDHSecAccessMappings + icEDHSecMappings: *icEDHSecAccessMappings + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'classification' property (x-bj_classification) from email headers + - id: "xheader_bj_classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key value + # having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # Process metadata values based on key match of the following regex + - keyRegex: >- + (?i)x-bj_classification + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?:\W*(?:([A-Z- ]+)(?:[\W]+|$)))* + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'releasability' property (x-bj_releasability) from email headers + - id: "xheader_bj_releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key + # value having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # only process metadata values based on key match of the + # following regex + - keyRegex: >- + (?i)x-bj_releasability + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b[A-Z]{2,4}\b(?:[ ,]+\b[A-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-banners tag processor is used to parse single line + # banner type classifications + - id: "classification-banners" + desc: "Extract Classification, Need to Know and Releasability Tags" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i)(TOP SECRET|TOPSECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)[\W]*(\b(?:[/ ]?\b[a-zA-Z]{2,4}\b)*)(?:[\W]+Rel(?:easable)?[\W]*(?:To)?)[\W]*(\b[a-zA-Z]{2,4}\b(?:[ ,]+\b[a-zA-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # For Capture Group 2 create both a TDF Attribute and TDF Assertion. + - group: "2" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " ", "/"] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *needToKnowAttributeFQN + # For Capture Group 3 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "3" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-only-banners tag processor is used to parse + # Classification only banners + - id: "classification-only-banners" + desc: "Extract Classification Only Tags" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: FIRST_LINE + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + \b(?i)(TOP SECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)(\W+|$) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Classification tag processor is used to parse + # Classification from Alternate Data Stream + - id: "Alternate Data Stream Classification" + desc: "Read alternate data stream Classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Releasability tag processor is used to parse + # Releasability from Alternate Data Stream + - id: "Alternate Data Stream Releasability" + desc: "Read alternate data stream Releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The titus-classification-markings tag processor is used to parse + # Titus classification markings + - id: "titus-classification-markings" + desc: "Map titus classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The titus-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "titus-releasability-markings" + desc: "Map titus releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The boldonJames-classification-markings tag processor is used to parse + # Titus classification markings + - id: "boldonJames-classification-markings" + desc: "Map boldonJames classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The boldonJames-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "boldonJames-releasability-markings" + desc: "Map boldonJames releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" +tagProcessors: + # This is the standard type for the required tag processor. + - type: required-tags + id: "missing required tag" + # The tag type used when generating a new tag missing values + tagType: "MISSING_REQUIRED_TAG" + # The processing scope. ITEM or GLOBAL. Default is ITEM. + # ITEM Scope = tags must exist across all content items + processingScope: GLOBAL + # The namespaces of the required tags + requiredNamespaces: [*classificationAttributeFQN, + *relToAttributeFQN] + # Content types should have metadata treated as a separate input requirement + requireMetadataTypes: ["message/rfc822"] + # Dynamic value that's injected. + tagValue: "virtru:block" + - id: "test tag mismatch between tags in an (email body or header) and an email attachment" + type: tag-mismatch + inputs: + # Any type, any value, Has source from email header OR an email body + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822"] + itemIdRegex: >- + Message:Raw-Header + - itemTypes: ["message/rfc822"] + # Any tag from an email attachment + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822.attachment"] + tagTemplate: + value: "virtru:warn" + type: "tag-mismatch" + +# Reduces tag set +rollupRules: + # Processor Type: "std-rollup" processor: + # - Rolls up tags based on attribute definitions + # - Rolls up restrictive ("allOf") tags across all content sources as a "union". + # - Rolls up permissive ("anyOf") tags across all content sources as an "intersection"; Optional group aliases are used here. + # - Rolls up "hierarchy" tags using a "High Watermark" approach. + # - Case-insensitive matching on attribute values. Case is corrected when attribute definitions exists for the given tag value + # - Values not matching an attribute definition are allowed to pass through (default behavior) + + - type: "std-rollup" + id: "standard rollup" + # Treat items of type "message/rfc822" (email) message metadata as a separate bucket of content + metadataItemTypes: ["message/rfc822"] + # Should intra-content items be rolled up - default is false + intraContentRollup: true + # aliasRollupMode: 3 options Control mode for handling aliases + # - BOTH = Default, both an alias and its members are kept after rollup rules are applied + # - ALIAS = only the alias value is kept and members are dropped after rollup rules are applied. Only if all members are present for the alias + # - MEMBER = drops an alias value if all member values are present. + aliasRollupMode: ALIAS + # Require a rollup alias to appear at least once in the intersected value list - default = false + requireAliasInValues: false + # Control behavior when ANYOF attributes have no intersection across content items + # - true: Return an error when no intersection exists + # - false: (default) Allow operation to continue (may inject null value if InjectMissingIntersectionAttribute is true) + # errorOnEmptyIntersection: true + # Whether to inject a null value when no intersection exists (default = true for backward compatibility) + # injectMissingIntersectionAttribute: true + # The value to inject when no intersection exists (default = "null") + # missingIntersectionAttributeValue: "null" + # Group aliases + attributeValueMembers: + - value: + fqn: "https://demo.com/attr/relto/value/FVEY" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "NZL" + - value: "CAN" + - value: + fqn: "https://demo.com/attr/relto/value/PINK" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "CAN" + - value: "NZL" + - value: "BEL" + - value: "DNK" + - value: "FRA" + - value: "ITA" + - value: "NOR" + - value: "PRT" + - value: "HRV" + - value: "CZE" + - value: "POL" + - value: "ROU" + - value: "DEU" + - value: "ESP" + - value: "TUR" + - value: "SWE" + - value: "FIN" + - value: "AUT" + + - value: + fqn: "https://demo.com/attr/relto/value/NATO" + members: + - value: "ALB" + - value: "BEL" + - value: "BGR" + - value: "CAN" + - value: "HRV" + - value: "CZE" + - value: "DNK" + - value: "EST" + - value: "FRA" + - value: "DEU" + - value: "GRC" + - value: "HUN" + - value: "ISL" + - value: "ITA" + - value: "LVA" + - value: "LTU" + - value: "LUX" + - value: "MNE" + - value: "NLD" + - value: "MKD" + - value: "NOR" + - value: "POL" + - value: "PRT" + - value: "ROU" + - value: "SVK" + - value: "SVN" + - value: "ESP" + - value: "TUR" + - value: "GBR" + - value: "USA" + + attributeDefs: &rollup_attribute_defs + - namespace: + fqn: "https://demo.com" + name: "classification" + rule: *ATTRIBUTE_RULE_TYPE_ENUM_HIERARCHY + values: + - value: "topsecret" + - value: "secret" + - value: "confidential" + - value: "unclassified" + - namespace: + fqn: "https://demo.com" + name: "needToKnow" + rule: *ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF + values: + - value: INT + - value: OPS + - namespace: + fqn: "https://demo.com" + name: "relto" + fqn: "https://demo.com/attr/relto" + rule: *ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF + values: + - value: "USA" + - value: "GBR" + - value: "CAN" + - value: "AUS" + - value: "NZL" + - value: "FRA" + - value: "UKR" + - value: "FVEY" + - value: "NATO" + - value: "PINK" + - value: "DEU" + - value: "FIN" + - value: "CZE" + - value: "DNK" + - value: "FRA" + - value: "DEU" + - value: "GRC" + - value: "HUN" + - value: "ISL" + - value: "ITA" + - value: "LUX" + - value: "NLD" + - value: "NOR" + - value: "POL" + - value: "PRT" + - value: "ESP" + - value: "TUR" + - value: "BGR" + - value: "EST" + - value: "LVA" + - value: "LTU" + - value: "ROU" + - value: "SVK" + - value: "SVN" + - value: "BEL" + - value: "HRV" + - value: "SWE" + - value: "AUT" + - value: "ALB" + - value: "MNE" + - value: "MKD" + + # Link non attributes to attributes for rollup + tagLinks: + - src: "Classification" + target: *classificationAttributeFQN + - src: "needToKnow" + target: *needToKnowAttributeFQN + - src: "releasableTo" + target: *relToAttributeFQN + + # Processor Type: "drop-duplicates" processor: Merges duplicate tags + - type: "drop-duplicates" + id: "drop duplicate values" + - type: stanag5636-assertions + id: "urn:nato:stanag:5636:A:1:elements:json" + assertionType: "urn:nato:stanag:5636:A:1:elements:json" + assertionFormat: "json+stanag5636" + attributeInputs: *snag5636-attributeInputs + icedhAssertionType: *edhNamespace + # Validation ~ min required metadata fields + requiredMetadata: + name: "fvey-minimum-metadata-example" + jsonPathExpressions: + # require a "releasable to" conf. label category + - "$.ocl.catl[?(@.name == 'Releasable To')]" + # require policy identifier + - "$.ocl.pol" + # require classification + - "$.ocl.cls" + # require date created + - "$.ocl.dcr" + attributeDefs: *rollup_attribute_defs + + - type: icedh-assertions + id: *edhNamespace + assertionType: *edhNamespace + assertionFormat: "ic-edh+xml" + # generate assertion only when requested + requireAssertionOption: true + mappings: *stanag-icedh-mappings diff --git a/common-operating-picture/go.mod b/common-operating-picture/go.mod index 32ea4bf..1db3c75 100644 --- a/common-operating-picture/go.mod +++ b/common-operating-picture/go.mod @@ -238,7 +238,7 @@ require ( golang.org/x/term v0.37.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/api v0.221.0 // indirect - google.golang.org/grpc v1.71.1 // indirect + google.golang.org/grpc v1.71.1 gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/api v0.28.3 // indirect diff --git a/common-operating-picture/go.sum b/common-operating-picture/go.sum index 1236243..6a555c4 100644 --- a/common-operating-picture/go.sum +++ b/common-operating-picture/go.sum @@ -183,6 +183,8 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/brianvoe/gofakeit/v7 v7.0.4 h1:Mkxwz9jYg8Ad8NvT9HA27pCMZGFQo08MK6jD0QTKEww= github.com/brianvoe/gofakeit/v7 v7.0.4/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= +github.com/bufbuild/connect-go v1.10.0 h1:QAJ3G9A1OYQW2Jbk3DeoJbkCxuKArrvZgDt47mjdTbg= +github.com/bufbuild/connect-go v1.10.0/go.mod h1:CAIePUgkDR5pAFaylSMtNK45ANQjp9JvpluG20rhpV8= github.com/bufbuild/protovalidate-go v0.6.2 h1:U/V3CGF0kPlR12v41rjO4DrYZtLcS4ZONLmWN+rJVCQ= github.com/bufbuild/protovalidate-go v0.6.2/go.mod h1:4BR3rKEJiUiTy+sqsusFn2ladOf0kYmA2Reo6BHSBgQ= github.com/buildkite/agent/v3 v3.92.1 h1:6HLdDbU5z6ZyJ3TCt/UQEcLv2nhg/gdS4ApnsrUwhOE= diff --git a/common-operating-picture/package-lock.json b/common-operating-picture/package-lock.json new file mode 100644 index 0000000..a666578 --- /dev/null +++ b/common-operating-picture/package-lock.json @@ -0,0 +1,195 @@ +{ + "name": "cop_internal_me", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@bufbuild/protobuf": "^2.10.0", + "@opentdf/sdk": "^0.4.0" + }, + "devDependencies": { + "@bufbuild/protoc-gen-es": "^2.10.0", + "ts-protoc-gen": "^0.15.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.0.tgz", + "integrity": "sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==" + }, + "node_modules/@bufbuild/protoc-gen-es": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-2.10.0.tgz", + "integrity": "sha512-g3xtuxeMkbacn8/qWQ8NbHBA8unLAvGD7sjcXV1/lfO4iCfd6hYL1Z+rn2yLQZE/JEkG+GPZoIs7m5KI5VYaMw==", + "dev": true, + "dependencies": { + "@bufbuild/protobuf": "2.10.0", + "@bufbuild/protoplugin": "2.10.0" + }, + "bin": { + "protoc-gen-es": "bin/protoc-gen-es" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@bufbuild/protobuf": "2.10.0" + }, + "peerDependenciesMeta": { + "@bufbuild/protobuf": { + "optional": true + } + } + }, + "node_modules/@bufbuild/protoplugin": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-2.10.0.tgz", + "integrity": "sha512-GPJOZ1Gp9/Ci3MXP3yI7+q4G7IhB5cSpbLjsfnBILxtNx69I9+ix3r9P7JfewHvqMjtPe6L+YWX1LPBGNfZMGw==", + "dev": true, + "dependencies": { + "@bufbuild/protobuf": "2.10.0", + "@typescript/vfs": "^1.5.2", + "typescript": "5.4.5" + } + }, + "node_modules/@connectrpc/connect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.1.0.tgz", + "integrity": "sha512-xhiwnYlJNHzmFsRw+iSPIwXR/xweTvTw8x5HiwWp10sbVtd4OpOXbRgE7V58xs1EC17fzusF1f5uOAy24OkBuA==", + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0" + } + }, + "node_modules/@connectrpc/connect-web": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-2.1.0.tgz", + "integrity": "sha512-4IBFeMeXS1RVtmmFE/MwH+vWq/5vDRKys70va+DAaWDh83Rdy0iUQOJbITUDzvonlY5as3vwfs5yy9Yp2miHSw==", + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0", + "@connectrpc/connect": "2.1.0" + } + }, + "node_modules/@opentdf/sdk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentdf/sdk/-/sdk-0.4.0.tgz", + "integrity": "sha512-tP28IZFWukne0K6aUEcDf23x5nfB7X4+eGu9izGkaBy74I6GNBp5kAHTBYOOHs0gH72liI7fyQU01NKGjdw0pw==", + "dependencies": { + "@connectrpc/connect": "^2.0.2", + "@connectrpc/connect-web": "^2.0.2", + "buffer-crc32": "^1.0.0", + "dpop": "^1.4.1", + "jose": "^6.0.8", + "json-canonicalize": "^1.0.6", + "uuid": "~11.1.0" + } + }, + "node_modules/@typescript/vfs": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz", + "integrity": "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dpop": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dpop/-/dpop-1.4.1.tgz", + "integrity": "sha512-+Cus+OlLk9uFWbPZX/RsLpMviYAmyJpJpooto2NDQ0lnk0/S2TblPunC4nVtETOxCIsXvu4YILIOPC7LIHHXIg==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", + "dev": true + }, + "node_modules/jose": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.0.tgz", + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-canonicalize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/json-canonicalize/-/json-canonicalize-1.2.0.tgz", + "integrity": "sha512-TTdjBvqrqJKSADlEsY5rWbx8/1tOrVlTR/aSLU8N2VSInCTffP0p+byYB8Es+OmL4ZOeEftjUdvV+eJeSzJC/Q==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/ts-protoc-gen": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.15.0.tgz", + "integrity": "sha512-TycnzEyrdVDlATJ3bWFTtra3SCiEP0W0vySXReAuEygXCUr1j2uaVyL0DhzjwuUdQoW5oXPwk6oZWeA0955V+g==", + "dev": true, + "dependencies": { + "google-protobuf": "^3.15.5" + }, + "bin": { + "protoc-gen-ts": "bin/protoc-gen-ts" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + } + } +} diff --git a/common-operating-picture/package.json b/common-operating-picture/package.json new file mode 100644 index 0000000..5026b92 --- /dev/null +++ b/common-operating-picture/package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "@bufbuild/protobuf": "^2.10.0", + "@opentdf/sdk": "^0.4.0" + }, + "devDependencies": { + "@bufbuild/protoc-gen-es": "^2.10.0", + "ts-protoc-gen": "^0.15.0" + } +} diff --git a/common-operating-picture/pkg/activeClients/activeClient.go b/common-operating-picture/pkg/activeClients/activeClient.go index 04ca3a6..4583183 100644 --- a/common-operating-picture/pkg/activeClients/activeClient.go +++ b/common-operating-picture/pkg/activeClients/activeClient.go @@ -1,29 +1,71 @@ package activeclients import ( + "fmt" "sync" "connectrpc.com/connect" + tdf_notev1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1" tdf_objectv1 "github.com/virtru-corp/dsp-cop/api/proto/tdf_object/v1" ) +// Stream interface that can be used by both TdfObjectStream and TdfNoteStream +type Stream interface { + Send(message interface{}) error +} + +// Wrapper for tdf_object stream +type TdfObjectStream struct { + stream *connect.ServerStream[tdf_objectv1.StreamTdfObjectsResponse] +} + +func (s *TdfObjectStream) Send(message interface{}) error { + if m, ok := message.(*tdf_objectv1.StreamTdfObjectsResponse); ok { + return s.stream.Send(m) + } + return fmt.Errorf("invalid message type for TdfObjectStream") +} + +// Wrapper for tdf_note stream +type TdfNoteStream struct { + stream *connect.ServerStream[tdf_notev1.StreamTdfNotesResponse] +} + +func (s *TdfNoteStream) Send(message interface{}) error { + if m, ok := message.(*tdf_notev1.StreamTdfNotesResponse); ok { + return s.stream.Send(m) + } + return fmt.Errorf("invalid message type for TdfNoteStream") +} + +// ActiveClient represents a client that can either stream tdf_objects or tdf_notes type ActiveClient struct { id string peer connect.Peer - stream *connect.ServerStream[tdf_objectv1.StreamTdfObjectsResponse] + stream Stream } +// ActiveClients holds the list of active clients type ActiveClients struct { lock sync.Mutex clients []ActiveClient } +// Add a new TDF object client func (ac *ActiveClients) Add(id string, peer connect.Peer, stream *connect.ServerStream[tdf_objectv1.StreamTdfObjectsResponse]) { ac.lock.Lock() defer ac.lock.Unlock() - ac.clients = append(ac.clients, ActiveClient{id, peer, stream}) + ac.clients = append(ac.clients, ActiveClient{id, peer, &TdfObjectStream{stream}}) +} + +// AddNote adds a new TDF note client +func (ac *ActiveClients) AddNote(id string, peer connect.Peer, stream *connect.ServerStream[tdf_notev1.StreamTdfNotesResponse]) { + ac.lock.Lock() + defer ac.lock.Unlock() + ac.clients = append(ac.clients, ActiveClient{id, peer, &TdfNoteStream{stream}}) } +// Remove a client by ID func (ac *ActiveClients) Remove(id string) { ac.lock.Lock() defer ac.lock.Unlock() @@ -35,6 +77,7 @@ func (ac *ActiveClients) Remove(id string) { } } +// Get a client by ID func (ac *ActiveClients) Get(id string) *ActiveClient { for _, c := range ac.clients { if c.id == id { @@ -44,6 +87,7 @@ func (ac *ActiveClients) Get(id string) *ActiveClient { return nil } +// Emit sends an event to a specific client func (ac *ActiveClients) Emit(id string, event tdf_objectv1.StreamEventType, detail string) { c := ac.Get(id) if c != nil { @@ -54,12 +98,14 @@ func (ac *ActiveClients) Emit(id string, event tdf_objectv1.StreamEventType, det } } -func (ac *ActiveClients) broadcast(msg *tdf_objectv1.StreamTdfObjectsResponse) { +// broadcast sends a message to all connected clients +func (ac *ActiveClients) broadcast(msg interface{}) { for _, c := range ac.clients { c.stream.Send(msg) } } +// Shutdown sends a shutdown event to all clients func (ac *ActiveClients) Shutdown() { ac.broadcast(&tdf_objectv1.StreamTdfObjectsResponse{ EventType: tdf_objectv1.StreamEventType_STREAM_EVENT_TYPE_SHUTDOWN, @@ -67,6 +113,7 @@ func (ac *ActiveClients) Shutdown() { }) } +// Broadcast sends an event to all clients func (ac *ActiveClients) Broadcast(event tdf_objectv1.StreamEventType, detail string) { ac.broadcast(&tdf_objectv1.StreamTdfObjectsResponse{ EventType: event, @@ -74,9 +121,18 @@ func (ac *ActiveClients) Broadcast(event tdf_objectv1.StreamEventType, detail st }) } +// BroadcastTdfObjects sends new TDF objects to all clients func (ac *ActiveClients) BroadcastTdfObjects(objs []*tdf_objectv1.TdfObject) { ac.broadcast(&tdf_objectv1.StreamTdfObjectsResponse{ EventType: tdf_objectv1.StreamEventType_STREAM_EVENT_TYPE_TDF_OBJECTS_NEW, TdfObjects: objs, }) } + +// BroadcastTdfNotes sends new TDF notes to all clients +func (ac *ActiveClients) BroadcastTdfNotes(notes []*tdf_notev1.TdfNote) { + ac.broadcast(&tdf_notev1.StreamTdfNotesResponse{ + EventType: tdf_notev1.StreamEventType_STREAM_EVENT_TYPE_TDF_NOTES_NEW, + TdfNotes: notes, + }) +} diff --git a/common-operating-picture/pkg/config/config.go b/common-operating-picture/pkg/config/config.go index 974693d..eafb32d 100644 --- a/common-operating-picture/pkg/config/config.go +++ b/common-operating-picture/pkg/config/config.go @@ -55,7 +55,7 @@ type Config struct { //////////////////////// //// Optional //////////////////////// - LogLevel string `mapstructure:"log_level" default:"INFO"` + LogLevel string `mapstructure:"log_level" default:"DEBUG"` Service struct { // The public host and port is used by the web interface to connect to the server. In many diff --git a/common-operating-picture/pkg/logger/logger.go b/common-operating-picture/pkg/logger/logger.go index b00c19b..f0f7f65 100644 --- a/common-operating-picture/pkg/logger/logger.go +++ b/common-operating-picture/pkg/logger/logger.go @@ -11,7 +11,7 @@ var logger *slog.Logger func init() { handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ - Level: slog.LevelInfo, + Level: slog.LevelDebug, }) logger = slog.New(handler) diff --git a/common-operating-picture/pkg/util/tdfObjectSearchAttributes.go b/common-operating-picture/pkg/util/tdfObjectSearchAttributes.go index 031f2f2..ae74b07 100644 --- a/common-operating-picture/pkg/util/tdfObjectSearchAttributes.go +++ b/common-operating-picture/pkg/util/tdfObjectSearchAttributes.go @@ -1,7 +1,33 @@ package util +import "encoding/json" + +// StringOrArray is a custom type that can unmarshal from either a JSON string or a JSON array of strings +type StringOrArray []string + +func (s *StringOrArray) UnmarshalJSON(data []byte) error { + // Try to unmarshal as a string first + var str string + if err := json.Unmarshal(data, &str); err == nil { + if str != "" { + *s = []string{str} + } else { + *s = []string{} + } + return nil + } + + // If that fails, try to unmarshal as an array of strings + var arr []string + if err := json.Unmarshal(data, &arr); err != nil { + return err + } + *s = arr + return nil +} + type TDFObjectSearchAttributes struct { - Classification []string `json:"attrClassification,omitempty"` - NeedToKnow []string `json:"attrNeedToKnow,omitempty"` - RelTo []string `json:"attrRelTo,omitempty"` + Classification StringOrArray `json:"attrClassification,omitempty"` + NeedToKnow StringOrArray `json:"attrNeedToKnow,omitempty"` + RelTo StringOrArray `json:"attrRelTo,omitempty"` } diff --git a/common-operating-picture/proto/tdf_note/v1/tdf_note.proto b/common-operating-picture/proto/tdf_note/v1/tdf_note.proto new file mode 100644 index 0000000..4725416 --- /dev/null +++ b/common-operating-picture/proto/tdf_note/v1/tdf_note.proto @@ -0,0 +1,106 @@ +syntax = "proto3"; + +package tdf_notes.v1; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/virtru-corp/dsp-cop/api/proto/tdf_note/v1;tdf_notev1"; + +// The StreamEventType enum is reused from the previous schema +enum StreamEventType { + STREAM_EVENT_TYPE_UNSPECIFIED = 0; + + // system events + STREAM_EVENT_TYPE_STARTUP = 1; + STREAM_EVENT_TYPE_SHUTDOWN = 2; + STREAM_EVENT_TYPE_RESTART = 3; + STREAM_EVENT_TYPE_MAINTENANCE = 4; + + // data events + STREAM_EVENT_TYPE_CONNECTED = 5; + STREAM_EVENT_TYPE_HEARTBEAT = 6; + + // generic events + STREAM_EVENT_TYPE_GENERIC_ERROR = 10; + STREAM_EVENT_TYPE_SERVER_ERROR = 11; + STREAM_EVENT_TYPE_DATA_ERROR = 12; + + // tdf_notes stream events + STREAM_EVENT_TYPE_TDF_NOTES_NEW = 20; +} + +// Represents a note associated with a TDF object +message TdfNote { + string id = 1; // Unique identifier for the note + google.protobuf.Timestamp ts = 2; // Timestamp of the note creation + string parent_id = 3; // Parent TDF object ID (foreign key to tdf_objects) + string search = 4; // Plaintext JSON search index for searching notes + bytes tdf_blob = 5; // Binary TDF data for the note + string tdf_uri = 6; // URI pointing to the note data + google.protobuf.Timestamp _created_at = 7; // Timestamp of when the note was created + string _created_by = 8; // Who created the note +} + +// Request message for creating a new note +message CreateTdfNoteRequest { + string parent_id = 1; // Parent TDF object ID (foreign key to tdf_objects) + string search = 2; // Plaintext JSON search index for searching notes + bytes tdf_blob = 3; // Binary TDF data for the note + string tdf_uri = 4; // URI pointing to the note data + google.protobuf.Timestamp ts = 5; // Timestamp of the note +} + +// Response message for creating a new note +message CreateTdfNoteResponse { + string id = 1; // Unique identifier of the newly created note +} + +// Request message to retrieve a note by ID +message GetTdfNoteRequest { + string id = 1; // The ID of the note to retrieve +} + +// Response message for retrieving a note by ID +message GetTdfNoteResponse { + TdfNote tdf_note = 1; // The note object +} + +// Request message for querying notes associated with a TDF object +message QueryTdfNotesRequest { + string parent_id = 1; // Parent TDF object ID (foreign key to tdf_objects) + google.protobuf.Timestamp start_ts = 2; // Start timestamp for querying notes + google.protobuf.Timestamp end_ts = 3; // End timestamp for querying notes + string search = 4; // Search query for filtering notes +} + +// Response message for querying notes associated with a TDF object +message QueryTdfNotesResponse { + repeated TdfNote tdf_notes = 1; // List of notes associated with the parent TDF object +} +message StreamTdfNotesRequest { + // todo: intentionally left empty until we decide if any filtering needs to be done +} + +// Stream response for streaming note events (similar to streaming TDF objects) +message StreamTdfNotesResponse { + StreamEventType event_type = 1; // Type of stream event (e.g., new note) + string event_detail = 2; // Details about the event + reserved 3, 4, 5; // Reserved fields for future events + + repeated TdfNote tdf_notes = 6; // List of notes being streamed +} + +// Service definition for handling TDF notes +service TdfNoteService { + // RPC for creating a new TDF note + rpc CreateTdfNote(CreateTdfNoteRequest) returns (CreateTdfNoteResponse); + + // RPC for retrieving a TDF note by ID + rpc GetTdfNote(GetTdfNoteRequest) returns (GetTdfNoteResponse); + + // RPC for querying notes associated with a TDF object + rpc QueryTdfNotes(QueryTdfNotesRequest) returns (QueryTdfNotesResponse); + + // RPC for streaming TDF notes (e.g., for real-time updates) + rpc StreamTdfNotes(StreamTdfNotesRequest) returns (stream StreamTdfNotesResponse); +} diff --git a/common-operating-picture/proto/tdf_object/v1/tdf_object.proto b/common-operating-picture/proto/tdf_object/v1/tdf_object.proto index 27ddd7d..afa202b 100644 --- a/common-operating-picture/proto/tdf_object/v1/tdf_object.proto +++ b/common-operating-picture/proto/tdf_object/v1/tdf_object.proto @@ -5,6 +5,7 @@ package tdf_object.v1; import "buf/validate/validate.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; +import "google/protobuf/wrappers.proto"; option go_package = "github.com/virtru-corp/dsp-cop/api/proto/tdf_object/v1;tdf_objectv1"; @@ -40,10 +41,12 @@ message TdfObject { string geo = 4; // plaintext json search index string search = 5; + // plaintext json metadata index + string metadata = 6; // tdf bytes - bytes tdf_blob = 6; + bytes tdf_blob = 7; // tdf data uri - string tdf_uri = 7; + string tdf_uri = 8; } message SrcTypeUiSchemaFieldConfig { @@ -102,18 +105,43 @@ message CreateTdfObjectRequest { string geo = 2; // plaintext json search index string search = 3; + // plaintext json metadata index + string metadata = 4; // tdf bytes - bytes tdf_blob = 4; + bytes tdf_blob = 5; // tdf data uri - string tdf_uri = 5; + string tdf_uri = 6; // timestamp of data - google.protobuf.Timestamp ts = 6; + google.protobuf.Timestamp ts = 7; } message CreateTdfObjectResponse { string id = 1; } +// Uses wrappers to enable optional fields +message UpdateTdfObjectRequest { + string id = 1 [(buf.validate.field).required = true]; + // source type of data (MARS? what else?) + google.protobuf.StringValue src_type = 2; + // geospatial data of location of data + google.protobuf.StringValue geo = 3; + // plaintext json search index + google.protobuf.StringValue search = 4; + // plaintext json metadata index + google.protobuf.StringValue metadata = 5; + // tdf bytes + google.protobuf.BytesValue tdf_blob = 6; + // tdf data uri + google.protobuf.StringValue tdf_uri = 7; + // timestamp of data + google.protobuf.Timestamp ts = 8; +} + +message UpdateTdfObjectResponse { + string id = 1; +} + message GetTdfObjectRequest { string id = 1 [(buf.validate.field).required = true]; } @@ -127,6 +155,7 @@ message QueryTdfObjectsRequest { string src_type = 2 [(buf.validate.field).required = true]; string geo_location = 3; string search = 4; + string metadata = 5; } message QueryTdfObjectsResponse { @@ -169,6 +198,7 @@ message GetEntitlementsResponse { service TdfObjectService { rpc CreateTdfObject(CreateTdfObjectRequest) returns (CreateTdfObjectResponse) {} + rpc UpdateTdfObject(UpdateTdfObjectRequest) returns (UpdateTdfObjectResponse) {} rpc GetTdfObject(GetTdfObjectRequest) returns (GetTdfObjectResponse) {} rpc QueryTdfObjects(QueryTdfObjectsRequest) returns (QueryTdfObjectsResponse) {} rpc StreamTdfObjects(StreamTdfObjectsRequest) returns (stream StreamTdfObjectsResponse) {} diff --git a/common-operating-picture/requirements.txt b/common-operating-picture/requirements.txt new file mode 100644 index 0000000..036dabc --- /dev/null +++ b/common-operating-picture/requirements.txt @@ -0,0 +1,17 @@ +appdirs==1.4.4 +Faker==38.2.0 +geopy==2.4.1 +minio==7.2.20 +otdf-python==0.4.0 +pandas==2.3.3 +pip==25.3 +pip_system_certs==5.3 +protogen==0.3.1 +psycopg2-binary==2.9.11 +pyarrow==22.0.0 +python-dotenv==1.2.1 +python_opensky==1.0.1 +shapely==2.1.2 +SQLAlchemy==2.0.44 +tqdm==4.67.1 +trino==0.336.0 diff --git a/common-operating-picture/sample.federal_policy.yaml b/common-operating-picture/sample.federal_policy.yaml index 0e03fa2..096d1d6 100644 --- a/common-operating-picture/sample.federal_policy.yaml +++ b/common-operating-picture/sample.federal_policy.yaml @@ -289,56 +289,67 @@ subject_mappings: subject_condition_set_name: scs_clearance_topsecret actions: - DECRYPT + - READ sm_classification_secret: attribute_value: demo.com/attr/classification/value/secret subject_condition_set_name: scs_clearance_secret actions: - DECRYPT + - READ sm_classification_confidential: attribute_value: demo.com/attr/classification/value/confidential subject_condition_set_name: scs_clearance_confidential actions: - DECRYPT + - READ sm_classification_unclassified: attribute_value: demo.com/attr/classification/value/unclassified subject_condition_set_name: scs_clearance_unclassified actions: - DECRYPT + - READ sm_needtoknow_aaa: attribute_value: demo.com/attr/needtoknow/value/aaa subject_condition_set_name: scs_needtoknow_aaa actions: - DECRYPT + - READ sm_needtoknow_bbb: attribute_value: demo.com/attr/needtoknow/value/bbb subject_condition_set_name: scs_needtoknow_bbb actions: - DECRYPT + - READ sm_needtoknow_int: attribute_value: demo.com/attr/needtoknow/value/int subject_condition_set_name: scs_needtoknow_int actions: - DECRYPT + - READ sm_needtoknow_ops: attribute_value: demo.com/attr/needtoknow/value/ops subject_condition_set_name: scs_needtoknow_ops actions: - DECRYPT + - READ sm_nationality_group_PINK: attribute_value: demo.com/attr/relto/value/pink subject_condition_set_name: scs_nationality_group_PINK actions: - DECRYPT + - READ sm_nationality_group_NATO: attribute_value: demo.com/attr/relto/value/nato subject_condition_set_name: scs_nationality_group_NATO actions: - DECRYPT + - READ sm_nationality_group_FVEY: attribute_value: demo.com/attr/relto/value/fvey subject_condition_set_name: scs_nationality_group_FVEY actions: - DECRYPT + - READ sm_nationality_AFG: template: template_relto_one_nationality @@ -1044,6 +1055,7 @@ subject_mapping_templates: attribute_value: demo.com/attr/relto/value/{{ value }} actions: - DECRYPT + - READ subject_condition_set_new: subject_sets: - condition_groups: diff --git a/common-operating-picture/seed_data.py b/common-operating-picture/seed_data.py new file mode 100644 index 0000000..fa27de8 --- /dev/null +++ b/common-operating-picture/seed_data.py @@ -0,0 +1,229 @@ +import os +import uuid +import json +import random +import psycopg2 +import argparse +from io import BytesIO +from faker import Faker +from datetime import datetime, timedelta +from psycopg2.extras import execute_batch +from otdf_python.sdk_builder import SDKBuilder +from otdf_python.config import NanoTDFConfig, KASInfo + +# --- DB Configs --- +DB_NAME = "postgres" +DB_USER = "postgres" +DB_PASSWORD = "changeme" +DB_HOST = "localhost" +DB_PORT = 15432 +NUM_RECORDS = 50 +BATCH_SIZE = 10 + +# --- Fixed Data for TdfObjects --- +FIXED_SRC_TYPE = 'vehicles' +FIXED_TDF_URI = None +FIXED_CREATED_BY = 'seed_script' + +# --- TdfBlob Configs --- +PLATFORM_ENDPOINT = "https://local-dsp.virtru.com:8080" +CLIENT_ID = "opentdf" +CLIENT_SECRET = "secret" + +CLASSIFICATIONS = ["unclassified", "confidential", "secret", "topsecret"] + +# --- DSP Configs --- +CA_CERT_PATH = "./dsp-keys/rootCA.pem" +ISSUER_ENDPOINT = "https://local-dsp.virtru.com:8443/auth/realms/opentdf" + +# --- Delete Statement --- +DELETE_SQL = "DELETE FROM tdf_objects WHERE src_type = %s" + +# --- Insert Statement --- +INSERT_SQL = """ +INSERT INTO tdf_objects ( + id, + ts, + src_type, + geo, + search, + metadata, + tdf_blob, + tdf_uri, + _created_at, + _created_by +) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) +""" +def get_sdk_instance(platform_endpoint, client_id, client_secret, ca_cert_path, issuer_endpoint): + builder = SDKBuilder() + builder.set_platform_endpoint(platform_endpoint) + builder.client_secret(client_id, client_secret) + builder.cert_paths = ca_cert_path + builder.use_insecure_skip_verify(False) + return builder.build() + +def encrypt_data(sdk, plaintext: str , attributes: list[str]) -> bytes: + """Encrypts a string payload using the TDF SDK.""" + #print(f"Creating TDF configuration with attributes: {attributes}") + target_kas_url = "https://local-dsp.virtru.com:8080/kas" + # Create the KASInfo object + kas_info = KASInfo(url=target_kas_url) + + config = NanoTDFConfig( + attributes=attributes, + ecc_mode="secp256r1", + kas_info_list=[kas_info] + ) + + # Convert the plaintext JSON string to a byte stream + input_data_stream = BytesIO(plaintext.encode('utf-8')) + output_stream = BytesIO() + + sdk.create_nano_tdf( + input_data_stream, + output_stream, + config + ) + + return output_stream.getvalue() +# Helper function to generate WKB for GEO data +def generate_random_point_wkb(): + """Generates a random GEO in WKB format.""" + min_lat, max_lat = 25, 45 + min_lon, max_lon = -85, -65 + + lat = random.uniform(min_lat, max_lat) + lon = random.uniform(min_lon, max_lon) + + return f'POINT({lon} {lat})' + +# --- Make Records --- +def generate_tdf_records(count, sdk): + """Generates a list of tdf_object records.""" + records = [] + fake = Faker() + + # Start date to be used for random timestamp generation + start_date = datetime.now() - timedelta(days=30) + + for i in range(count): + # 1. Rotate Classifications (one of each) + cls_type = CLASSIFICATIONS[i % len(CLASSIFICATIONS)] + attr_url = f"https://demo.com/attr/classification/value/{cls_type}" + + # 2. Randomize Vehicle Data + vehicle_data = { + "vehicleName": f"{fake.lexify('??').upper()}-{fake.numerify('###')}", + "origin": fake.lexify('???').upper(), # Changed from airport_iata to lexify + "destination": fake.lexify('???').upper(), # Changed from airport_iata to lexify + "aircraft_type": random.choice(["Boeing 747", "Airbus A320", "Cessna 172", "F-35", "Global 6000"]) + } + + # Encrypt with specific classification + tdf_blob = encrypt_data(sdk, json.dumps(vehicle_data), [attr_url]) + + # Prepare search JSONB to match classification + search_jsonb = json.dumps({ + "attrRelTo": [], + "attrNeedToKnow": [], + "attrClassification": [attr_url] + }) + + # Prepare metadata JSONB to have dynamic fields + metadata_jsonb = json.dumps({ + "callsign": fake.bothify('??-####').upper(), + "speed": f"{random.randint(0, 900)} km/h", + "altitude": f"{random.randint(0, 40000)} m", + "heading": str(random.randint(0, 359)) + }) + + # Randomized Data Fields + random_id = str(uuid.uuid4()) + random_ts = fake.date_time_between(start_date=start_date, end_date="now") + random_geo = generate_random_point_wkb() # WKB format + random_created_at = random_ts + timedelta(seconds=random.uniform(0.01, 0.1)) + + # Build the record + record = ( + random_id, + random_ts, + FIXED_SRC_TYPE, + random_geo, + search_jsonb, + metadata_jsonb, + tdf_blob, + FIXED_TDF_URI, + random_created_at, + FIXED_CREATED_BY + ) + records.append(record) + + return records + +# --- Insert Logic --- +def insert_seed_data(tdf_blob: bytes, should_delete: bool): + conn = None + records = generate_tdf_records(NUM_RECORDS, tdf_blob) + + print(f"Attempting to generate and insert {NUM_RECORDS} records in batches of {BATCH_SIZE}...") + + try: + # Connection + conn = psycopg2.connect( + dbname=DB_NAME, + user=DB_USER, + password=DB_PASSWORD, + host=DB_HOST, + port=DB_PORT + ) + cursor = conn.cursor() + + # --- Conditional Delete logic based on flag --- + if should_delete: + print(f"Flag --delete detected. Cleaning up records for src_type: {FIXED_SRC_TYPE}") + cursor.execute(DELETE_SQL, (FIXED_SRC_TYPE,)) + print(f"Successfully deleted {cursor.rowcount} records.") + + # Batch Chunks Insert + execute_batch( + cursor, + INSERT_SQL, + records, + page_size=BATCH_SIZE + ) + + # Commit updates + conn.commit() + print(f"Successfully inserted {NUM_RECORDS} records into the tdf_objects table.") + + except psycopg2.OperationalError as e: + print(f"CONNECTION ERROR: Could not connect to the database.") + print(f"Details: {e}") + if conn: conn.rollback() + + except Exception as e: + print(f"An error occurred during insertion: {e}") + if conn: conn.rollback() + + finally: + if conn: + cursor.close() + conn.close() + +if __name__ == "__main__": + # --- Argparse setup --- + parser = argparse.ArgumentParser(description="Seed script for TDF objects.") + parser.add_argument( + "--delete", + action="store_true", + help="Delete existing records matching the FIXED_SRC_TYPE before inserting new ones." + ) + args = parser.parse_args() + + try: + sdk_instance = get_sdk_instance(PLATFORM_ENDPOINT, CLIENT_ID, CLIENT_SECRET, CA_CERT_PATH, ISSUER_ENDPOINT) + # Pass the flag value to the insert function + insert_seed_data(sdk_instance, args.delete) + except Exception as e: + print(f"An error occurred: {e}") \ No newline at end of file diff --git a/common-operating-picture/sim_data.py b/common-operating-picture/sim_data.py new file mode 100644 index 0000000..978c846 --- /dev/null +++ b/common-operating-picture/sim_data.py @@ -0,0 +1,313 @@ +import asyncio +import time +import json +import os +import psycopg2 +import httpx +from shapely.geometry import Point + +# --- Configs --- +DB_NAME = "postgres" +DB_USER = "postgres" +DB_PASSWORD = "changeme" +DB_HOST = "localhost" +DB_PORT = 15432 +TABLE_NAME = "tdf_objects" + +# --- Parameters --- +NUM_ENTITIES = 5 +UPDATE_INTERVAL_SECONDS = 5 # Fast updates for authenticated users + +# --- Credentials --- +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +CREDS_FILE = os.path.join(BASE_DIR, "credentials.json") + +CLIENT_ID = None +CLIENT_SECRET = None +ACCESS_TOKEN = None +TOKEN_EXPIRES_AT = 0 + +# OpenSky Endpoints +OPENSKY_API_URL = "https://opensky-network.org/api/states/all" +OPENSKY_AUTH_URL = "https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token" + +# Bounding Box (US East Coast) - ONLY USED FOR INITIALIZATION +BOUNDING_BOX_PARAMS = { + "lamin": 25.0, + "lomin": -85.0, + "lamax": 45.0, + "lomax": -65.0 +} + +# --- Track UUID:ICAO24 Associations --- +UUID_TO_FLIGHT = {} + +# --- Load Credentials --- +if os.path.exists(CREDS_FILE): + try: + with open(CREDS_FILE, 'r') as f: + creds = json.load(f) + # Check for API Client keys first + CLIENT_ID = creds.get("clientId") + CLIENT_SECRET = creds.get("clientSecret") + + if CLIENT_ID and CLIENT_SECRET: + print(f"✅ Loaded API Client: {CLIENT_ID}") + else: + print("❌ Error: creds.json missing 'clientId' or 'clientSecret'") + exit(1) + except Exception as e: + print(f"❌ Error reading creds.json: {e}") + exit(1) +else: + print(f"❌ Error: {CREDS_FILE} not found. Please create it.") + exit(1) + +# --- Helper Functions --- +def get_db_uuids(conn_params, num_entities): + conn = None + uuids = [] + try: + conn = psycopg2.connect(**conn_params) + cursor = conn.cursor() + cursor.execute(f"SELECT id FROM {TABLE_NAME} WHERE src_type = 'vehicles' LIMIT %s;", (num_entities,)) + uuids = [row[0] for row in cursor.fetchall()] + print(f"Found {len(uuids)} UUIDs for tracking.") + except Exception as e: + print(f"Database error: {e}") + finally: + if conn: conn.close() + return uuids + +def lat_lon_to_wkb(latitude, longitude): + if latitude is not None and longitude is not None: + point = Point(longitude, latitude) + return point.wkb + return None + +async def get_valid_token(client): + """ + Ensures we have a valid OAuth2 Bearer token. + Refreshes it if it's expired or missing. + """ + global ACCESS_TOKEN, TOKEN_EXPIRES_AT + + # Buffer time (refresh 60s before expiry) + if ACCESS_TOKEN and time.time() < (TOKEN_EXPIRES_AT - 60): + return ACCESS_TOKEN + + print("🔄 Refreshing OpenSky OAuth Token...") + try: + payload = { + "grant_type": "client_credentials", + "client_id": CLIENT_ID, + "client_secret": CLIENT_SECRET + } + + response = await client.post(OPENSKY_AUTH_URL, data=payload) + + if response.status_code == 200: + data = response.json() + ACCESS_TOKEN = data["access_token"] + expires_in = data["expires_in"] + TOKEN_EXPIRES_AT = time.time() + expires_in + print(f"✅ Token refreshed! Expires in {expires_in}s") + return ACCESS_TOKEN + else: + print(f"❌ Auth Failed {response.status_code}: {response.text}") + return None + + except Exception as e: + print(f"❌ Auth Connection Error: {e}") + return None + +async def fetch_opensky_data(client, params): + """ + Fetches raw state vectors using OAuth2 Bearer Token. + Accepts dynamic params to switch between Box Search and ID Search. + """ + token = await get_valid_token(client) + if not token: + return None + + headers = { + "Authorization": f"Bearer {token}" + } + + try: + response = await client.get( + OPENSKY_API_URL, + params=params, + headers=headers, + timeout=10.0 + ) + + if response.status_code == 200: + return response.json().get("states", []) + + elif response.status_code == 429: + print("⚠️ Rate Limited (429). Waiting 10s...") + await asyncio.sleep(10) + return None + elif response.status_code == 401: + print("❌ Error 401: Unauthorized. Token might be invalid.") + global ACCESS_TOKEN + ACCESS_TOKEN = None + return None + else: + print(f"❌ OpenSky Error {response.status_code}: {response.text}") + return None + + except Exception as e: + print(f"❌ Connection Error: {e}") + return None + +async def initialize_flight_associations(client, uuids): + if not uuids: + return + + print("Fetching initial flights from OpenSky (Area Scan)...") + + # 1. EXPENSIVE CALL: Only done once to find planes + while True: + states = await fetch_opensky_data(client, BOUNDING_BOX_PARAMS) + + if states: + available_flights = [s[0] for s in states if s[5] is not None and s[6] is not None] + + if available_flights: + break + else: + print("API worked, but no flights found in box. Retrying in 5s...") + + else: + print("Retrying initialization in 5s...") + + await asyncio.sleep(5) + + for i, uuid_obj in enumerate(uuids): + icao24 = available_flights[i % len(available_flights)] + UUID_TO_FLIGHT[uuid_obj] = icao24 + + print(f"Successfully associated {len(UUID_TO_FLIGHT)} UUIDs with ICAO24 addresses.") + +async def update_flight_data(client, conn_params): + if not UUID_TO_FLIGHT: + return + + tracked_ids = list(set(UUID_TO_FLIGHT.values())) + + # 2. CHEAP CALL: Query ONLY the specific planes we are tracking + # usage: ?icao24=abc&icao24=xyz + target_params = {"icao24": tracked_ids} + + states = await fetch_opensky_data(client, target_params) + + if not states: + # If empty, our planes might have landed or moved out of coverage + # We don't error out, just wait for next tick + return + + flight_data_map = {s[0]: s for s in states} + + updates = [] + + for uuid_obj, icao24 in UUID_TO_FLIGHT.items(): + flight = flight_data_map.get(icao24) + + if flight: + lng = flight[5] + lat = flight[6] + + if lat is not None and lng is not None: + geos_wkb = lat_lon_to_wkb(lat, lng) + + # --- HYBRID MODEL MAPPING --- + # Static Data (Callsign, Origin) -> LEFT in the Encrypted Blob (ignored here) + # Dynamic Data (Speed, Alt) -> PUT in the Plaintext Metadata Field + + velocity = flight[9] # m/s + altitude = flight[13] if flight[13] is not None else flight[7] # meters + heading = flight[10] # degrees + + metadata = json.dumps({ + "speed": f"{round(velocity * 3.6)} km/h" if velocity is not None else "N/A", + "altitude": f"{round(altitude)} m" if altitude is not None else "N/A", + "heading": f"{round(heading)}" if heading is not None else "N/A" + }) + + updates.append((geos_wkb, uuid_obj, metadata)) + + if not updates: + print(f"No updates found for our {len(tracked_ids)} tracked planes.") + return + + conn = None + try: + conn = psycopg2.connect(**conn_params) + cursor = conn.cursor() + + # Update geo and MERGE new metadata into metadata JSONB + update_query = f""" + UPDATE {TABLE_NAME} AS t + SET + geo = ST_SetSRID(ST_GeomFromWKB(src.wkb_geos), 4326), + metadata = t.metadata || src.metadata::jsonb + FROM + (SELECT unnest(%s) as wkb_geos, unnest(%s) as entity_uuid, unnest(%s) as metadata) AS src + WHERE + t.id = src.entity_uuid::uuid; + """ + + wkb_list = [item[0] for item in updates] + uuid_list = [item[1] for item in updates] + meta_list = [item[2] for item in updates] + + cursor.execute(update_query, (wkb_list, uuid_list, meta_list)) + conn.commit() + # print(f"Updated {cursor.rowcount} records.") + + except Exception as e: + print(f"Database update failed: {e}") + if conn: conn.rollback() + finally: + if conn: conn.close() + +async def main(): + print(f"Starting Live Data Updater (Optimized Token Usage)...") + + conn_params = { + "dbname": DB_NAME, + "user": DB_USER, + "password": DB_PASSWORD, + "host": DB_HOST, + "port": DB_PORT + } + + async with httpx.AsyncClient() as client: + uuids_to_track = get_db_uuids(conn_params, NUM_ENTITIES) + + await initialize_flight_associations(client, uuids_to_track) + + if not UUID_TO_FLIGHT: + print("Initial association failed. Cannot start update loop.") + return + + print("\n--- Starting Live Update Loop ---") + try: + while True: + start_time = time.time() + await update_flight_data(client, conn_params) + + elapsed = time.time() - start_time + wait_time = max(0, UPDATE_INTERVAL_SECONDS - elapsed) + + await asyncio.sleep(wait_time) + + except KeyboardInterrupt: + print("\nStopped.") + except Exception as e: + print(f"\nFatal error: {e}") + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/common-operating-picture/sim_data_fake_opensky.py b/common-operating-picture/sim_data_fake_opensky.py new file mode 100644 index 0000000..921d512 --- /dev/null +++ b/common-operating-picture/sim_data_fake_opensky.py @@ -0,0 +1,151 @@ +import asyncio +import time +import uuid +import psycopg2 +import random +from shapely.geometry import Point + +# --- Configs --- +DB_NAME = "postgres" +DB_USER = "postgres" +DB_PASSWORD = "changeme" +DB_HOST = "localhost" +DB_PORT = 15432 +TABLE_NAME = "tdf_objects" + +# Script parameters +NUM_ENTITIES = 400 +UPDATE_INTERVAL_SECONDS = 1 # How often to push updates to the DB + +# Bounding box for movement simulation +BOUNDING_BOX = { + 'lamin': -55.0, + 'lomin': -160.0, + 'lamax': 55.0, + 'lomax': 160.0 +} + +# --- State Management --- +# This dictionary tracks the current lat/lon/heading for each flight +FLIGHT_SIMULATION_DATA = {} + +def get_db_uuids(conn_params, num_entities): + """Fetches existing vehicle UUIDs from the database.""" + conn = None + uuids = [] + try: + conn = psycopg2.connect(**conn_params) + cursor = conn.cursor() + cursor.execute(f"SELECT id FROM {TABLE_NAME} WHERE src_type = 'vehicles' LIMIT %s;", (num_entities,)) + uuids = [row[0] for row in cursor.fetchall()] + print(f"Found {len(uuids)} UUIDs in database.") + except Exception as e: + print(f"Database error while fetching UUIDs: {e}") + finally: + if conn: + conn.close() + return uuids + +def lat_lon_to_wkb(latitude, longitude): + """Converts a latitude and longitude into WKB format for PostGIS.""" + point = Point(longitude, latitude) + return point.wkb + +async def update_simulated_positions(conn_params, uuids): + """ + Calculates new flight positions and updates the DB in a single batch. + """ + updates = [] + + for entity_id in uuids: + # If we haven't seen this flight yet, initialize it + if entity_id not in FLIGHT_SIMULATION_DATA: + FLIGHT_SIMULATION_DATA[entity_id] = { + "lat": random.uniform(BOUNDING_BOX['lamin'], BOUNDING_BOX['lamax']), + "lon": random.uniform(BOUNDING_BOX['lomin'], BOUNDING_BOX['lomax']), + "v_lat": random.uniform(-0.05, 0.05), # Velocity Latitude + "v_lon": random.uniform(-0.05, 0.05) # Velocity Longitude + } + + state = FLIGHT_SIMULATION_DATA[entity_id] + + # Move the flight + state["lat"] += state["v_lat"] + state["lon"] += state["v_lon"] + + # Bounce off the bounding box edges to keep them in view + if not (BOUNDING_BOX['lamin'] < state["lat"] < BOUNDING_BOX['lamax']): + state["v_lat"] *= -1 + if not (BOUNDING_BOX['lomin'] < state["lon"] < BOUNDING_BOX['lomax']): + state["v_lon"] *= -1 + + # Prepare WKB + wkb_geo = lat_lon_to_wkb(state["lat"], state["lon"]) + updates.append((wkb_geo, entity_id)) + + # Push to Database + if updates: + conn = None + try: + conn = psycopg2.connect(**conn_params) + cursor = conn.cursor() + + # Optimized bulk update query + update_query = f""" + UPDATE {TABLE_NAME} AS t + SET + geo = ST_SetSRID(ST_GeomFromWKB(src.wkb_geos), 4326) + FROM + (SELECT unnest(%s) as wkb_geos, unnest(%s) as entity_uuid) AS src + WHERE + t.id = src.entity_uuid::uuid; + """ + + wkb_list = [u[0] for u in updates] + uuid_list = [u[1] for u in updates] + + cursor.execute(update_query, (wkb_list, uuid_list)) + conn.commit() + print(f"[{time.strftime('%H:%M:%S')}] Updated {cursor.rowcount} flights.") + + except Exception as e: + print(f"DB Update Failed: {e}") + if conn: conn.rollback() + finally: + if conn: conn.close() + +async def main(): + print("--- Starting Internal Mock Flight Generator ---") + + conn_params = { + "dbname": DB_NAME, + "user": DB_USER, + "password": DB_PASSWORD, + "host": DB_HOST, + "port": DB_PORT + } + + # Step 1: Get the entities we need to move + uuids_to_move = get_db_uuids(conn_params, NUM_ENTITIES) + + if not uuids_to_move: + print("No 'vehicles' records found in DB. Seed the DB first!") + return + + # Step 2: Loop forever updating positions + try: + while True: + start_time = time.time() + + await update_simulated_positions(conn_params, uuids_to_move) + + # Control the frequency + elapsed = time.time() - start_time + sleep_duration = max(0, UPDATE_INTERVAL_SECONDS - elapsed) + await asyncio.sleep(sleep_duration) + + except KeyboardInterrupt: + print("\nStopping simulated updates.") + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/common-operating-picture/startupInstructions.md b/common-operating-picture/startupInstructions.md new file mode 100644 index 0000000..6a231ef --- /dev/null +++ b/common-operating-picture/startupInstructions.md @@ -0,0 +1,178 @@ +# Installation Guide + +Follow these steps to set up the Data Security Platform (DSP) local development environment. + +### Prerequisites + +Before beginning, ensure your environment meets the following requirements. + +1. **Run the Setup Script** +To install necessary dependencies automatically, run the provided script: + +```bash +./ubuntu_cop_prereqs_cop.sh + +# Reboot after running script for some changes to take effect +reboot +``` + +
+ Manual Installation Details (Optional) + + If you prefer to install manually or need to debug, the script handles the following: + + - **Container Runtime:** Installs Docker + Docker Compose. + - _Alternatives supported:_ [Colima (recommended)](https://github.com/abiosoft/colima), [Rancher Desktop](https://rancherdesktop.io), or [Podman Desktop](https://podman-desktop.io). + - **Languages & Tools:** + - [Node.js (via nvm)](https://nodejs.org/en/download/package-manager) + - [Go (Golang)](https://go.dev/doc/install) + - [GEOS](https://libgeos.org/usage/install/) + - [Make](https://formulae.brew.sh/formula/make) +
+ - **Local DNS Configuration** + - Entry added into /etc/hosts + - ```text + 127.0.0.1 local-dsp.virtru.com + ``` + +--- + +### Step 1: Generate Local Certificates (Mkcert) + +You need SSL certificates for local development. + +**Option A: Script** +Run the key generation script: + +```bash +./ubuntu_cop_keys.sh +``` + +**Option B: Make Command** +** Note: you can use `'make dev-certs'` as a shortcut to generate the development certs ** + +**Currently NonFunctional - Use the script above** + +```bash +# Make command +make dev-certs +``` + +### Step 2: Unpack the Bundle + +Unzip the main bundle and unpack the specific DSP tools. Replace `X.X.X`, ``, and `` with your specific version and system details. + +```bash +# 1. Untar the main bundle +mkdir virtru-dsp-bundle && tar -xvf virtru-dsp-bundle-* -C virtru-dsp-bundle/ && cd virtru-dsp-bundle/ + +# 2. Unpack DSP Tools +tar -xvf tools/dsp/data-security-platform_X.X.X__.tar.gz + #Example - AMD linux: + tar -xvf tools/dsp/data-security-platform_2.7.1_linux_amd64.tar.gz + +# 3. Unpack and setup Helm +tar -xvf tools/helm/helm-vX.X.X--.tar.gz + #Example - AMD linux: + tar -xvf tools/helm/helm-v3.15.4-linux-amd64.tar.gz +# Then move command into working directory +mv -/helm ./helm + +# 4. Unpack and setup grpcurl +tar -xvf tools/grpcurl/grpcurl_X.X.X__.tar.gz + #Example - AMD linux: + tar -xvf tools/grpcurl/grpcurl_1.9.1_linux_x86_64.tar.gz + +# Make Executable +chmod +x ./grpcurl +``` + +### Step 3: Setup Local Docker Registry + +The DSP images are stored in the bundle as OCI artifacts. You must spin up a local registry and copy the images into it. + +```bash +# 1. Start a local registry instance +docker run -d --restart=always -p 5000:5000 --name registry registry:2 + +# 2. Copy DSP images into local registry +# (Run this from the virtru-dsp-bundle root directory) +./dsp copy-images --insecure localhost:5000/virtru + +# 3. Verify images were copied successfully +curl -X GET http://localhost:5000/v2/_catalog +curl -X GET http://localhost:5000/v2/virtru/data-security-platform/tags/list +``` + +### Step 4: Build and Run + +Use Docker Compose to build and start the environment. + +**Start the environment:** + +```bash +docker compose --env-file env/default.env -f docker-compose.dev.yaml up --build --force-recreate +``` + +Local COP Application URL: https://local-dsp.virtru.com:5001/ + +**Stop the environment:** + +The following will stop the enviroment and COP application. Crtl + c in the terminal will also stop the containers however it is recommended +to also run the following down command as it will cleanup the container remnants. + +```bash +docker compose --env-file env/default.env -f docker-compose.dev.yaml down +``` + +### Step 5. Seeding Vehicle Data and Live Data Flow Simulation + +Following the successful building of COP: + +```bash +# Install the venv module +sudo apt install python3-venv -y + +# Create a virtual environment named 'COP_venv' in the current directory +python3 -m venv COP_venv +``` + +```bash +# Activate the virtual environment. +# Your shell prompt will change to indicate it's active. +source COP_venv/bin/activate +``` + +```bash +# Pip install all required package from requirements.txt +pip install -r requirements.txt +``` + +```bash +# Run seeding script to populate database +# 50 is the standard number of objects that the script will inset but is configurable via NUM_RECORDS variable +python3 seed_data.py +``` + +```bash +# Start simulation +# NUM_ENTITIES will determine how many moving entities the script will query the database for and apply movement logic to +# UPDATE_INTERVAL_SECONDS determins the frequency of movement for each object +# BOUNDING_BOX_PARAMS define the area for the OpenSky query for live planes (smaller box results in less credits used on init). + +# For live data from OpenSky Network login to https://opensky-network.org/, download credentials file (credentials.json), +# place the file in the base director (where the sim_data.py script is located) and then run: +python3 sim_data.py + +# For a fake simulation that does not require the credentials file or use account credits with OpenSky run this script +# for simulated movement: +python3 sim_data_fake_opensky.py +``` + +### Troubleshooting & Verification Checklist + +If you encounter issues, double-check the following: + +- **dsp.yaml:** Ensure this file exists in your working directory. +- **rootCA.cert:** Ensure the root CA certificate was copied correctly during the setup. +- **Permissions:** Verify that the certificates in `dsp-keys` have `chmod 755` permissions. diff --git a/common-operating-picture/tagging-pdp-workflows-new.yaml b/common-operating-picture/tagging-pdp-workflows-new.yaml new file mode 100755 index 0000000..bb7f3f5 --- /dev/null +++ b/common-operating-picture/tagging-pdp-workflows-new.yaml @@ -0,0 +1,818 @@ +# -- A set of defined tagging PDP workflows +taggingpdpWorkflows: + config.yaml: + # Virtru Tagging PDP Configuration + # Map and normalize terms extracted from the tag processors + + classificationAttributeFQN: &classificationAttributeFQN "https://demo.com/attr/classification" + needToKnowAttributeFQN: &needToKnowAttributeFQN "https://demo.com/attr/needtoknow" + relToAttributeFQN: &relToAttributeFQN "https://demo.com/attr/relto" + sciAttributeFQN: &sciAttributeFQN "https://demo.com/attr/sci" + coiAttributeFQN: &coiAttributeFQN "https://demo.com/attr/poi" + pcoiAttributeFQN: &pcoiAttributeFQN "https://demo.com/attr/pcoi" + + + #Mappings from STANAG Classifications to IC-EDH enum compatible values + ic-edh-cls-mappings: &ic-edh-cls-mappings + - key: RESTRICTED + value: R + - key: CONFIDENTIAL + value: C + - key: SECRET + value: S + - key: TOP SECRET + value: TS + - key: UNCLASSIFIED + value: U + + resourceMappingSets: + # Entries mapping synonyms to one or more normalized terms. + - id: "classification-dict" + entries: + - terms: ["TS", "TOP SECRET", "TOPSECRET"] + attributevalue: + value: "topSecret" + - terms: ["S", "SECRET", "SEC"] + attributevalue: + value: "secret" + - terms: ["C", "CONFIDENTIAL", "CONTROLLED UNCLASSIFIED", + "OFFICIAL-SENSITIVE", "CUI"] + attributevalue: + value: "confidential" + - terms: ["U", "UNCLASSIFIED", "OFFICIAL"] + attributevalue: + value: "unclassified" + - id: "relto-dict" + entries: + - terms: ["US"] + attributevalue: + value: "USA" + - terms: ["UK"] + attributevalue: + value: "GBR" + - id: "abac-to-snag4774" + entries: + - terms: ["Releasable To"] + attributevalue: + attribute: + fqn: *relToAttributeFQN + - terms: ["TOP SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/topsecret" + - terms: ["SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/secret" + - terms: ["UNCLASSIFIED"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/unclassified" + - terms: ["CONFIDENTIAL"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/confidential" + + icEDHSecAccessMappings: &icEDHSecAccessMappings + # Mapping of EDH Security Access values for ism:classification + - ismAttribute: classification + # Optional Handling Statement Scope: ALL|TOD|PAYL; default=ALL + #scope: + # The tag templates + mappings: + # Optional flag for requiring tag templates have a synonym match. default = false + # synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Mapping of EDH Security Access values for ism:releasableTo + - ismAttribute: releasableTo + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + - ismAttribute: SCIcontrols + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *sciAttributeFQN + - ismAttribute: SARIdentifier + mappings: + delimiters: [ ",",";"," " ] + synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + namespace: *coiAttributeFQN + synonymDictionary: "coi-dict" + - type: "ATTRIBUTE" + namespace: *pcoiAttributeFQN + synonymDictionary: "pcoi-dict" + + snag5636-attributeInputs: &snag5636-attributeInputs + classificationFQN: *classificationAttributeFQN + mapAllAttributeToCategory: false + requireMappedAttributes: false + categoryFQNs: + - *relToAttributeFQN + - *needToKnowAttributeFQN + - *sciAttributeFQN + resourceMappingSet: "abac-to-snag4774" + + ismNamespace: &ismNamespace "urn:us:gov:ic:ism" + agencyNamespace: &agencyNamespace "urn:us:gov:ic:usagency" + arhNamespace: &arhNamespace "urn:us:gov:ic:arh" + + # Mapping from STANAG 5636->IC-EDH + stanag-icedh-mappings: &stanag-icedh-mappings + mappingExpressions: + - type: LITERAL + value: "202111" + targets: + - path: "Edh.DESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: *ismNamespace + path: "Edh.DESVersion" + - type: LITERAL + value: "202205" + targets: + - namespace: *ismNamespace + path: "Edh.ISMCATCESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: "urn:us:gov:ic:ntk" + path: "Edh.DESVersion" + - type: LITERAL + value: "202207" + targets: + - namespace: *arhNamespace + path: "Edh.DESVersion" + - namespace: *arhNamespace + path: "Edh.Security.DESVersion" + - type: LITERAL + value: "202100" + targets: + - path: "Edh.DESVersion" + namespace: "urn:us:gov:ic:id" + - type: LITERAL + value: "202207" + targets: + - path: "Edh.CESVersion" + namespace: *agencyNamespace + - type: AUTOGENERATED_DATETIME + targets: + - path: "Edh.DataItemCreateDateTime" + - type: JSONPATH + # STANAG confidential label category named Releasable To + value: "$.ocl.cls" + targets: + - path: "Edh.Security.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - path: "Edh.Security.Access.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - type: JSONPATH + # STANAG confidential label category named Releasable -> ism:releasableTo + value: "$.ocl.catl[?(@.name == 'Releasable To')].vals" + targets: + - path: "Edh.Security.Access.releasableTo" + namespace: *ismNamespace + - type: JSONPATH + # STANAG confidential label category named Restricted To Compartments -> ism:SCIControls + value: "$.ocl.catl[?(@.name == 'Restricted To Compartments')].vals" + targets: + - path: "Edh.Security.Access.SCIcontrols" + namespace: *ismNamespace + - type: LITERAL + value: "REL" + targets: + - path: "Edh.Security.Access.disseminationControls" + namespace: *ismNamespace + + # Responsible for consuming input content and extracting content + contentExtractors: + # Processor Type: "tika-content-extraction" processor: loading the + # standard tika content extraction processor + - type: "tika-content-extraction" + id: "std-content-extraction" + ocr: true + # Tika Server URL to use for content extraction; this will be overridden by the value in the DSP chart + tikaServerUrl: "tika-url" + # Configure the timeout for the http client that calls tika + # tikaClientTimeout: "30s" # default is no timeout + # Processor Type: "titus-metadata" processor: Introspects Content + # metadata for base64 encoded Titus Metadata (JSON) + - type: "titus-metadata" + id: "titus-metadata-extractor-email" + metatdataKeys: + - "Message:Raw-Header:x-titus-metadata-40" + + # Creates tags from extracted content. e.g. regex: Produce tags based on + # regex matching. Each processor in the flow is identified by standard + # configuration properties: + # id: unique ID of the processor, used primarily in provenance tracking + # type: a well known type used to discover the processor at runtime. + # The discovery process first checks for well known standard + # processors then falls back to processor discovery using + # META-INF/taggingproviders and processor specific configuration. + tagExtractionRules: + # The TDF ZIP attribute extractor + - id: "tdf3" + type: "tdf3-tag-processor" + # The TDF XML attribute extractor + - id: "tdfxml_extraction" + type: "tdfxml" + ztdfClassificationTemplate: + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + ztdfRelToTemplate: + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + ictdfEDHSecAccessMappings: *icEDHSecAccessMappings + - id: "ic-edh-processor" + type: "ic-edh" + icEDHSecAccessMappings: *icEDHSecAccessMappings + icEDHSecMappings: *icEDHSecAccessMappings + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'classification' property (x-bj_classification) from email headers + - id: "xheader_bj_classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key value + # having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # Process metadata values based on key match of the following regex + - keyRegex: >- + (?i)x-bj_classification + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?:\W*(?:([A-Z- ]+)(?:[\W]+|$)))* + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'releasability' property (x-bj_releasability) from email headers + - id: "xheader_bj_releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key + # value having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # only process metadata values based on key match of the + # following regex + - keyRegex: >- + (?i)x-bj_releasability + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b[A-Z]{2,4}\b(?:[ ,]+\b[A-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-banners tag processor is used to parse single line + # banner type classifications + - id: "classification-banners" + desc: "Extract Classification, Need to Know and Releasability Tags" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i)(TOP SECRET|TOPSECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)[\W]*(\b(?:[/ ]?\b[a-zA-Z]{2,4}\b)*)(?:[\W]+Rel(?:easable)?[\W]*(?:To)?)[\W]*(\b[a-zA-Z]{2,4}\b(?:[ ,]+\b[a-zA-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # For Capture Group 2 create both a TDF Attribute and TDF Assertion. + - group: "2" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " ", "/"] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *needToKnowAttributeFQN + # For Capture Group 3 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "3" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-only-banners tag processor is used to parse + # Classification only banners + - id: "classification-only-banners" + desc: "Extract Classification Only Tags" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: FIRST_LINE + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + \b(?i)(TOP SECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)(\W+|$) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Classification tag processor is used to parse + # Classification from Alternate Data Stream + - id: "Alternate Data Stream Classification" + desc: "Read alternate data stream Classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Releasability tag processor is used to parse + # Releasability from Alternate Data Stream + - id: "Alternate Data Stream Releasability" + desc: "Read alternate data stream Releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The titus-classification-markings tag processor is used to parse + # Titus classification markings + - id: "titus-classification-markings" + desc: "Map titus classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The titus-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "titus-releasability-markings" + desc: "Map titus releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The boldonJames-classification-markings tag processor is used to parse + # Titus classification markings + - id: "boldonJames-classification-markings" + desc: "Map boldonJames classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The boldonJames-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "boldonJames-releasability-markings" + desc: "Map boldonJames releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + tagProcessors: + # This is the standard type for the required tag processor. + - type: required-tags + id: "missing required tag" + # The tag type used when generating a new tag missing values + tagType: "MISSING_REQUIRED_TAG" + # The processing scope. ITEM or GLOBAL. Default is ITEM. + # ITEM Scope = tags must exist across all content items + processingScope: GLOBAL + # The namespaces of the required tags + requiredNamespaces: [*classificationAttributeFQN, + *relToAttributeFQN] + # Content types should have metadata treated as a separate input requirement + requireMetadataTypes: ["message/rfc822"] + # Dynamic value that's injected. + tagValue: "virtru:block" + - id: "test tag mismatch between tags in an (email body or header) and an email attachment" + type: tag-mismatch + inputs: + # Any type, any value, Has source from email header OR an email body + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822"] + itemIdRegex: >- + Message:Raw-Header + - itemTypes: ["message/rfc822"] + # Any tag from an email attachment + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822.attachment"] + tagTemplate: + value: "virtru:warn" + type: "tag-mismatch" + + # Reduces tag set + rollupRules: + # Processor Type: "std-rollup" processor: + # - Rolls up tags based on attribute definitions + # - Rolls up restrictive ("allOf") tags across all content sources as a "union". + # - Rolls up permissive ("anyOf") tags across all content sources as an "intersection"; Optional group aliases are used here. + # - Rolls up "hierarchy" tags using a "High Watermark" approach. + # - Case-insensitive matching on attribute values. Case is corrected when attribute definitions exists for the given tag value + # - Values not matching an attribute definition are allowed to pass through (default behavior) + + - type: "std-rollup" + id: "standard rollup" + # Treat items of type "message/rfc822" (email) message metadata as a separate bucket of content + metadataItemTypes: ["message/rfc822"] + # Should intra-content items be rolled up - default is false + intraContentRollup: true + # aliasRollupMode: 3 options Control mode for handling aliases + # - BOTH = Default, both an alias and its members are kept after rollup rules are applied + # - ALIAS = only the alias value is kept and members are dropped after rollup rules are applied. Only if all members are present for the alias + # - MEMBER = drops an alias value if all member values are present. + aliasRollupMode: ALIAS + # Require a rollup alias to appear at least once in the intersected value list - default = false + requireAliasInValues: false + # Group aliases + attributeValueMembers: + - value: + fqn: "https://demo.com/attr/relto/value/FVEY" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "NZL" + - value: "CAN" + - value: + fqn: "https://demo.com/attr/relto/value/PINK" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "CAN" + - value: "NZL" + - value: "BEL" + - value: "DNK" + - value: "FRA" + - value: "ITA" + - value: "NOR" + - value: "PRT" + - value: "HRV" + - value: "CZE" + - value: "POL" + - value: "ROU" + - value: "DEU" + - value: "ESP" + - value: "TUR" + - value: "SWE" + - value: "FIN" + - value: "AUT" + + - value: + fqn: "https://demo.com/attr/relto/value/NATO" + members: + - value: "ALB" + - value: "BEL" + - value: "BGR" + - value: "CAN" + - value: "HRV" + - value: "CZE" + - value: "DNK" + - value: "EST" + - value: "FRA" + - value: "DEU" + - value: "GRC" + - value: "HUN" + - value: "ISL" + - value: "ITA" + - value: "LVA" + - value: "LTU" + - value: "LUX" + - value: "MNE" + - value: "NLD" + - value: "MKD" + - value: "NOR" + - value: "POL" + - value: "PRT" + - value: "ROU" + - value: "SVK" + - value: "SVN" + - value: "ESP" + - value: "TUR" + - value: "GBR" + - value: "USA" + + # Link non attributes to attributes for rollup + tagLinks: + - src: "Classification" + target: *classificationAttributeFQN + - src: "needToKnow" + target: *needToKnowAttributeFQN + - src: "releasableTo" + target: *relToAttributeFQN + + # Processor Type: "drop-duplicates" processor: Merges duplicate tags + - type: "drop-duplicates" + id: "drop duplicate values" + - type: stanag5636-assertions + id: "urn:nato:stanag:5636:A:1:elements:json" + assertionType: "urn:nato:stanag:5636:A:1:elements:json" + assertionFormat: "json+stanag5636" + attributeInputs: *snag5636-attributeInputs + icedhAssertionType: "urn:us:gov:ic:edh" + # Validation ~ min required metadata fields + requiredMetadata: + name: "fvey-minimum-metadata-example" + jsonPathExpressions: + # require a "releasable to" conf. label category + - "$.ocl.catl[?(@.name == 'Releasable To')]" + # require policy identifier + - "$.ocl.pol" + # require classification + - "$.ocl.cls" + # require date created + - "$.ocl.dcr" + - type: icedh-assertions + id: "urn:us:gov:ic:edh" + assertionType: "urn:us:gov:ic:edh" + assertionFormat: "ic-edh+xml" + # generate assertion only when requested + requireAssertionOption: true + mappings: *stanag-icedh-mappings diff --git a/common-operating-picture/tagging-pdp-workflows.yaml b/common-operating-picture/tagging-pdp-workflows.yaml new file mode 100644 index 0000000..bb7f3f5 --- /dev/null +++ b/common-operating-picture/tagging-pdp-workflows.yaml @@ -0,0 +1,818 @@ +# -- A set of defined tagging PDP workflows +taggingpdpWorkflows: + config.yaml: + # Virtru Tagging PDP Configuration + # Map and normalize terms extracted from the tag processors + + classificationAttributeFQN: &classificationAttributeFQN "https://demo.com/attr/classification" + needToKnowAttributeFQN: &needToKnowAttributeFQN "https://demo.com/attr/needtoknow" + relToAttributeFQN: &relToAttributeFQN "https://demo.com/attr/relto" + sciAttributeFQN: &sciAttributeFQN "https://demo.com/attr/sci" + coiAttributeFQN: &coiAttributeFQN "https://demo.com/attr/poi" + pcoiAttributeFQN: &pcoiAttributeFQN "https://demo.com/attr/pcoi" + + + #Mappings from STANAG Classifications to IC-EDH enum compatible values + ic-edh-cls-mappings: &ic-edh-cls-mappings + - key: RESTRICTED + value: R + - key: CONFIDENTIAL + value: C + - key: SECRET + value: S + - key: TOP SECRET + value: TS + - key: UNCLASSIFIED + value: U + + resourceMappingSets: + # Entries mapping synonyms to one or more normalized terms. + - id: "classification-dict" + entries: + - terms: ["TS", "TOP SECRET", "TOPSECRET"] + attributevalue: + value: "topSecret" + - terms: ["S", "SECRET", "SEC"] + attributevalue: + value: "secret" + - terms: ["C", "CONFIDENTIAL", "CONTROLLED UNCLASSIFIED", + "OFFICIAL-SENSITIVE", "CUI"] + attributevalue: + value: "confidential" + - terms: ["U", "UNCLASSIFIED", "OFFICIAL"] + attributevalue: + value: "unclassified" + - id: "relto-dict" + entries: + - terms: ["US"] + attributevalue: + value: "USA" + - terms: ["UK"] + attributevalue: + value: "GBR" + - id: "abac-to-snag4774" + entries: + - terms: ["Releasable To"] + attributevalue: + attribute: + fqn: *relToAttributeFQN + - terms: ["TOP SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/topsecret" + - terms: ["SECRET"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/secret" + - terms: ["UNCLASSIFIED"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/unclassified" + - terms: ["CONFIDENTIAL"] + attributevalue: + fqn: "https://demo.com/attr/classification/value/confidential" + + icEDHSecAccessMappings: &icEDHSecAccessMappings + # Mapping of EDH Security Access values for ism:classification + - ismAttribute: classification + # Optional Handling Statement Scope: ALL|TOD|PAYL; default=ALL + #scope: + # The tag templates + mappings: + # Optional flag for requiring tag templates have a synonym match. default = false + # synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Mapping of EDH Security Access values for ism:releasableTo + - ismAttribute: releasableTo + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + - ismAttribute: SCIcontrols + mappings: + delimiters: [ ",",";"," " ] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *sciAttributeFQN + - ismAttribute: SARIdentifier + mappings: + delimiters: [ ",",";"," " ] + synonymDictionaryMatch: true + tagTemplates: + - type: "ATTRIBUTE" + namespace: *coiAttributeFQN + synonymDictionary: "coi-dict" + - type: "ATTRIBUTE" + namespace: *pcoiAttributeFQN + synonymDictionary: "pcoi-dict" + + snag5636-attributeInputs: &snag5636-attributeInputs + classificationFQN: *classificationAttributeFQN + mapAllAttributeToCategory: false + requireMappedAttributes: false + categoryFQNs: + - *relToAttributeFQN + - *needToKnowAttributeFQN + - *sciAttributeFQN + resourceMappingSet: "abac-to-snag4774" + + ismNamespace: &ismNamespace "urn:us:gov:ic:ism" + agencyNamespace: &agencyNamespace "urn:us:gov:ic:usagency" + arhNamespace: &arhNamespace "urn:us:gov:ic:arh" + + # Mapping from STANAG 5636->IC-EDH + stanag-icedh-mappings: &stanag-icedh-mappings + mappingExpressions: + - type: LITERAL + value: "202111" + targets: + - path: "Edh.DESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: *ismNamespace + path: "Edh.DESVersion" + - type: LITERAL + value: "202205" + targets: + - namespace: *ismNamespace + path: "Edh.ISMCATCESVersion" + - type: LITERAL + value: "202111" + targets: + - namespace: "urn:us:gov:ic:ntk" + path: "Edh.DESVersion" + - type: LITERAL + value: "202207" + targets: + - namespace: *arhNamespace + path: "Edh.DESVersion" + - namespace: *arhNamespace + path: "Edh.Security.DESVersion" + - type: LITERAL + value: "202100" + targets: + - path: "Edh.DESVersion" + namespace: "urn:us:gov:ic:id" + - type: LITERAL + value: "202207" + targets: + - path: "Edh.CESVersion" + namespace: *agencyNamespace + - type: AUTOGENERATED_DATETIME + targets: + - path: "Edh.DataItemCreateDateTime" + - type: JSONPATH + # STANAG confidential label category named Releasable To + value: "$.ocl.cls" + targets: + - path: "Edh.Security.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - path: "Edh.Security.Access.classification" + namespace: *ismNamespace + mappings: *ic-edh-cls-mappings + - type: JSONPATH + # STANAG confidential label category named Releasable -> ism:releasableTo + value: "$.ocl.catl[?(@.name == 'Releasable To')].vals" + targets: + - path: "Edh.Security.Access.releasableTo" + namespace: *ismNamespace + - type: JSONPATH + # STANAG confidential label category named Restricted To Compartments -> ism:SCIControls + value: "$.ocl.catl[?(@.name == 'Restricted To Compartments')].vals" + targets: + - path: "Edh.Security.Access.SCIcontrols" + namespace: *ismNamespace + - type: LITERAL + value: "REL" + targets: + - path: "Edh.Security.Access.disseminationControls" + namespace: *ismNamespace + + # Responsible for consuming input content and extracting content + contentExtractors: + # Processor Type: "tika-content-extraction" processor: loading the + # standard tika content extraction processor + - type: "tika-content-extraction" + id: "std-content-extraction" + ocr: true + # Tika Server URL to use for content extraction; this will be overridden by the value in the DSP chart + tikaServerUrl: "tika-url" + # Configure the timeout for the http client that calls tika + # tikaClientTimeout: "30s" # default is no timeout + # Processor Type: "titus-metadata" processor: Introspects Content + # metadata for base64 encoded Titus Metadata (JSON) + - type: "titus-metadata" + id: "titus-metadata-extractor-email" + metatdataKeys: + - "Message:Raw-Header:x-titus-metadata-40" + + # Creates tags from extracted content. e.g. regex: Produce tags based on + # regex matching. Each processor in the flow is identified by standard + # configuration properties: + # id: unique ID of the processor, used primarily in provenance tracking + # type: a well known type used to discover the processor at runtime. + # The discovery process first checks for well known standard + # processors then falls back to processor discovery using + # META-INF/taggingproviders and processor specific configuration. + tagExtractionRules: + # The TDF ZIP attribute extractor + - id: "tdf3" + type: "tdf3-tag-processor" + # The TDF XML attribute extractor + - id: "tdfxml_extraction" + type: "tdfxml" + ztdfClassificationTemplate: + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + ztdfRelToTemplate: + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + ictdfEDHSecAccessMappings: *icEDHSecAccessMappings + - id: "ic-edh-processor" + type: "ic-edh" + icEDHSecAccessMappings: *icEDHSecAccessMappings + icEDHSecMappings: *icEDHSecAccessMappings + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'classification' property (x-bj_classification) from email headers + - id: "xheader_bj_classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key value + # having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # Process metadata values based on key match of the following regex + - keyRegex: >- + (?i)x-bj_classification + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?:\W*(?:([A-Z- ]+)(?:[\W]+|$)))* + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The xheader_bj_releasability tag processor is used to parse the Boldon + # James 'releasability' property (x-bj_releasability) from email headers + - id: "xheader_bj_releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Only process email items = message/rfc822 + # - Then only metadata values for email items with a metadata key + # value having a regex match + scope: + # only considers content items of type "message/rfc822" (email) + itemTypes: [ "message/rfc822" ] + # Only regex on metadata values for key matching the regex + contentEval: + sources: ["METADATA"] + metadataFilters: + # only process metadata values based on key match of the + # following regex + - keyRegex: >- + (?i)x-bj_releasability + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b[A-Z]{2,4}\b(?:[ ,]+\b[A-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-banners tag processor is used to parse single line + # banner type classifications + - id: "classification-banners" + desc: "Extract Classification, Need to Know and Releasability Tags" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i)(TOP SECRET|TOPSECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)[\W]*(\b(?:[/ ]?\b[a-zA-Z]{2,4}\b)*)(?:[\W]+Rel(?:easable)?[\W]*(?:To)?)[\W]*(\b[a-zA-Z]{2,4}\b(?:[ ,]+\b[a-zA-Z]{2,4}\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # For Capture Group 2 create both a TDF Attribute and TDF Assertion. + - group: "2" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " ", "/"] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *needToKnowAttributeFQN + # For Capture Group 3 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "3" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The classification-only-banners tag processor is used to parse + # Classification only banners + - id: "classification-only-banners" + desc: "Extract Classification Only Tags" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: FIRST_LINE + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + \b(?i)(TOP SECRET|TS|SECRET|SEC|S|CONFIDENTIAL|C|OFFICIAL-SENSITIVE|OFFICIAL|CONTROLLED UNCLASSIFIED|CUI|UNCLASSIFIED|U)(\W+|$) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Classification tag processor is used to parse + # Classification from Alternate Data Stream + - id: "Alternate Data Stream Classification" + desc: "Read alternate data stream Classification" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # Alternate Data Stream Releasability tag processor is used to parse + # Releasability from Alternate Data Stream + - id: "Alternate Data Stream Releasability" + desc: "Read alternate data stream Releasability" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to only BODY + scope: + contentEval: + sources: + - BODY + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (?i) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The titus-classification-markings tag processor is used to parse + # Titus classification markings + - id: "titus-classification-markings" + desc: "Map titus classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # A synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The titus-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "titus-releasability-markings" + desc: "Map titus releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:TitusGUID"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + # The boldonJames-classification-markings tag processor is used to parse + # Titus classification markings + - id: "boldonJames-classification-markings" + desc: "Map boldonJames classification markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Classification as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Classification"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";"] + tagTemplates: + - type: "ATTRIBUTE" + synonymDictionary: "classification-dict" + namespace: *classificationAttributeFQN + # The boldonJames-releasability-markings tag processor is used to parse + # Titus releasability markings + - id: "boldonJames-releasability-markings" + desc: "Map boldonJames releasability markings" + # Processor Type: "regex" processor: Applies regex tag extraction rules + type: "regex" + # Scope: Filter content items for evaluation of the regex expression. + # In this example Filter: + # - Scope to all content types having a metadata field custom:TitusGUID + # AND + # - use metadata value custom:Releasability as source of tag extraction + scope: + metadataFilters: + - keys: ["custom:bjSaver"] + contentEval: + sources: ["METADATA"] + metadataFilters: + - keys: ["custom:Releasability"] + # textProcessingMode: 3 options + # - ALL (default): Process ALL Text + # - FIRST_LINE: Process only the first line + # - N_LINES: Process only the first N Lines + # - must be accompanied by: + # nLines: + textProcessingMode: ALL + # stopMode: 2 options - When should the regex processor stop adding tags: + # - NONE (default) - does not stop + # - FIRST_MATCH - stops after first match + stopMode: NONE + # The regex Expression - uses capture groups to inform tag creation below + regex: >- + (\b\w+\b(?:[,|;|\s]+\b\w+\b)*) + captureGroups: + # For Capture Group 1 create both a TDF Attribute and TDF Assertion. + # In both cases a synonym dictionary is used to map values->well known terms. + - group: "1" + # optional delimiters to apply to this capture group + delimiters: [", ", ";", " "] + tagTemplates: + - type: "ATTRIBUTE" + namespace: *relToAttributeFQN + synonymDictionary: "relto-dict" + tagProcessors: + # This is the standard type for the required tag processor. + - type: required-tags + id: "missing required tag" + # The tag type used when generating a new tag missing values + tagType: "MISSING_REQUIRED_TAG" + # The processing scope. ITEM or GLOBAL. Default is ITEM. + # ITEM Scope = tags must exist across all content items + processingScope: GLOBAL + # The namespaces of the required tags + requiredNamespaces: [*classificationAttributeFQN, + *relToAttributeFQN] + # Content types should have metadata treated as a separate input requirement + requireMetadataTypes: ["message/rfc822"] + # Dynamic value that's injected. + tagValue: "virtru:block" + - id: "test tag mismatch between tags in an (email body or header) and an email attachment" + type: tag-mismatch + inputs: + # Any type, any value, Has source from email header OR an email body + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822"] + itemIdRegex: >- + Message:Raw-Header + - itemTypes: ["message/rfc822"] + # Any tag from an email attachment + - tagTypes: [] + tagValues: [] + tagSources: + - itemTypes: ["message/rfc822.attachment"] + tagTemplate: + value: "virtru:warn" + type: "tag-mismatch" + + # Reduces tag set + rollupRules: + # Processor Type: "std-rollup" processor: + # - Rolls up tags based on attribute definitions + # - Rolls up restrictive ("allOf") tags across all content sources as a "union". + # - Rolls up permissive ("anyOf") tags across all content sources as an "intersection"; Optional group aliases are used here. + # - Rolls up "hierarchy" tags using a "High Watermark" approach. + # - Case-insensitive matching on attribute values. Case is corrected when attribute definitions exists for the given tag value + # - Values not matching an attribute definition are allowed to pass through (default behavior) + + - type: "std-rollup" + id: "standard rollup" + # Treat items of type "message/rfc822" (email) message metadata as a separate bucket of content + metadataItemTypes: ["message/rfc822"] + # Should intra-content items be rolled up - default is false + intraContentRollup: true + # aliasRollupMode: 3 options Control mode for handling aliases + # - BOTH = Default, both an alias and its members are kept after rollup rules are applied + # - ALIAS = only the alias value is kept and members are dropped after rollup rules are applied. Only if all members are present for the alias + # - MEMBER = drops an alias value if all member values are present. + aliasRollupMode: ALIAS + # Require a rollup alias to appear at least once in the intersected value list - default = false + requireAliasInValues: false + # Group aliases + attributeValueMembers: + - value: + fqn: "https://demo.com/attr/relto/value/FVEY" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "NZL" + - value: "CAN" + - value: + fqn: "https://demo.com/attr/relto/value/PINK" + members: + - value: "USA" + - value: "GBR" + - value: "AUS" + - value: "CAN" + - value: "NZL" + - value: "BEL" + - value: "DNK" + - value: "FRA" + - value: "ITA" + - value: "NOR" + - value: "PRT" + - value: "HRV" + - value: "CZE" + - value: "POL" + - value: "ROU" + - value: "DEU" + - value: "ESP" + - value: "TUR" + - value: "SWE" + - value: "FIN" + - value: "AUT" + + - value: + fqn: "https://demo.com/attr/relto/value/NATO" + members: + - value: "ALB" + - value: "BEL" + - value: "BGR" + - value: "CAN" + - value: "HRV" + - value: "CZE" + - value: "DNK" + - value: "EST" + - value: "FRA" + - value: "DEU" + - value: "GRC" + - value: "HUN" + - value: "ISL" + - value: "ITA" + - value: "LVA" + - value: "LTU" + - value: "LUX" + - value: "MNE" + - value: "NLD" + - value: "MKD" + - value: "NOR" + - value: "POL" + - value: "PRT" + - value: "ROU" + - value: "SVK" + - value: "SVN" + - value: "ESP" + - value: "TUR" + - value: "GBR" + - value: "USA" + + # Link non attributes to attributes for rollup + tagLinks: + - src: "Classification" + target: *classificationAttributeFQN + - src: "needToKnow" + target: *needToKnowAttributeFQN + - src: "releasableTo" + target: *relToAttributeFQN + + # Processor Type: "drop-duplicates" processor: Merges duplicate tags + - type: "drop-duplicates" + id: "drop duplicate values" + - type: stanag5636-assertions + id: "urn:nato:stanag:5636:A:1:elements:json" + assertionType: "urn:nato:stanag:5636:A:1:elements:json" + assertionFormat: "json+stanag5636" + attributeInputs: *snag5636-attributeInputs + icedhAssertionType: "urn:us:gov:ic:edh" + # Validation ~ min required metadata fields + requiredMetadata: + name: "fvey-minimum-metadata-example" + jsonPathExpressions: + # require a "releasable to" conf. label category + - "$.ocl.catl[?(@.name == 'Releasable To')]" + # require policy identifier + - "$.ocl.pol" + # require classification + - "$.ocl.cls" + # require date created + - "$.ocl.dcr" + - type: icedh-assertions + id: "urn:us:gov:ic:edh" + assertionType: "urn:us:gov:ic:edh" + assertionFormat: "ic-edh+xml" + # generate assertion only when requested + requireAssertionOption: true + mappings: *stanag-icedh-mappings diff --git a/common-operating-picture/ubuntu_cop_keys.sh b/common-operating-picture/ubuntu_cop_keys.sh new file mode 100755 index 0000000..266a3ef --- /dev/null +++ b/common-operating-picture/ubuntu_cop_keys.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Installs all keys for the Virtru DSP COP on Ubuntu 24.04 LTS + +set -e + +echo "=== Making dsp-keys/ Directory ===" +mkdir -p dsp-keys 2> /dev/null + +echo "=== Installing CA Authority ===" +if ! command -v mkcert &> /dev/null +then + echo "ERROR: mkcert is not installed." + echo "Please ensure all prerequisites are installed. Run the ./ubuntu_cop_prereqs_cop.sh script." + exit 1 +fi +mkcert -install + +echo "=== Generating Certs ===" +mkcert -cert-file dsp-keys/local-dsp.virtru.com.pem \ +-key-file dsp-keys/local-dsp.virtru.com.key.pem local-dsp.virtru.com "*.local-dsp.virtru.com" localhost + +# Check for OpenJDK 17 +echo "=== Installing OpenJDK 17 ===" + +if command -v java >/dev/null 2>&1 && java -version 2>&1 | grep -q 'version "17\.' ; then + echo "OpenJDK 17 is already installed." +else + echo "Installing OpenJDK 17..." + sudo apt update + sudo apt install openjdk-17-jdk -y +fi + +# Generate keys for KAS and PolicyImportExport artifact signing +echo "=== Generating keys for KAS and PolicyImportExport artifact signing ===" +./.github/scripts/init-temp-keys.sh + +# Generate temporary x509 certificates +echo "=== Generating Temporary x509 Certificates ===" +bash ./.github/scripts/x509-temp-keys.sh + +# Set permissions for key files +chmod 644 dsp-keys/local-dsp.virtru.com.key.pem \ +dsp-keys/local-dsp.virtru.com.pem \ +dsp-keys/kas-ec-cert.pem \ +dsp-keys/kas-ec-private.pem \ +dsp-keys/kas-cert.pem \ +dsp-keys/kas-private.pem + +# ------------------------------------------------------------ +# Post-install instructions +# ------------------------------------------------------------ +echo "====================================" +echo -e " + \033[1;32m\033[1m CCCCCC\033[0m \033[1;32m\033[1m OOOO\033[0m \033[1;32m\033[1m PPPPPP\033[0m + \033[1;32m\033[1m CCC CC\033[0m \033[1;32m\033[1mOO OO\033[0m \033[1;32m\033[1m PP PP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m OO OO\033[0m \033[1;32m\033[1mPP PP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m O O\033[0m \033[1;32m\033[1mPPPPPP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m OO OO\033[0m \033[1;32m\033[1mPP\033[0m + \033[1;32m\033[1m CCC CC\033[0m \033[1;32m\033[1mOO OO\033[0m \033[1;32m\033[1m PP\033[0m + \033[1;32m\033[1m CCCCCC\033[0m \033[1;32m\033[1m OOOO\033[0m \033[1;32m\033[1m PP\033[0m + +\033[1;33m***\033[0m \033[1;4m\033[1;32mCOMMON OPERATING PICTURE\033[0m \033[1;33m***\033[0m +" +echo "====================================" +echo "=== Key Setup Complete! ===" +echo "====================================" + + diff --git a/common-operating-picture/ubuntu_cop_prereqs_cop.sh b/common-operating-picture/ubuntu_cop_prereqs_cop.sh new file mode 100755 index 0000000..92403f2 --- /dev/null +++ b/common-operating-picture/ubuntu_cop_prereqs_cop.sh @@ -0,0 +1,131 @@ +#!/bin/bash +# Installs all prerequisite software for the Virtru DSP COP on Ubuntu 24.04 LTS + +set -e + +echo "=== Updating system packages ===" +sudo apt update -y && sudo apt upgrade -y + +#echo "=== Installing packages for Virtualbox ===" +#sudo apt install -y \ +# open-vm-tools-desktop \ +# virtualbox-guest-additions-iso \ +# virtualbox-ext-pack + +echo "=== Installing core dependencies ===" +sudo apt install -y \ + build-essential \ + curl \ + wget \ + git \ + make \ + ca-certificates \ + apt-transport-https \ + gnupg \ + lsb-release \ + software-properties-common \ + python3 \ + python3-pip + +# ------------------------------------------------------------ +# Docker (runtime + compose) +# ------------------------------------------------------------ +echo "=== Installing Docker and Docker Compose ===" +if ! command -v docker &> /dev/null; then + sudo apt remove -y docker docker-engine docker.io containerd runc || true + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \ + https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt update -y + sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +fi + +sudo systemctl enable --now docker +sudo usermod -aG docker "$USER" + +# ------------------------------------------------------------ +# Node.js (LTS) + npm + nvm +# ------------------------------------------------------------ +echo "=== Installing Node.js (LTS) ===" +if ! command -v node &> /dev/null; then + curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - + sudo apt install -y nodejs +fi + +echo "=== Installing nvm (Node Version Manager) ===" +if [ ! -d "$HOME/.nvm" ]; then + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + nvm install --lts +fi + +# ------------------------------------------------------------ +# Go (Golang) +# ------------------------------------------------------------ +echo "=== Installing Go (Golang) ===" +GO_VERSION="1.23.2" +if ! command -v go &> /dev/null; then + wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz + sudo rm -rf /usr/local/go + sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz + echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc + rm go${GO_VERSION}.linux-amd64.tar.gz +fi + +# ------------------------------------------------------------ +# GEOS (Geometry Engine Open Source) +# ------------------------------------------------------------ +echo "=== Installing GEOS ===" +sudo apt install -y libgeos-dev pkg-config + +# ------------------------------------------------------------ +# mkcert (Local TLS Certificates) +# ------------------------------------------------------------ +echo "=== Installing mkcert ===" +sudo apt install -y libnss3-tools +if ! command -v mkcert &> /dev/null; then + wget https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-v1.4.4-linux-amd64 + sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert + sudo chmod +x /usr/local/bin/mkcert +fi + +# ------------------------------------------------------------ +# Add local-dsp.virtru.com to /etc/hosts if not already present +# ------------------------------------------------------------ +echo "=== Ensuring local-dsp.virtru.com is mapped in /etc/hosts ===" +if ! grep -q "local-dsp\.virtru\.com" /etc/hosts; then + echo "127.0.0.1 local-dsp.virtru.com" | sudo tee -a /etc/hosts > /dev/null + echo "Added entry: 127.0.0.1 local-dsp.virtru.com" +else + echo "Entry already exists — skipping." +fi + +# ------------------------------------------------------------ +# Post-install instructions +# ------------------------------------------------------------ +echo "====================================" +echo -e " + \033[1;32m\033[1m CCCCCC\033[0m \033[1;32m\033[1m OOOO\033[0m \033[1;32m\033[1m PPPPPP\033[0m + \033[1;32m\033[1m CCC CC\033[0m \033[1;32m\033[1mOO OO\033[0m \033[1;32m\033[1m PP PP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m OO OO\033[0m \033[1;32m\033[1mPP PP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m O O\033[0m \033[1;32m\033[1mPPPPPP\033[0m + \033[1;32m\033[1m CC\033[0m \033[1;32m\033[1m OO OO\033[0m \033[1;32m\033[1mPP\033[0m + \033[1;32m\033[1m CCC CC\033[0m \033[1;32m\033[1mOO OO\033[0m \033[1;32m\033[1m PP\033[0m + \033[1;32m\033[1m CCCCCC\033[0m \033[1;32m\033[1m OOOO\033[0m \033[1;32m\033[1m PP\033[0m + +\033[1;33m***\033[0m \033[1;4m\033[1;32mCOMMON OPERATING PICTURE\033[0m \033[1;33m***\033[0m +" +echo "====================================" +echo "=== Prerequisite Setup Complete! ===" +echo "" +echo "To Finalize COP Setup Follow:" +echo "" +echo "1. Reboot or log out/in for Docker group and ~/.bashrc changes to take effect." +echo "2. Continue to Step 1 in startupInstructions.md/README.md to start the COP services." +echo "" +echo "====================================" + + diff --git a/common-operating-picture/ui/package-lock.json b/common-operating-picture/ui/package-lock.json index 3d2a509..b493d0f 100644 --- a/common-operating-picture/ui/package-lock.json +++ b/common-operating-picture/ui/package-lock.json @@ -17,10 +17,12 @@ "@mui/material": "^5.15.15", "@mui/x-date-pickers": "^7.6.1", "@opentdf/client": "^2.0.0-beta.1515", + "@opentdf/sdk": "^0.4.0", "@rjsf/core": "^5.18.3", "@rjsf/mui": "^5.18.3", "@rjsf/utils": "^5.18.3", "@rjsf/validator-ajv8": "^5.18.3", + "@virtru/dsp-sdk": "^0.2.2", "chroma-js": "^2.4.2", "dayjs": "^1.11.11", "jwt-decode": "^4.0.0", @@ -52,45 +54,31 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "typescript": "^5.2.2", - "vite": "^6.4.1", + "vite": "^6.3.4", "vite-plugin-static-copy": "^2.3.2" }, "engines": { "node": ">=20.12.2" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -98,22 +86,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -146,15 +134,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -162,14 +150,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -188,29 +176,38 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -220,9 +217,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -230,27 +227,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -258,26 +255,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -287,13 +284,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -303,13 +300,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -319,94 +316,95 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bufbuild/protobuf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.9.0.tgz", - "integrity": "sha512-W7gp8Q/v1NlCZLsv8pQ3Y0uCu/SHgXOVFK+eUluUKWXmsb6VHkpNx0apdOWWcDbB9sJoKeP8uPrjmehJz6xETQ==" + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.1.tgz", + "integrity": "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==", + "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@connectrpc/connect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-1.4.0.tgz", - "integrity": "sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-1.7.0.tgz", + "integrity": "sha512-iNKdJRi69YP3mq6AePRT8F/HrxWCewrhxnLMNm0vpqXAR8biwzRtO6Hjx80C6UvtKJ5sFmffQT7I4Baecz389w==", + "license": "Apache-2.0", "peerDependencies": { - "@bufbuild/protobuf": "^1.4.2" + "@bufbuild/protobuf": "^1.10.0" } }, "node_modules/@connectrpc/connect-web": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-1.4.0.tgz", - "integrity": "sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-1.7.0.tgz", + "integrity": "sha512-qyP0YOnUPRWwCc/VfsoydMJvkb7EyUPr2q9sHgBuJzbADjiqck1gKH5V5ZPzPhTLBvmz5UvG+wiZ5sMRQHU1MQ==", + "license": "Apache-2.0", "peerDependencies": { - "@bufbuild/protobuf": "^1.4.2", - "@connectrpc/connect": "1.4.0" + "@bufbuild/protobuf": "^1.10.0", + "@connectrpc/connect": "1.7.0" } }, "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -416,47 +414,52 @@ } }, "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@emotion/memoize": "^0.9.0" } }, "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -469,33 +472,36 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.11.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", - "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -508,32 +514,36 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -548,9 +558,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -565,9 +575,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -582,9 +592,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -599,9 +609,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -616,9 +626,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -633,9 +643,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -650,9 +660,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -667,9 +677,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -684,9 +694,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -701,9 +711,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -718,9 +728,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -735,9 +745,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -752,9 +762,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -769,9 +779,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -786,9 +796,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -803,9 +813,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -820,9 +830,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -837,9 +847,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -854,9 +864,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -871,9 +881,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -887,10 +897,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -905,9 +932,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -922,9 +949,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -939,9 +966,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -956,25 +983,30 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -984,6 +1016,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1007,6 +1040,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1029,32 +1063,19 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1063,55 +1084,24 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", - "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", - "dependencies": { - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" - }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -1135,6 +1125,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1147,6 +1138,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1159,20 +1151,29 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1184,66 +1185,26 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.20.tgz", - "integrity": "sha512-DoL2ppgldL16utL8nNyj/P12f8mCNdx/Hb/AJnX9rLY4b52hCMIx1kH83pbXQ6uMy6n54M3StmEbvSGoj2OFuA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", "license": "MIT", "funding": { "type": "opencollective", @@ -1251,9 +1212,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.20.tgz", - "integrity": "sha512-oGcKmCuHaYbAAoLN67WKSXtHmEgyWcJToT1uRtmPyxMj9N5uqwc/mRtEnst4Wj/eGr+zYH2FiZQ79v9k7kSk1Q==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.18.0.tgz", + "integrity": "sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9" @@ -1267,8 +1228,8 @@ }, "peerDependencies": { "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1277,22 +1238,22 @@ } }, "node_modules/@mui/material": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz", - "integrity": "sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.20", - "@mui/system": "^5.15.20", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.20", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^18.2.0", + "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "engines": { @@ -1305,9 +1266,9 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1321,14 +1282,14 @@ } } }, - "node_modules/@mui/private-theming": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz", - "integrity": "sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==", + "node_modules/@mui/material/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.20", + "@mui/utils": "^5.17.1", "prop-types": "^15.8.1" }, "engines": { @@ -1339,8 +1300,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1348,13 +1309,15 @@ } } }, - "node_modules/@mui/styled-engine": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", - "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "node_modules/@mui/material/node_modules/@mui/styled-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, @@ -1368,7 +1331,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1379,17 +1342,17 @@ } } }, - "node_modules/@mui/system": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz", - "integrity": "sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==", + "node_modules/@mui/material/node_modules/@mui/system": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.20", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.20", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1404,8 +1367,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1419,12 +1382,27 @@ } } }, - "node_modules/@mui/types": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", - "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "node_modules/@mui/private-theming": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz", + "integrity": "sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1432,27 +1410,48 @@ } } }, - "node_modules/@mui/utils": { - "version": "5.15.20", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz", - "integrity": "sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==", + "node_modules/@mui/private-theming/node_modules/@mui/types": { + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz", + "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==", "license": "MIT", + "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/@mui/utils": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz", + "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/types": "^7.4.9", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "react-is": "^19.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1460,19 +1459,19 @@ } } }, - "node_modules/@mui/x-date-pickers": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.6.1.tgz", - "integrity": "sha512-erSq5cnOUyBgBmpHnMxIit5yhT3bl/lOaNZKpObvJtvEJetvNA9xWQ7dz/J/AufLzDuvThjusuRD0y+GmeXtiw==", - "dependencies": { - "@babel/runtime": "^7.24.6", - "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.15", - "@mui/utils": "^5.15.14", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" + "node_modules/@mui/styled-engine": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz", + "integrity": "sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { "node": ">=14.0.0" @@ -1482,18 +1481,9 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14", - "date-fns": "^2.25.0 || ^3.2.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1501,40 +1491,239 @@ }, "@emotion/styled": { "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz", + "integrity": "sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/private-theming": "^7.3.6", + "@mui/styled-engine": "^7.3.6", + "@mui/types": "^7.4.9", + "@mui/utils": "^7.3.6", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { "optional": true }, - "moment-hijri": { + "@emotion/styled": { "optional": true }, - "moment-jalaali": { + "@types/react": { "optional": true } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@mui/system/node_modules/@mui/types": { + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz", + "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==", + "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/runtime": "^7.28.4" }, - "engines": { + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/utils": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz", + "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/types": "^7.4.9", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz", + "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0", + "@mui/x-internals": "7.29.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2 || ^3.0.0", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz", + "integrity": "sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { "node": ">= 8" } }, @@ -1542,7 +1731,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -1551,7 +1740,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1561,9 +1750,11 @@ } }, "node_modules/@opentdf/client": { - "version": "2.0.0-beta.1515", - "resolved": "https://registry.npmjs.org/@opentdf/client/-/client-2.0.0-beta.1515.tgz", - "integrity": "sha512-pLeU/cddtx2sQWvAWQC4TezCaExSr9k+lfWsAhrS6YOb+U+OXYNtXPocnN2E83macXuiNUs9YYsF/aN47MasZw==", + "version": "2.0.0-beta.1623", + "resolved": "https://registry.npmjs.org/@opentdf/client/-/client-2.0.0-beta.1623.tgz", + "integrity": "sha512-OmaEAL9tHcbxuH4dWq6pLVGCz09yt7PHuFGeR5Q5KwqW8acfB1elNsQCeyK4wzASjfJivYcCimtsXkr69Iq47A==", + "deprecated": "Package no longer supported. To get the most up to date features move to https://www.npmjs.com/package/@opentdf/sdk", + "license": "BSD-3-Clause-Clear", "dependencies": { "axios": "^1.6.1", "axios-retry": "^3.9.0", @@ -1574,14 +1765,88 @@ "dpop": "^1.2.0", "eventemitter3": "^5.0.1", "jose": "^4.14.4", + "json-canonicalize": "^1.0.6", "streamsaver": "^2.0.6", "uuid": "~9.0.0" } }, + "node_modules/@opentdf/sdk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentdf/sdk/-/sdk-0.4.0.tgz", + "integrity": "sha512-tP28IZFWukne0K6aUEcDf23x5nfB7X4+eGu9izGkaBy74I6GNBp5kAHTBYOOHs0gH72liI7fyQU01NKGjdw0pw==", + "license": "BSD-3-Clause-Clear", + "dependencies": { + "@connectrpc/connect": "^2.0.2", + "@connectrpc/connect-web": "^2.0.2", + "buffer-crc32": "^1.0.0", + "dpop": "^1.4.1", + "jose": "^6.0.8", + "json-canonicalize": "^1.0.6", + "uuid": "~11.1.0" + } + }, + "node_modules/@opentdf/sdk/node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "license": "(Apache-2.0 AND BSD-3-Clause)", + "peer": true + }, + "node_modules/@opentdf/sdk/node_modules/@connectrpc/connect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.1.1.tgz", + "integrity": "sha512-JzhkaTvM73m2K1URT6tv53k2RwngSmCXLZJgK580qNQOXRzZRR/BCMfZw3h+90JpnG6XksP5bYT+cz0rpUzUWQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0" + } + }, + "node_modules/@opentdf/sdk/node_modules/@connectrpc/connect-web": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-2.1.1.tgz", + "integrity": "sha512-J8317Q2MaFRCT1jzVR1o06bZhDIBmU0UAzWx6xOIXzOq8+k71/+k7MUF7AwcBUX+34WIvbm5syRgC5HXQA8fOg==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0", + "@connectrpc/connect": "2.1.1" + } + }, + "node_modules/@opentdf/sdk/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentdf/sdk/node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@opentdf/sdk/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1591,6 +1856,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "license": "Hippocratic-2.1", "peerDependencies": { "leaflet": "^1.9.0", "react": "^18.0.0", @@ -1598,53 +1864,56 @@ } }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz", + "integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@rjsf/core": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.18.4.tgz", - "integrity": "sha512-OUPC+l44X1geYT9sSsmQC2pakvFWCQB+5Iy/ITfLMJq3MIjJn0gakCwYHXMMBGUAKM1SSMIyKWyCazt3kY9fhg==", + "version": "5.24.13", + "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.24.13.tgz", + "integrity": "sha512-ONTr14s7LFIjx2VRFLuOpagL76sM/HPy6/OhdBfq6UukINmTIs6+aFN0GgcR0aXQHFDXQ7f/fel0o/SO05Htdg==", + "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21", "lodash-es": "^4.17.21", "markdown-to-jsx": "^7.4.1", - "nanoid": "^3.3.7", "prop-types": "^15.8.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@rjsf/utils": "^5.18.x", + "@rjsf/utils": "^5.24.x", "react": "^16.14.0 || >=17" } }, "node_modules/@rjsf/mui": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/@rjsf/mui/-/mui-5.18.4.tgz", - "integrity": "sha512-SDKBcp/LOCdb8Rn4f4mBiEV8M+FCFQWK8KB4ymyzqjB5/2sVf5rw9u7o84SSXmdnQKt4SAztQf3Sd8tLhEzvPg==", + "version": "5.24.13", + "resolved": "https://registry.npmjs.org/@rjsf/mui/-/mui-5.24.13.tgz", + "integrity": "sha512-KGh90HRGkU1OIvnkB9IOOXYqpzgxkduQYwPq3oj9Wl4KcNdFsfGjGofqSfvrO68mNfrDE4ouAD4MPePTVEtKyg==", + "license": "Apache-2.0", "engines": { "node": ">=14" }, "peerDependencies": { "@emotion/react": "^11.7.0", "@emotion/styled": "^11.6.0", - "@mui/icons-material": "^5.2.0", - "@mui/material": "^5.2.2", - "@rjsf/core": "^5.18.x", - "@rjsf/utils": "^5.18.x", + "@mui/icons-material": "^5.2.0 || ^6.0.0", + "@mui/material": "^5.2.2 || ^6.0.0", + "@rjsf/core": "^5.24.x", + "@rjsf/utils": "^5.24.x", "react": ">=17" } }, "node_modules/@rjsf/utils": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.18.4.tgz", - "integrity": "sha512-svLMk5aW6q3JQRYVTJradFc9tLeQ1vX5/k6fPwxf+08eweqPbINq7aokLBSStUNr8FfYgThTl8IfehLoVP2dvw==", + "version": "5.24.13", + "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-5.24.13.tgz", + "integrity": "sha512-rNF8tDxIwTtXzz5O/U23QU73nlhgQNYJ+Sv5BAwQOIyhIE2Z3S5tUiSVMwZHt0julkv/Ryfwi+qsD4FiE5rOuw==", + "license": "Apache-2.0", "dependencies": { "json-schema-merge-allof": "^0.8.1", "jsonpointer": "^5.0.1", @@ -1659,10 +1928,17 @@ "react": "^16.14.0 || >=17" } }, + "node_modules/@rjsf/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/@rjsf/validator-ajv8": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.18.4.tgz", - "integrity": "sha512-D0bUtruWbUmXG8z3VBbCky0Cx65rmcdG/QypB9ri5YTSNTQIxuq28StBpZUZn84CO/oMOtociGy4afW1aj5C0g==", + "version": "5.24.13", + "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-5.24.13.tgz", + "integrity": "sha512-oWHP7YK581M8I5cF1t+UXFavnv+bhcqjtL1a7MG/Kaffi0EwhgcYjODrD8SsnrhncsEYMqSECr4ZOEoirnEUWw==", + "license": "Apache-2.0", "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", @@ -1673,14 +1949,22 @@ "node": ">=14" }, "peerDependencies": { - "@rjsf/utils": "^5.18.x" + "@rjsf/utils": "^5.24.x" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-yaml": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz", "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "js-yaml": "^4.1.0", @@ -1699,14 +1983,15 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -1721,9 +2006,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", "cpu": [ "arm" ], @@ -1735,9 +2020,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", "cpu": [ "arm64" ], @@ -1749,9 +2034,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", "cpu": [ "arm64" ], @@ -1763,9 +2048,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", "cpu": [ "x64" ], @@ -1777,9 +2062,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", "cpu": [ "arm64" ], @@ -1791,9 +2076,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", "cpu": [ "x64" ], @@ -1805,9 +2090,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", "cpu": [ "arm" ], @@ -1819,9 +2104,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", "cpu": [ "arm" ], @@ -1833,9 +2118,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", "cpu": [ "arm64" ], @@ -1847,9 +2132,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", "cpu": [ "arm64" ], @@ -1860,10 +2145,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", "cpu": [ "loong64" ], @@ -1874,10 +2159,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", "cpu": [ "ppc64" ], @@ -1889,9 +2174,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", "cpu": [ "riscv64" ], @@ -1903,9 +2202,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", "cpu": [ "s390x" ], @@ -1917,9 +2216,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", "cpu": [ "x64" ], @@ -1931,9 +2230,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", "cpu": [ "x64" ], @@ -1944,10 +2243,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", "cpu": [ "arm64" ], @@ -1959,9 +2272,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", "cpu": [ "ia32" ], @@ -1972,10 +2285,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", "cpu": [ "x64" ], @@ -1986,11 +2313,171 @@ "win32" ] }, + "node_modules/@rushstack/heft": { + "version": "0.50.7", + "resolved": "https://registry.npmjs.org/@rushstack/heft/-/heft-0.50.7.tgz", + "integrity": "sha512-6RJ/4Rw7zoKU8O/eJrnxm/v9VDnLnV3256iiRhVpogkYwgYPiSyHPm623BqNtGNCXUhZzAZL/Wy8OKuh0ofcHw==", + "license": "MIT", + "dependencies": { + "@rushstack/heft-config-file": "0.12.3", + "@rushstack/node-core-library": "3.59.2", + "@rushstack/rig-package": "0.3.19", + "@rushstack/ts-command-line": "4.13.3", + "@types/tapable": "1.0.6", + "argparse": "~1.0.9", + "chokidar": "~3.4.0", + "fast-glob": "~3.2.4", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "prettier": "~2.3.0", + "semver": "~7.3.0", + "tapable": "1.1.3", + "true-case-path": "~2.2.1" + }, + "bin": { + "heft": "bin/heft" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@rushstack/heft-config-file": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.12.3.tgz", + "integrity": "sha512-69t0A/fcSSAih/qRA/FJYh0qSoBKtB7WhpLDz3UXvdSTVxIKLazYU9Rvnic8sK9krm8xTjRUpHQx5AnWKFlKxw==", + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "3.59.2", + "@rushstack/rig-package": "0.3.19", + "jsonpath-plus": "~4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@rushstack/heft/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/heft/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/heft/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.59.2.tgz", + "integrity": "sha512-Od8i9ZXiRPHrnkuNOZ9IjEYRQ9JsBLNHlkWJr1wSQZrD2TVIc8APpIB/FnzEcjfpbJMT4XhtcCZaa0pVx+hTXw==", + "license": "MIT", + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.19.tgz", + "integrity": "sha512-2d0/Gn+qjOYneZbiHjn4SjyDwq9I0WagV37z0F1V71G+yONgH7wlt3K/UoNiDkhA8gTHYPRo2jz3CvttybwSag==", + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.3.tgz", + "integrity": "sha512-6aQIv/o1EgsC/+SpgUyRmzg2QIAL6sudEzw3sWzJKwWuQTc5XRsyZpyldfE7WAmIqMXDao9QG35/NYORjHm5Zw==", + "license": "MIT", + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2000,10 +2487,11 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2013,112 +2501,129 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/chroma-js": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.4.tgz", - "integrity": "sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==", - "dev": true + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.5.tgz", + "integrity": "sha512-6ISjhzJViaPCy2q2e6PgK+8HcHQDQ0V2LDiKmYAh+jJlLqDa6HbwDh0wOevHY0kHHUx0iZwjSRbVD47WOUx5EQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "dev": true + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/leaflet": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.12.tgz", - "integrity": "sha512-BK7XS+NyRI291HIo0HCfE18Lp8oA30H1gpi1tf0mF3TgiCEzanQjOqNZ4x126SXzzi2oNSZhZ5axJp1k0iM6jg==", + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", - "dev": true + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", - "dev": true, + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "devOptional": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, + "node_modules/@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", - "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/type-utils": "7.11.0", - "@typescript-eslint/utils": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2141,67 +2646,17 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", - "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { @@ -2220,76 +2675,15 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", - "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2300,14 +2694,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", - "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2327,10 +2721,10 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "license": "MIT", "engines": { @@ -2341,15 +2735,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2370,35 +2764,17 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", - "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2411,15 +2787,15 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", - "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2429,98 +2805,127 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "ISC" }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@virtru/dsp-sdk": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@virtru/dsp-sdk/-/dsp-sdk-0.2.2.tgz", + "integrity": "sha512-B8fT682KGkeMFuQq0++Y880xwiWlu3abUWICoEsBLyn2+FBdsJ415PLWmkdkf+j79jl7GcZzB69HdnX/jLRbrQ==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@bufbuild/protobuf": "^2.7.0", + "@connectrpc/connect": "~2.0.2", + "@connectrpc/connect-web": "~2.0.2", + "@opentdf/sdk": "0.6.0-rc.54", + "@rushstack/heft": "^0.50.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "license": "MIT", + "node_modules/@virtru/dsp-sdk/node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@virtru/dsp-sdk/node_modules/@connectrpc/connect": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.0.4.tgz", + "integrity": "sha512-E3EDUMHDdLKVYRxaGbb/MWImZUiGiPQgoehigCvy0NtMTiAn9AQIz/an1689b7mFbkMIXztPHwSNsvtqRPHhqQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^2.2.0" + } + }, + "node_modules/@virtru/dsp-sdk/node_modules/@connectrpc/connect-web": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-2.0.4.tgz", + "integrity": "sha512-wMiStHClk7YopPIrmFvgviPjHeFpiNGykPxuVIi6leGTpg/GKx317tsN5GySX46iV7RrnESOvAyuisQtJXO99w==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^2.2.0", + "@connectrpc/connect": "2.0.4" + } + }, + "node_modules/@virtru/dsp-sdk/node_modules/@opentdf/sdk": { + "version": "0.6.0-rc.54", + "resolved": "https://registry.npmjs.org/@opentdf/sdk/-/sdk-0.6.0-rc.54.tgz", + "integrity": "sha512-DUKkw18uF2zprrU2RAe8iYKd/Y4/i4k7P3yolRLwsNTfGrMhKzfvl3rWNucKVrD8nyCrHh45vYeAUg7NR/KEwQ==", + "license": "BSD-3-Clause-Clear", "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, + "@connectrpc/connect": "^2.0.2", + "@connectrpc/connect-web": "^2.0.2", + "buffer-crc32": "^1.0.0", + "dpop": "^1.4.1", + "jose": "^6.0.8", + "json-canonicalize": "^1.0.6", + "uuid": "~11.1.0" + } + }, + "node_modules/@virtru/dsp-sdk/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" - }, + "node": ">=8.0.0" + } + }, + "node_modules/@virtru/dsp-sdk/node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@virtru/dsp-sdk/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2533,19 +2938,21 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2556,6 +2963,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -2573,15 +2981,32 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2590,20 +3015,36 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -2613,17 +3054,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2637,6 +3081,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2646,6 +3091,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2662,15 +3108,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2680,15 +3127,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2715,19 +3163,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -2736,16 +3184,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2757,9 +3217,9 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -2771,6 +3231,7 @@ "version": "3.9.1", "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.15.4", "is-retry-allowed": "^2.2.0" @@ -2780,6 +3241,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -2794,7 +3256,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -2813,13 +3275,24 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2841,7 +3314,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2852,12 +3325,13 @@ "node_modules/browser-fs-access": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.34.1.tgz", - "integrity": "sha512-HPaRf2yimp8kWSuWJXc8Mi78dPbDzfduA+Gyq14H4jlMvd6XNfIRm36Y2yRLaa4x0gwcGuepj4zf14oiTlxrxQ==" + "integrity": "sha512-HPaRf2yimp8kWSuWJXc8Mi78dPbDzfduA+Gyq14H4jlMvd6XNfIRm36Y2yRLaa4x0gwcGuepj4zf14oiTlxrxQ==", + "license": "Apache-2.0" }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -2875,10 +3349,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -2905,6 +3380,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2914,21 +3390,22 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -2950,18 +3427,36 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", "dev": true, "funding": [ { @@ -2979,59 +3474,93 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" }, "engines": { - "node": ">= 6" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" } }, "node_modules/chroma-js": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", - "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.6.0.tgz", + "integrity": "sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==", + "license": "(BSD-3-Clause AND Apache-2.0)" }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3039,6 +3568,16 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/compute-gcd": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", @@ -3064,17 +3603,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "license": "MIT" }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -3100,6 +3641,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3110,19 +3652,21 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3132,29 +3676,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -3166,17 +3712,18 @@ } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3191,13 +3738,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3215,6 +3764,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3231,6 +3781,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3240,6 +3791,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3252,6 +3804,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3263,15 +3816,17 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "node_modules/dpop": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dpop/-/dpop-1.4.0.tgz", - "integrity": "sha512-r//f6g3uaDdomkz+3M0NdcEAxSGUVMIhF7lxf06aJZjCFhkH//GeZo6JWpz7Uv025s1w/+M5RDNRGxAGNIzm0g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dpop/-/dpop-1.4.1.tgz", + "integrity": "sha512-+Cus+OlLk9uFWbPZX/RsLpMviYAmyJpJpooto2NDQ0lnk0/S2TblPunC4nVtETOxCIsXvu4YILIOPC7LIHHXIg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -3291,72 +3846,82 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.114", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz", - "integrity": "sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -3378,30 +3943,34 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -3434,24 +4003,29 @@ "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3461,9 +4035,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3474,31 +4048,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -3515,6 +4090,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3523,16 +4099,18 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3578,29 +4156,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -3615,6 +4193,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3623,12 +4202,13 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz", - "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==", + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", "dev": true, + "license": "MIT", "peerDependencies": { - "eslint": ">=7" + "eslint": ">=8.40" } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { @@ -3701,6 +4281,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3717,6 +4298,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3729,6 +4311,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3740,21 +4323,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -3766,75 +4334,32 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "is-glob": "^4.0.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3842,23 +4367,12 @@ "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3872,10 +4386,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3888,6 +4403,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3900,6 +4416,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3908,13 +4425,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3922,18 +4441,20 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3945,44 +4466,69 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -3994,7 +4540,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4005,13 +4551,15 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4028,6 +4576,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -4038,21 +4587,23 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4063,18 +4614,25 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4088,31 +4646,31 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=14.14" + "node": ">=6 <7 || >=8" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4125,20 +4683,24 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -4152,10 +4714,21 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4204,14 +4777,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4221,42 +4795,48 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.1.1", + "minimatch": "^3.0.2", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-escape": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/glob-escape/-/glob-escape-0.0.2.tgz", + "integrity": "sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4267,7 +4847,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4276,12 +4856,19 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -4289,6 +4876,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4305,6 +4893,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4336,28 +4925,44 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4366,10 +4971,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4393,6 +5002,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4407,6 +5017,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4418,6 +5029,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -4425,7 +5037,8 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/ieee754": { "version": "1.2.1", @@ -4444,21 +5057,24 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4470,11 +5086,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -4484,7 +5110,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4494,30 +5120,33 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4529,15 +5158,21 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4547,12 +5182,16 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4562,7 +5201,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4571,13 +5210,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4591,6 +5231,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4599,22 +5240,29 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -4625,12 +5273,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4643,30 +5293,39 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4679,7 +5338,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4692,6 +5351,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4704,6 +5364,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4715,18 +5376,20 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4740,18 +5403,22 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4764,6 +5431,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4776,6 +5444,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4784,12 +5453,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4799,12 +5469,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4814,12 +5486,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4829,12 +5504,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -4848,6 +5524,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4856,25 +5533,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4887,44 +5569,60 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "license": "MIT" + }, "node_modules/jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-sha256": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz", - "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==" + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.1.tgz", + "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", @@ -4939,6 +5637,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -4955,17 +5660,26 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/json-canonicalize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/json-canonicalize/-/json-canonicalize-1.2.0.tgz", + "integrity": "sha512-TTdjBvqrqJKSADlEsY5rWbx8/1tOrVlTR/aSLU8N2VSInCTffP0p+byYB8Es+OmL4ZOeEftjUdvV+eJeSzJC/Q==", + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-compare": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.4" } @@ -4974,6 +5688,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "license": "MIT", "dependencies": { "compute-lcm": "^1.1.2", "json-schema-compare": "^0.2.2", @@ -4986,13 +5701,15 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -5008,21 +5725,28 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath-plus": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", + "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==", + "license": "MIT", + "engines": { + "node": ">=10.0" + } + }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5032,6 +5756,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -5046,14 +5771,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/keycloak-js": { - "version": "25.0.2", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-25.0.2.tgz", - "integrity": "sha512-ACLf5O5PqzfDJwGqvLpqM0kflYWmyl3+T7M2C23gztJYccDxdfNP54+B9OkXz2GnDpLUId0ceoA+lbHw9t4Wng==", + "version": "25.0.6", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-25.0.6.tgz", + "integrity": "sha512-Km+dc+XfNvY6a4az5jcxTK0zPk52ns9mAxLrHj7lF3V+riVYvQujfHmhayltJDjEpSOJ4C8a57LFNNKnNnRP2g==", + "license": "Apache-2.0", "dependencies": { "js-sha256": "^0.11.0", "jwt-decode": "^4.0.0" @@ -5064,6 +5791,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5071,12 +5799,14 @@ "node_modules/leaflet": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" }, "node_modules/leaflet.markercluster": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "license": "MIT", "peerDependencies": { "leaflet": "^1.3.1" } @@ -5086,6 +5816,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5097,13 +5828,15 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5117,23 +5850,41 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5155,19 +5906,26 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/markdown-to-jsx": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.7.tgz", - "integrity": "sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==", + "version": "7.7.17", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.17.tgz", + "integrity": "sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ==", + "license": "MIT", "engines": { "node": ">= 10" }, "peerDependencies": { "react": ">= 0.14.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, "node_modules/math-intrinsics": { @@ -5183,7 +5941,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -5192,7 +5950,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5201,15 +5959,29 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/milsymbol": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/milsymbol/-/milsymbol-2.2.0.tgz", - "integrity": "sha512-TR9D+90u8h5vPCF33SkyjRmCPDbVBsvHtty3m18qfbz4bYr+Rj5lLSZ56lMf+dtzbfPTj32m4O/7H2RZ5tMOdg==" + "integrity": "sha512-TR9D+90u8h5vPCF33SkyjRmCPDbVBsvHtty3m18qfbz4bYr+Rj5lLSZ56lMf+dtzbfPTj32m4O/7H2RZ5tMOdg==", + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5218,6 +5990,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5226,10 +5999,11 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5241,20 +6015,23 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5266,12 +6043,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -5279,7 +6057,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5288,15 +6066,20 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5306,19 +6089,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -5329,14 +6116,16 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -5347,6 +6136,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5361,12 +6151,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -5381,7 +6173,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -5391,6 +6183,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -5403,11 +6196,30 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5423,6 +6235,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5434,9 +6247,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -5450,6 +6263,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5461,6 +6275,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5479,6 +6294,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5487,7 +6303,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5497,6 +6313,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5504,12 +6321,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5521,30 +6340,32 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -5562,7 +6383,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5575,14 +6396,28 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -5592,17 +6427,21 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5611,7 +6450,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -5625,17 +6463,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/rbush": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/rbush/-/rbush-1.4.3.tgz", - "integrity": "sha512-2eaOKmimS3P/0N40hu2EcwH7o0gTEVL+Zscxd9YoruZ8ZTuE3pQEuFirXtc93q0CahlmU66v2JS7cUUasreYOA==" + "integrity": "sha512-2eaOKmimS3P/0N40hu2EcwH7o0gTEVL+Zscxd9YoruZ8ZTuE3pQEuFirXtc93q0CahlmU66v2JS7cUUasreYOA==", + "license": "MIT" }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -5647,6 +6488,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5656,14 +6498,16 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz", + "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==", + "license": "MIT" }, "node_modules/react-leaflet": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "license": "Hippocratic-2.1", "dependencies": { "@react-leaflet/core": "^2.1.0" }, @@ -5677,6 +6521,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/react-leaflet-cluster/-/react-leaflet-cluster-2.1.0.tgz", "integrity": "sha512-16X7XQpRThQFC4PH4OpXHimGg19ouWmjxjtpxOeBKpvERSvIRqTx7fvhTwkEPNMFTQ8zTfddz6fRTUmUEQul7g==", + "license": "SEE LICENSE IN ", "dependencies": { "leaflet.markercluster": "^1.5.3" }, @@ -5688,20 +6533,22 @@ } }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.30.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz", + "integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.23.1" }, "engines": { "node": ">=14.0.0" @@ -5711,12 +6558,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.30.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz", + "integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.23.1", + "react-router": "6.30.2" }, "engines": { "node": ">=14.0.0" @@ -5730,6 +6578,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -5742,10 +6591,10 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -5753,19 +6602,33 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -5774,21 +6637,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -5801,22 +6662,27 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5825,15 +6691,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5843,7 +6710,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -5854,14 +6723,60 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -5871,33 +6786,50 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -5912,19 +6844,22 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -5934,15 +6869,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -5955,15 +6908,17 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5976,6 +6931,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5993,6 +6949,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6003,11 +6960,27 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6020,20 +6993,79 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6047,6 +7079,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6055,6 +7088,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -6069,6 +7103,26 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsaver": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/streamsaver/-/streamsaver-2.0.6.tgz", @@ -6078,26 +7132,38 @@ "type": "github", "url": "https://github.com/sponsors/jimmywarting" } - ] + ], + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6118,15 +7184,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6136,15 +7206,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6154,6 +7229,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6171,6 +7247,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6182,7 +7259,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6193,12 +7270,27 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6206,21 +7298,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -6229,39 +7331,11 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6278,11 +7352,18 @@ "node": ">=10" } }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "license": "Apache-2.0" + }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -6295,6 +7376,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6307,6 +7389,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6315,30 +7398,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -6348,17 +7433,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -6368,17 +7455,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -6388,10 +7476,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6401,39 +7490,44 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6465,6 +7559,8 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -6477,6 +7573,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -6484,7 +7581,8 @@ "node_modules/validate.io-array": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==" + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "license": "MIT" }, "node_modules/validate.io-function": { "version": "1.0.2", @@ -6513,6 +7611,15 @@ "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" }, + "node_modules/validator": { + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -6608,39 +7715,131 @@ "vite": "^5.0.0 || ^6.0.0" } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/vite-plugin-static-copy/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=14.14" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6652,39 +7851,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -6698,6 +7903,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -6712,15 +7918,18 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -6735,6 +7944,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6743,7 +7953,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", @@ -6753,9 +7963,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "optional": true, @@ -6764,7 +7974,10 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yocto-queue": { @@ -6772,12 +7985,33 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "license": "MIT", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } } } } diff --git a/common-operating-picture/ui/package.json b/common-operating-picture/ui/package.json index 8c8a3cd..42bb537 100644 --- a/common-operating-picture/ui/package.json +++ b/common-operating-picture/ui/package.json @@ -19,10 +19,12 @@ "@mui/material": "^5.15.15", "@mui/x-date-pickers": "^7.6.1", "@opentdf/client": "^2.0.0-beta.1515", + "@opentdf/sdk": "^0.4.0", "@rjsf/core": "^5.18.3", "@rjsf/mui": "^5.18.3", "@rjsf/utils": "^5.18.3", "@rjsf/validator-ajv8": "^5.18.3", + "@virtru/dsp-sdk": "^0.2.2", "chroma-js": "^2.4.2", "dayjs": "^1.11.11", "jwt-decode": "^4.0.0", @@ -54,7 +56,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "typescript": "^5.2.2", - "vite": "^6.4.1", + "vite": "^6.3.4", "vite-plugin-static-copy": "^2.3.2" }, "engines": { diff --git a/common-operating-picture/ui/public/img/plane.png b/common-operating-picture/ui/public/img/plane.png new file mode 100644 index 0000000..ffef8ff Binary files /dev/null and b/common-operating-picture/ui/public/img/plane.png differ diff --git a/common-operating-picture/ui/src/api/connectRpcClient.ts b/common-operating-picture/ui/src/api/connectRpcClient.ts index f9606bb..306b3e3 100644 --- a/common-operating-picture/ui/src/api/connectRpcClient.ts +++ b/common-operating-picture/ui/src/api/connectRpcClient.ts @@ -2,9 +2,10 @@ import { createConnectTransport } from '@connectrpc/connect-web'; import { createPromiseClient } from '@connectrpc/connect'; import { config } from '@/config'; import { TdfObjectService } from '@/proto/tdf_object/v1/tdf_object_connect'; - +import { TdfNoteService } from '@/proto/tdf_object/v1/tdf_note_connect'; const transport = createConnectTransport({ baseUrl: config.grpcServerUrl, }); export const crpcClient = createPromiseClient(TdfObjectService, transport); +export const drpcClient = createPromiseClient(TdfNoteService, transport); diff --git a/common-operating-picture/ui/src/components/Banner.tsx b/common-operating-picture/ui/src/components/Banner.tsx index c4a2874..ff57c68 100644 --- a/common-operating-picture/ui/src/components/Banner.tsx +++ b/common-operating-picture/ui/src/components/Banner.tsx @@ -1,34 +1,73 @@ -import { Box } from '@mui/material'; +import { Box } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import { useContext, useEffect } from 'react'; -import { BannerContext, BannerClassification } from '@/contexts/BannerContext'; -import { useLocation } from 'react-router-dom'; +import { useContext } from 'react'; +import { BannerContext, Classifications, BannerClassification } from '@/contexts/BannerContext'; export const Banner = () => { const theme = useTheme(); - const { classification, setClassification, needToKnow, setNeedToKnow, relTo, setRelTo, searchIsActive, hasResults } = useContext(BannerContext); - const bannerColor = BannerClassification[classification as keyof typeof BannerClassification]; - const location = useLocation(); - const createIsActive = location?.search?.includes('mode=create'); - const showBanner = location?.pathname === '/source-types' && (createIsActive || searchIsActive || hasResults); - useEffect(() => { - if (!showBanner) { - setClassification(''); - setNeedToKnow(''); - setRelTo(''); - } - } - , [setClassification, setNeedToKnow, setRelTo, location.pathname, createIsActive, searchIsActive, hasResults, showBanner]); - - return showBanner && classification && - ( - {[classification, needToKnow, `${relTo ? 'REL TO ' : ''}${relTo}`].filter((v) => v).join(' // ')} - ); -}; + const { activeEntitlements } = useContext(BannerContext); + + // Helper to extract the value from the FQN (e.g., 'secret') + const getFqnValue = (fqn: string): string => (fqn || '').split('/').pop()?.toUpperCase() || ''; + + const getBannerData = () => { + const activeValues = Array.from(activeEntitlements).map(getFqnValue); + + // Highest Classification only + const highestClass = [...Classifications] + .reverse() + .find(cls => activeValues.includes(cls)) || 'UNCLASSIFIED'; + + const ntkCaveats: string[] = []; + const relValues: string[] = []; + + activeEntitlements.forEach(fqn => { + const val = getFqnValue(fqn); + if (Classifications.includes(val)) return; + + // If the path contains 'relto', treat it as a REL TO value + if (fqn.toLowerCase().includes('relto')) { + relValues.push(val); + } else { + ntkCaveats.push(val); + } + }); + + // Format the REL TO string with commas + const formattedRel = relValues.length > 0 + ? `REL TO ${relValues.join(', ')}` + : ''; + + // Combine + const allCaveats = [...ntkCaveats]; + if (formattedRel) allCaveats.push(formattedRel); + + const displayString = allCaveats.length > 0 + ? `${highestClass}//${allCaveats.join('//')}` + : highestClass; + + return { + label: "MAX CLASSIFICATION: " + displayString, + color: BannerClassification[highestClass] + }; + }; + + const { label, color } = getBannerData(); + + if ( activeEntitlements.size === 0) return null; + + return ( + + {label} + + ); +}; \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/BannerProvider.tsx b/common-operating-picture/ui/src/components/BannerProvider.tsx index 66144fa..891860c 100644 --- a/common-operating-picture/ui/src/components/BannerProvider.tsx +++ b/common-operating-picture/ui/src/components/BannerProvider.tsx @@ -1,20 +1,49 @@ import { BannerContext } from '@/contexts/BannerContext'; -import { ReactNode, useState } from 'react'; +import { ReactNode, useState, useEffect } from 'react'; +import { useAuth } from '@/hooks/useAuth'; +import { TdfObjectResponse } from '@/hooks/useRpcClient'; export const BannerProvider = ({ children }: { children: ReactNode }) => { - const [classification, setClassification] = useState(''); - const [needToKnow, setNeedToKnow] = useState(''); - const [relTo, setRelTo] = useState(''); const [searchIsActive, setSearchIsActive] = useState(false); const [hasResults, setHasResults] = useState(false); + // Moved method for managing the tdfobjects + const [tdfObjects, setTdfObjects] = useState([]); + + // Initialize with default + const [activeEntitlements, setActiveEntitlements] = useState(new Set(["NoAccess"])); + + // Tracks if entitlements have been initialized from the user object + const [isEntitlementsInitialized, setIsEntitlementsInitialized] = useState(false); + + // Added auth to instantiate the active entitlements + const { user } = useAuth(); + + useEffect(() => { + // Initialization + const userEntitlements = user?.entitlements; + const isUserLoaded = user && userEntitlements && userEntitlements[0] !== "loading"; + + if (isUserLoaded && !isEntitlementsInitialized) { + + const initialEntitlements = userEntitlements.length > 0 + ? new Set(userEntitlements) + : new Set(); // Use an empty set if the list is empty + + // Set the active entitlements to all user entitlments + setActiveEntitlements(initialEntitlements); + + // Mark that entitlements have been initilized + setIsEntitlementsInitialized(true); + } + }, [user, isEntitlementsInitialized]); // Dependencies include 'user' and new flag + return ( - {children} diff --git a/common-operating-picture/ui/src/components/JsonSchemaForm/AttributeAutocompleteWidget.tsx b/common-operating-picture/ui/src/components/JsonSchemaForm/AttributeAutocompleteWidget.tsx index dd31a78..1d29453 100644 --- a/common-operating-picture/ui/src/components/JsonSchemaForm/AttributeAutocompleteWidget.tsx +++ b/common-operating-picture/ui/src/components/JsonSchemaForm/AttributeAutocompleteWidget.tsx @@ -1,7 +1,5 @@ -import { BannerContext, extractValues } from '@/contexts/BannerContext'; import { Autocomplete, Chip, TextField } from '@mui/material'; import type { WidgetProps } from '@rjsf/utils'; -import { useContext } from 'react'; export function AttributeAutocompleteWidget({ value, @@ -9,7 +7,6 @@ export function AttributeAutocompleteWidget({ options, label, }: WidgetProps) { - const { setClassification, setNeedToKnow, setRelTo } = useContext(BannerContext); return ( { - let fx; - const extracted = extractValues(values ?? []); - switch (label.toUpperCase()) { - case 'CLASSIFICATION': - fx = setClassification; - break; - case 'NEED TO KNOW': - fx = setNeedToKnow; - break; - case 'REL TO': - fx = setRelTo; - break; - default: - fx = () => {}; - } - fx(extracted); return onChange( - (Array.isArray(values) + Array.isArray(values) ? values.map((v) => v.value) - // undefined must be returned here instead of null to avoid RJSF validation errors for string types - : values?.value) || undefined, + // Return undefined for empty values to keep RJSF validation happy + : values?.value || undefined ); }} - renderTags={(tagValue, getTagProps) => + renderTags={(tagValue, getTagProps) => tagValue.map((option, index) => ( - - {getFieldTitle(displayFields?.header)}: {value} + + + {getFieldTitle(displayFields?.header)}: {displayValue} - + {formattedDateTime} @@ -55,7 +60,11 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u const oa = propertyOf(o.decryptedData); const details = (displayFields?.details || []).map(field => { - const value = oa(field); + let value = oa(field); + + if (value && typeof value === 'object' && !Array.isArray(value)) { + value = value.country || value.name || JSON.stringify(value); + } return ( @@ -63,13 +72,11 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u ); }); - return details; }; const tdfObjectToDynamicIcon = (tdfObject: TdfObjectResponse) => { const oa = propertyOf(tdfObject.decryptedData); - let iconSvgPath = ''; let iconColor = ''; @@ -93,7 +100,6 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u // what is the value of that field from the data object? let objectConfigValueIcon = oa(iconConfigField); - // Handle for type Array (ie: attrNeedToKnow, attrRelTo) if (Array.isArray(objectConfigValueIcon)) { // fixme: currently using the first index @@ -102,10 +108,10 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u // Map the value to the valueMap if there is a matching key, else return self objectConfigValueIcon = iconConfigValueMap[objectConfigValueIcon] || objectConfigValueIcon; - + // Go to the next iconConfig if the data is null or empty string if(!objectConfigValueIcon || objectConfigValueIcon == '') continue; - + // If valueMap contains a isMilSymbol key and the value is "true", create MilSymbol if(!!iconConfigValueMap.isMilSymbol && iconConfigValueMap.isMilSymbol.toLowerCase() === 'true'){ return renderMilSymbolIcon(objectConfigValueIcon); @@ -126,10 +132,10 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u } else { // which field drives the color? const iconColorField = mapFields.colorConfig[0].field; - + // what is the value of that field from the data object? let objectConfigValueColor = oa(iconColorField); - + // Handle for type Array (ie: attrNeedToKnow, attrRelTo) if (Array.isArray(objectConfigValueColor)) { // fixme: currently using the first index @@ -182,14 +188,13 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u if (ctx) { ctx.scale(dpi, dpi); // NOTE: iconColor can be a string or hex code: '#3898ec' or 'blue' - ctx.fillStyle = iconColor; - const path = new Path2D(iconSvgPath); + ctx.fillStyle = iconColor; + const path = new Path2D(iconSvgPath); ctx.fill(path); } else { console.error('Error creating icon'); } - return L.icon({ iconUrl: canvas.toDataURL(), iconSize: [size, size], @@ -202,11 +207,35 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u const coordinates = JSON.parse(tdfObject.tdfObject.geo).coordinates; const dynamicTdfIcon = tdfObjectToDynamicIcon(tdfObject); + const data = tdfObject.decryptedData || {}; + + const objClass = extractValues(data.attrClassification || []) + .split(', ') + .filter(Boolean); + + const objNTK = extractValues(data.attrNeedtoknow || data.attrNeedToKnow || []) + .split(', ') + .filter(Boolean); + + const objRel = extractValues(data.attrRelto || data.attrRelTo || []) + .split(', ') + .filter(Boolean); + return ( - - {renderHeader(tdfObject)} - {renderDetails(tdfObject)} + + + 0 ? objClass : ['UNCLASSIFIED']} + objNTK={objNTK} + objRel={objRel} + notes={[]} + /> + {renderHeader(tdfObject)} + + {renderDetails(tdfObject)} + + ); @@ -228,4 +257,4 @@ export function MarkerLayer({ tdfObjects = [], isCluster = false, layerName = 'u ); } -} +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/Map/TdfObjectsMapLayer.tsx b/common-operating-picture/ui/src/components/Map/TdfObjectsMapLayer.tsx index ca51ec5..7633224 100644 --- a/common-operating-picture/ui/src/components/Map/TdfObjectsMapLayer.tsx +++ b/common-operating-picture/ui/src/components/Map/TdfObjectsMapLayer.tsx @@ -1,3 +1,4 @@ +import { LayerGroup } from 'react-leaflet'; import { TdfObjectResponse } from '@/hooks/useRpcClient'; import { ClusterLayer } from '@/components/Map/ClusterLayer'; import { MarkerLayer } from '@/components/Map/MarkerLayer'; @@ -10,35 +11,42 @@ type Props = { export function TdfObjectsMapLayer({ tdfObjects = [] }: Props) { const { mapFields } = useSourceType(); - + const groupTdfObjectsByDecryptedDataProperty = (arr:TdfObjectResponse[], property:string) => { - + return arr.reduce((memo:Record, x:TdfObjectResponse) => { const groupByValue = x.decryptedData[property] || 'ungrouped'; - if (!memo[groupByValue]) { - memo[groupByValue] = []; + if (!memo[groupByValue]) { + memo[groupByValue] = []; } memo[groupByValue].push(x); - + return memo; }, {}); }; - + const groupLayersBy = mapFields?.colorConfig[0].field || ''; const groupedTDFObjects = groupTdfObjectsByDecryptedDataProperty(tdfObjects, groupLayersBy); const layersToRender = Object.keys(groupedTDFObjects); - - // NOTE: LayersControl is not rendered here becuase it is the parent element for ALL layers + // TODO: conditonally enable/disable clustering - const clusterEnabled = true; + const clusterEnabled = false; if (clusterEnabled){ - return layersToRender.map( key => ( - - )); + return ( + + {layersToRender.map( key => ( + + ))} + + ); } else { - return layersToRender.map( key => ( - - )); + return ( + + {layersToRender.map( key => ( + + ))} + + ); } -} +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/Map/Vehicle.tsx b/common-operating-picture/ui/src/components/Map/Vehicle.tsx new file mode 100644 index 0000000..1a931db --- /dev/null +++ b/common-operating-picture/ui/src/components/Map/Vehicle.tsx @@ -0,0 +1,385 @@ +import { useMemo, useState, useEffect, useRef } from "react"; +import { Marker, Popup } from "react-leaflet"; +import L from "leaflet"; +import { Typography, Box, CircularProgress, IconButton, Tooltip } from "@mui/material"; +import TrendingUpIcon from "@mui/icons-material/TrendingUp"; +import AltRouteIcon from "@mui/icons-material/AltRoute"; +import MyLocationIcon from "@mui/icons-material/MyLocation"; +import GpsFixedIcon from "@mui/icons-material/GpsFixed"; +import FlightIcon from '@mui/icons-material/Flight'; +import { mapStringToColor } from "@/pages/SourceTypes/helpers/markers"; +import { useRpcClient } from '@/hooks/useRpcClient'; +import { TdfObject } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { ObjectBanner } from '@/components/ObjectBanner'; +import { extractValues } from '@/contexts/BannerContext'; +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; + +// Interfaces +interface Coordinate { + lat: number; + lng: number; +} + +interface VehicleProps { + markerId: string; + Position: Coordinate; + rawObject: TdfObject; + data?: any; + onClick: () => void; + onPopOut: (tdfResponse: any) => void; +} + +interface RotatableIconProps { + color: string; + iconSize: L.PointExpression; + iconAnchor: L.PointExpression; +} + +function calculateBearing(start: Coordinate, end: Coordinate): number { + const toRad = (deg: number) => deg * (Math.PI / 180); + const toDeg = (rad: number) => rad * (180 / Math.PI); + + const startLat = toRad(start.lat); + const startLng = toRad(start.lng); + const endLat = toRad(end.lat); + const endLng = toRad(end.lng); + + const dLng = endLng - startLng; + const y = Math.sin(dLng) * Math.cos(endLat); + const x = + Math.cos(startLat) * Math.sin(endLat) - + Math.sin(startLat) * Math.cos(endLat) * Math.cos(dLng); + + const bearing = toDeg(Math.atan2(y, x)); + return (bearing + 360) % 360; +} + +const RotatableIcon = ({ color, iconSize, iconAnchor }: RotatableIconProps) => { + const [width, height] = Array.isArray(iconSize) ? iconSize : ([20, 20] as [number, number]); + + // SVG plane icon that can be colored + const planeSvg = ` + + + + `; + + const encodedSvg = encodeURIComponent(planeSvg); + + return useMemo( + () => + L.divIcon({ + className: "plane-icon", + iconSize: iconSize, + iconAnchor: iconAnchor, + html: ``, + }), + [color, iconSize, iconAnchor, encodedSvg] + ); +}; + +const ICON_PROPS = { + size: [24, 24] as L.PointExpression, + anchor: [12, 12] as L.PointExpression, +}; + +// Helper function to extract classification color from attribute +const getClassificationColor = (classification?: string | string[]): string => { + if (!classification) { + return mapStringToColor('default'); + } + // Handle both string and array formats - This will be removed once we add METADATA + const classValue = Array.isArray(classification) ? classification[0] : classification; + return mapStringToColor(classValue || 'default'); +}; + +// --- Speed Gauge Component --- +const MAX_SPEED_KMH = 1000; +const SpeedGauge = ({ speedString }: { speedString: string | undefined }) => { + const [value, unit] = speedString?.trim().split(' ') || ['0', 'km/h']; + const speed = parseInt(value, 10); + + if (isNaN(speed)) { + return ( + + N/A + + ); + } + + const progress = Math.min(100, (speed / MAX_SPEED_KMH) * 100); + const colorClass = progress > 70 ? 'speed-high' : progress > 40 ? 'speed-medium' : 'speed-low'; + + return ( + + + + + + {`${speed}`} + + + {unit} + + + + ); +}; + +// --- Detail Renderer --- +const renderDetail = (Icon: React.ElementType, label: string, value: string | undefined) => ( + + + + {label} + + + {value || "N/A"} + + +); + +// VehicleMarker Component +export function VehicleMarker({ markerId, Position, data, rawObject, onClick, onPopOut }: VehicleProps) { + const { transformTdfObject } = useRpcClient(); + const [isLoading, setIsLoading] = useState(false); + const [decryptedData, setDecryptedData] = useState(null); // State for decrypted results + const [currentPos, setCurrentPos] = useState(Position); + + // Combine static data with decrypted data (decrypted takes priority) + const displayData = useMemo(() => ({ + ...data, + ...decryptedData + }), [data, decryptedData]); + + const initialHeading = useMemo(() => { + const heading = parseInt(displayData?.heading || "0", 10); + return isNaN(heading) ? 0 : heading; + }, []); + + const rotationRef = useRef(initialHeading); + const markerRef = useRef(null); + + useEffect(() => { + // Re-apply rotation if the icon was re-created (e.g. color change) but bearing is same + const markerEl = markerRef.current?.getElement(); + const iconImg = markerEl?.querySelector('.vehicle-icon-img') as HTMLElement; + if (iconImg) { + iconImg.style.transform = `rotate(${rotationRef.current}deg)`; + } + }); + + useEffect(() => { + const startPos = currentPos; + const targetPos = Position; + const duration = 3000; + + if (startPos.lat !== targetPos.lat || startPos.lng !== targetPos.lng) { + const newBearing = calculateBearing(startPos, targetPos); + rotationRef.current = newBearing; + } else if (displayData?.heading) { + const dataHeading = parseInt(displayData.heading, 10); + if (!isNaN(dataHeading)) { + rotationRef.current = dataHeading; + } + } + + const markerEl = markerRef.current?.getElement(); + const iconImg = markerEl?.querySelector('.vehicle-icon-img') as HTMLElement; + if (iconImg) { + iconImg.style.transform = `rotate(${rotationRef.current}deg)`; + } + + let lngDelta = targetPos.lng - startPos.lng; + if (lngDelta > 180) lngDelta -= 360; + else if (lngDelta < -180) lngDelta += 360; + + if (Math.abs(lngDelta) > 100 || Math.abs(targetPos.lat - startPos.lat) > 100) { + markerRef.current?.setLatLng(targetPos); + setCurrentPos(targetPos); + return; + } + + const startTime = Date.now(); + let frameId: number; + const animate = () => { + const now = Date.now(); + const progress = Math.min(1, (now - startTime) / duration); + const newLat = startPos.lat + (targetPos.lat - startPos.lat) * progress; + let newLng = startPos.lng + lngDelta * progress; + newLng = ((newLng + 180) % 360) - 180; + if (newLng <= -180) newLng += 360; + + markerRef.current?.setLatLng({ lat: newLat, lng: newLng }); + + if (markerRef.current?.isPopupOpen()) { + markerRef.current.getPopup()?.update(); + } + + setCurrentPos({ lat: newLat, lng: newLng }); + if (progress < 1) frameId = requestAnimationFrame(animate); + }; + frameId = requestAnimationFrame(animate); + return () => cancelAnimationFrame(frameId); + }, [Position, displayData?.heading]); + + // Decryption handler + const handleMarkerClick = async () => { + // Call external onClick if provided + if (onClick) onClick(); + + // Trigger decryption if not already loaded + if (decryptedData || isLoading) return; + + setIsLoading(true); + try { + const result = await transformTdfObject(rawObject); + setDecryptedData(result.decryptedData); + } catch (err) { + console.error("Decryption failed", err); + } finally { + setIsLoading(false); + } + }; + + const handlePopOutClick = () => { + const tdfResponse: any = { + tdfObject: rawObject, + decryptedData: displayData + }; + onPopOut(tdfResponse); +}; + + const icon = RotatableIcon({ + color: getClassificationColor(displayData?.attrClassification), + iconSize: ICON_PROPS.size, + iconAnchor: ICON_PROPS.anchor, + }); + + const objClass = useMemo(() => + extractValues(displayData?.attrClassification || []).split(', ').filter(Boolean), + [displayData?.attrClassification] + ); + + const objNTK = useMemo(() => + extractValues(displayData?.attrNeedToKnow || []).split(', ').filter(Boolean), + [displayData?.attrNeedToKnow] + ); + + const objRel = useMemo(() => + extractValues(displayData?.attrRelTo || []).split(', ').filter(Boolean), + [displayData?.attrRelTo] + ); + + return ( + + + + {/* Pop Out Icon Button - Top Right */} + + + + + + + {/* Banner with right padding to avoid overlap with popout button */} + + 0 ? objClass : ['N/A']} + objNTK={objNTK} + objRel={objRel} + notes={[]} + /> + + + + {isLoading ? "Decrypting..." : (displayData?.vehicleName || `ID: ${markerId.substring(0, 8)}`)} + + + Callsign: + + {displayData?.callsign || "N/A"} + + + + + + Telemetry + + + + + + {renderDetail(TrendingUpIcon, "Altitude: ", displayData?.altitude)} + {renderDetail(GpsFixedIcon, "Heading: ", displayData?.heading)} + {renderDetail(FlightIcon, "Type: ", displayData?.aircraft_type)} + + + + + + Flight Details + {renderDetail(AltRouteIcon, "Origin: ", displayData?.origin)} + {renderDetail(AltRouteIcon, "Destination: ", displayData?.destination)} + {renderDetail(MyLocationIcon, "Coordinates: ", `${currentPos.lat.toFixed(4)}, ${currentPos.lng.toFixed(4)}`)} + + + {isLoading && ( + + + + )} + + + + ); +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/Map/VehicleLayer.tsx b/common-operating-picture/ui/src/components/Map/VehicleLayer.tsx new file mode 100644 index 0000000..77ab669 --- /dev/null +++ b/common-operating-picture/ui/src/components/Map/VehicleLayer.tsx @@ -0,0 +1,47 @@ +import { LayerGroup } from 'react-leaflet'; +import { VehicleMarker } from './Vehicle'; +import { TdfObject } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { TdfObjectResponse } from '@/hooks/useRpcClient'; + +interface VehicleDataItem { + id: string; + pos: { lat: number; lng: number }; + rawObject: TdfObject; + data?: { + vehicleName?: string | undefined; + callsign?: string; + origin?: string; + destination?: string; + speed?: string; + altitude?: string; + heading?: string; + aircraft_type?: string; + attrClassification?: string | string[]; + attrNeedToKnow?: string[]; + attrRelTo?: string[]; + }; +} + +interface VehicleLayerProps { + vehicleData: VehicleDataItem[]; + onMarkerClick: (vehicle: VehicleDataItem) => void; + onPopOut: (tdfResponse: TdfObjectResponse) => void; +} + +export function VehicleLayer({ vehicleData, onMarkerClick, onPopOut }: VehicleLayerProps) { + return ( + + {vehicleData.map((vehicle) => ( + onMarkerClick(vehicle)} + onPopOut={onPopOut} + /> + ))} + + ); +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/ObjectBanner.tsx b/common-operating-picture/ui/src/components/ObjectBanner.tsx new file mode 100644 index 0000000..5f041cc --- /dev/null +++ b/common-operating-picture/ui/src/components/ObjectBanner.tsx @@ -0,0 +1,85 @@ +import { Box } from '@mui/material'; +import { BannerClassification, Classifications } from '@/contexts/BannerContext'; + +interface ObjectBannerProps { + objClassification: string[]; + objNTK: string[]; + objRel: string[]; + notes: any[]; +} + +export const ObjectBanner = ({ objClassification, objNTK, objRel, notes }: ObjectBannerProps) => { + const classifications = new Set(); + const ntkValues = new Set(); + const relValues = new Set(); + + // Process Object Values + (objClassification ?? []).forEach(v => v && classifications.add(v.toUpperCase())); + (objNTK ?? []).forEach(v => v && ntkValues.add(v.toUpperCase())); + (objRel ?? []).forEach(v => v && relValues.add(v.toUpperCase())); + + // Validation for object classification + if (classifications.size === 0) { + throw new Error("Data Integrity Error: No classification found for object."); + } + + // Process Note Values + (notes ?? []).forEach(note => { + try { + // Use optional chaining for nested JSON paths + const searchData = note?.tdfNote?.search; + if (!searchData) return; + const parsed = JSON.parse(searchData); + + const extract = (arr?: string[]) => + arr?.map(url => url.split('/').pop()?.toUpperCase() || '').filter(Boolean) ?? []; + + const noteClasses = extract(parsed.attrClassification); + + // Validation for classification + if (noteClasses.length === 0) { + throw new Error(`Validation Error: Note ${note.id} is missing a classification.`); + } + + extract(parsed.attrClassification).forEach(v => classifications.add(v)); + extract(parsed.attrNeedtoknow).forEach(v => ntkValues.add(v)); + extract(parsed.attrRelto).forEach(v => relValues.add(v)); + } catch (e) { + console.error("Failed to parse note data", e); + } + }); + + // Determine Highest Classification + const highestClass = [...Classifications] + .reverse() + .find(cls => classifications.has(cls)) || 'UNCLASSIFIED'; + + // Build the Caveat String + const combinedNTK = Array.from(ntkValues); + const combinedRel = Array.from(relValues); + const finalNTK = combinedNTK.filter(v => v !== highestClass && v !== ''); + const finalRelRaw = combinedRel.filter(v => v !== highestClass && v !== ''); + + // Join all countries with a comma, then add one "REL TO" at the start + const formattedRel = finalRelRaw.length > 0 + ? [`REL TO ${finalRelRaw.join(', ')}`] + : []; + + const allCaveats = [...finalNTK, ...formattedRel]; + + const displayString = allCaveats.length > 0 + ? `${highestClass}//${allCaveats.join('//')}` + : highestClass; + + const color = BannerClassification[highestClass] || '#ccc'; + + return ( + + {displayString} + + ); +}; \ No newline at end of file diff --git a/common-operating-picture/ui/src/components/TopBar.tsx b/common-operating-picture/ui/src/components/TopBar.tsx index d62cc35..e94cc33 100644 --- a/common-operating-picture/ui/src/components/TopBar.tsx +++ b/common-operating-picture/ui/src/components/TopBar.tsx @@ -1,11 +1,15 @@ import { AppBar, Avatar, Menu, MenuItem, Toolbar, Typography, IconButton, Divider, Stack } from '@mui/material'; -import { useState } from 'react'; +import { useState, useContext } from 'react'; import { useAuth } from '@/hooks/useAuth'; +import { BannerContext } from '@/contexts/BannerContext'; +import { ClassificationSelectorModal } from '@/utils/ClassificationSelectorModal'; export function TopBar() { const { user, signOut } = useAuth(); const [accountMenuAnchor, setAccountMenuAnchor] = useState(null); const accountMenuOpen = Boolean(accountMenuAnchor); + useContext(BannerContext); + const [isClassificationModalOpen, setIsClassificationModalOpen] = useState(false); // Build initials from the user name if they have one const initials = user?.name ? user.name @@ -14,7 +18,7 @@ export function TopBar() { .join('') : ''; const handleClick = ( - event: React.MouseEvent, + event: React.MouseEvent, anchorSetter: React.Dispatch>, ) => { anchorSetter(event.currentTarget); @@ -26,6 +30,18 @@ export function TopBar() { anchorSetter(null); }; + const handleSetClassification = () => { + // Open the modal and close the menu + handleClose(setAccountMenuAnchor); + setIsClassificationModalOpen(true); + }; + + const handleModalClose = () => { + setIsClassificationModalOpen(false); + }; + + const userEntitlements = user?.entitlements || []; + return ( <> @@ -44,11 +60,19 @@ export function TopBar() { + Set Classification { signOut(); handleClose(setAccountMenuAnchor); }}>Logout + + ); } diff --git a/common-operating-picture/ui/src/contexts/BannerContext.ts b/common-operating-picture/ui/src/contexts/BannerContext.ts index 6a70bc6..f2988ff 100644 --- a/common-operating-picture/ui/src/contexts/BannerContext.ts +++ b/common-operating-picture/ui/src/contexts/BannerContext.ts @@ -1,10 +1,41 @@ import { Dispatch, SetStateAction, createContext } from 'react'; import { mapColors } from '@/pages/SourceTypes/helpers/markers'; +import { TdfObjectResponse } from '@/hooks/useRpcClient'; export const extractValues = (values: string[] | object[] | string | object) => { const vals = Array.isArray(values) ? values : [values]; + const filteredVals = vals.filter(v => v); const extract = (v: string) => v.split('/').pop()?.toUpperCase(); - return Array.from(new Set(vals.map((v) => extract(typeof v === 'string' ? v : v.value)))).join(', '); + return Array.from(new Set(filteredVals.map((v) => extract(typeof v === 'string' ? v : v.value)))).join(', '); +}; + +export const calculateBannerAttributes = (tdfs: TdfObjectResponse[]) => { + let classPriority = 0; + let needToKnow = new Set(); + let relTo = new Set(); + + tdfs.forEach((o) => { + // Max Classification + const objClassification = extractValues(o.decryptedData.attrClassification); + const classificationKey = objClassification as keyof typeof ClassificationPriority; + if (ClassificationPriority.hasOwnProperty(classificationKey) && classificationKey !== 'UNCLASSIFIED') { + classPriority = Math.max(classPriority, ClassificationPriority[classificationKey]); + } + + // Union Of NeedToKnows + const tdfNeedToKnows = extractValues(o.decryptedData.attrNeedToKnow || []).split(', ').filter(v => v.trim() !== ''); + tdfNeedToKnows.forEach(v => needToKnow.add(v)); + + // Union Of RelTo + const tdfRelTo = extractValues(o.decryptedData.attrRelTo || []).split(', ').filter(v => v.trim() !== ''); + tdfRelTo.forEach(v => relTo.add(v)); + }); + + return { + classification: Classifications[classPriority], + needToKnow: [...needToKnow].filter(v => v.trim() !== '').join(', '), + relTo: [...relTo].filter(v => v.trim() !== '').join(', '), + }; }; // Order matters here as the index of the classification in the array is the priority @@ -18,30 +49,28 @@ export const BannerClassification = Classifications.reduce((classification, c) = return classification; }, {} as { [key: string]: string }); + + type BannerContextType = { - classification: string, - setClassification: Dispatch>, - needToKnow: string, - setNeedToKnow: Dispatch>, - relTo: string, - setRelTo: Dispatch>, searchIsActive: boolean, setSearchIsActive: Dispatch>, hasResults: boolean, setHasResults: Dispatch>, + activeEntitlements: Set, + setActiveEntitlements: Dispatch>>, + tdfObjects: TdfObjectResponse[]; + setTdfObjects: Dispatch>; }; export const BannerContext = createContext( - { - classification: '', - setClassification: () => {}, - needToKnow: '', - setNeedToKnow: () => {}, - relTo: '', - setRelTo: () => {}, + { searchIsActive: false, setSearchIsActive: () => {}, hasResults: false, - setHasResults: () => {}, + setHasResults: () => {}, + activeEntitlements: new Set(), + setActiveEntitlements: () => {}, + tdfObjects: [], + setTdfObjects: () => {}, }, ); diff --git a/common-operating-picture/ui/src/hooks/useEntitlements.tsx b/common-operating-picture/ui/src/hooks/useEntitlements.tsx new file mode 100644 index 0000000..3269558 --- /dev/null +++ b/common-operating-picture/ui/src/hooks/useEntitlements.tsx @@ -0,0 +1,40 @@ +import { useMemo } from 'react'; +import { useAuth } from '@/hooks/useAuth'; + +export interface CategorizedEntitlements { + [category: string]: string[]; +} + +export function useEntitlements() { + const { user } = useAuth(); + + const categorizedData = useMemo(() => { + const data: CategorizedEntitlements = {}; + + if (!user?.entitlements) return data; + + user.entitlements.forEach((url) => { + try { + const parts = url.split('/'); + const category = parts[4]; + const value = parts[6]; + + if (category && value) { + if (!data[category]) { + data[category] = []; + } + // Prevent duplicate values in the same category + if (!data[category].includes(value)) { + data[category].push(value); + } + } + } catch (e) { + console.error("Failed to parse entitlement URL:", url, e); + } + }); + + return data; + }, [user?.entitlements]); + + return { categorizedData, rawEntitlements: user?.entitlements || [] }; +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/hooks/useRpcClient.tsx b/common-operating-picture/ui/src/hooks/useRpcClient.tsx index c6ef6bf..83449a0 100644 --- a/common-operating-picture/ui/src/hooks/useRpcClient.tsx +++ b/common-operating-picture/ui/src/hooks/useRpcClient.tsx @@ -1,41 +1,203 @@ -import { TdfObject, QueryTdfObjectsRequest } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { TdfObject, QueryTdfObjectsRequest, UpdateTdfObjectRequest, UpdateTdfObjectResponse } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { QueryTdfNotesRequest, TdfNote } from '@/proto/tdf_object/v1/tdf_note_pb'; import { PartialMessage } from '@bufbuild/protobuf'; -import { crpcClient } from '@/api/connectRpcClient'; +import { crpcClient, drpcClient } from '@/api/connectRpcClient'; import { useTDF } from './useTdf'; import { useAuth } from './useAuth'; +import DecryptWorker from '@/workers/decrypt.worker.ts?worker'; +import { config } from '@/config' export type TdfObjectResponse = { tdfObject: TdfObject; decryptedData: any; } +export type TdfNotesResponse = { + tdfNote: TdfNote; + decryptedData: any; +} + +// Web Worker Pool for Decryption +const WORKER_POOL_SIZE = 4; +const workerPool: Worker[] = []; +let nextWorkerIndex = 0; +let workersInitialized = false; + +function getWorker(): Worker { + if (workerPool.length < WORKER_POOL_SIZE) { + const newWorker = new DecryptWorker(); + workerPool.push(newWorker); + return newWorker; + } + const worker = workerPool[nextWorkerIndex]; + nextWorkerIndex = (nextWorkerIndex + 1) % WORKER_POOL_SIZE; + return worker; +} + +async function initializeWorkers(user: ReturnType['user']) { + if (workersInitialized || !user?.refreshToken || !user?.accessToken) return; + + const initData = { + config, + user: { refreshToken: user.refreshToken, accessToken: user.accessToken }, + }; + + const workerPromises = Array.from({ length: WORKER_POOL_SIZE }).map((_) => { + const worker = getWorker(); + return new Promise((resolve) => { + const handleMessage = (event: MessageEvent) => { + if (event.data.type === 'init-complete') { + worker.removeEventListener('message', handleMessage); + resolve(); + } + }; + worker.addEventListener('message', handleMessage); + worker.postMessage(initData); + }); + }); + + await Promise.all(workerPromises); + workersInitialized = true; + console.log(`Initialized ${WORKER_POOL_SIZE} decryption workers.`); +} + +const tdfObjectCache = new Map(); export function useRpcClient() { const { decrypt } = useTDF(); const { user } = useAuth(); - async function transformTdfObject(tdfObject: TdfObject): Promise { + if (!workersInitialized && user) { + initializeWorkers(user); + } + + function clearTdfObjectCache() { + tdfObjectCache.clear(); + console.log("TDF Object Cache cleared."); + } + + async function transformTdfObject(tdfObject: TdfObject): Promise { + const objectId = tdfObject.id; + + // Extract Dynamic Data (Plaintext Search Field) + // This contains live telemetry (Speed, Alt, Heading) + let dynamicData = {}; try { - const decryptedData = JSON.parse(await decrypt(tdfObject.tdfBlob.buffer)); + if (tdfObject.metadata && tdfObject.metadata !== "null") { + dynamicData = JSON.parse(tdfObject.metadata); + } + } catch (e) { + console.warn("Failed to parse dynamic metadata", e); + } + + // Handle Static/Encrypted Data + // Check Cache first for identity data (Name, Callsign) + if (tdfObjectCache.has(objectId)) { return { tdfObject, - decryptedData, + decryptedData: { ...tdfObjectCache.get(objectId), ...dynamicData }, }; + } + + // Fallback if workers aren't ready + if (!workersInitialized || !tdfObject.tdfBlob || tdfObject.tdfBlob.length === 0) { + return { tdfObject, decryptedData: dynamicData }; + } + + // Decrypt via Worker Pool + const worker = getWorker(); + + return new Promise((resolve) => { + const handleMessage = (event: MessageEvent) => { + if (event.data.type !== 'decryption-result') return; + worker.removeEventListener('message', handleMessage); + + const { decryptedPayload, error } = event.data; + let staticData = {}; + + if (decryptedPayload) { + try { + staticData = JSON.parse(decryptedPayload); + // Cache identity data only (not the changing dynamic telemetry) + if (tdfObject.srcType === 'vehicles') { + tdfObjectCache.set(objectId, staticData); + } + } catch (e) { + console.error("JSON parse failed on worker result:", e); + } + } + + if (error) console.error(`Decryption failed for ${objectId}:`, error); + + // Final Merge: Static (from Worker) + Dynamic (from Search Field) + resolve({ + tdfObject, + decryptedData: { ...staticData, ...dynamicData }, + }); + }; + + worker.addEventListener('message', handleMessage); + + // Transfer ownership of the buffer to the worker for performance + const tdfBlobBuffer = tdfObject.tdfBlob!.buffer.slice(0); + worker.postMessage({ tdfBlobBuffer }, [tdfBlobBuffer]); + }); + } + + async function transformNoteObject(tdfNote: TdfNote): Promise { + try { + const decryptedData = await decrypt(tdfNote.tdfBlob.buffer); + + // Attempt to parse the decrypted data + try { + const parsedData = JSON.parse(decryptedData); + return { tdfNote, decryptedData: parsedData }; + } catch (err) { + console.error('Error parsing decrypted data:', err); + return null; + } } catch (err) { - console.error('Error decrypting data, you might not be entitled to it:', err); - return null; + console.error('Error decrypting data:', err); + return null; // Return null if decryption fails } } + async function queryTdfObjects(request: PartialMessage): Promise { const response = await crpcClient.queryTdfObjects(request, { headers: { 'Authorization': user?.accessToken || '' } }); const tdfObjectResponses = await Promise.all(response.tdfObjects.map(transformTdfObject)); // todo: replace this with filter(not null) once we can upgrade to latest TS version w/ type inference - return tdfObjectResponses.filter((tdfObjectResponse): tdfObjectResponse is TdfObjectResponse => tdfObjectResponse !== null); + return tdfObjectResponses.filter((tdfObjectResponse: TdfObjectResponse | null): tdfObjectResponse is TdfObjectResponse => tdfObjectResponse !== null); + } + + async function queryTdfObjectsLight(request: PartialMessage): Promise { + const response = await crpcClient.queryTdfObjects(request, { headers: { 'Authorization': user?.accessToken || '' }}); + return response.tdfObjects; + } + + async function updateTdfObject(request: PartialMessage): Promise { + const response = await crpcClient.updateTdfObject(request, { headers: { 'Authorization': user?.accessToken || '' } }); + return response; + } + + async function queryNotes(request: PartialMessage): Promise { + console.log("Request: ",request); + const response = await drpcClient.queryTdfNotes(request, { headers: { 'Authorization': user?.accessToken || '' } }); + console.log('Response:', response); + const noteResponses = await Promise.all(response.tdfNotes.map(transformNoteObject)); + + // Filter to remove null values + return noteResponses.filter((tdfNoteResponse): tdfNoteResponse is TdfNotesResponse => tdfNoteResponse !== null); } return { + queryNotes, + createNoteObject: drpcClient.createTdfNote, + updateTdfObject, queryTdfObjects, + queryTdfObjectsLight, + transformTdfObject, createTdfObject: crpcClient.createTdfObject, + clearTdfObjectCache, getSrcType: crpcClient.getSrcType, listSrcTypes: crpcClient.listSrcTypes, streamTdfObjects: crpcClient.streamTdfObjects, diff --git a/common-operating-picture/ui/src/hooks/useTdf.tsx b/common-operating-picture/ui/src/hooks/useTdf.tsx index f157109..2219804 100644 --- a/common-operating-picture/ui/src/hooks/useTdf.tsx +++ b/common-operating-picture/ui/src/hooks/useTdf.tsx @@ -1,7 +1,12 @@ import { AuthUser } from '@/contexts/AuthContext'; -import { AuthProviders, NanoTDFClient, TDF3Client, DecryptSource } from '@opentdf/client'; import { config } from '@/config'; import { useAuth } from './useAuth'; +import { AuthProviders, DSP } from '@virtru/dsp-sdk'; + +type BufferSource = { + type: 'buffer'; + location: Uint8Array; +}; /** Creates a new instance of an OIDC Auth Provider consumed by the TDF Clients */ async function createAuthProvider(user: AuthUser | null) { @@ -23,115 +28,83 @@ async function createAuthProvider(user: AuthUser | null) { }); } -/** Converts a string payload into a the data type expected by the TDF3Client */ -function stringToReadableStream(input: string): ReadableStream { - // Encode the string into a Uint8Array - const encoder = new TextEncoder(); - const uint8Array = encoder.encode(input); - - // Create a ReadableStream - return new ReadableStream({ - start(controller) { - // Enqueue the Uint8Array into the stream - controller.enqueue(uint8Array); - // Close the stream - controller.close(); - }, - }); +function stringToSource(input: string): BufferSource { + return { + type: 'buffer', + location: new TextEncoder().encode(input), + }; } -/* +/** * This hook exposes two functions: - * - encrypt: Encrypts a plaintext string as either a ZTDF (TDF3) by default or a NanoTDF if configured - * - decrypt: Inspects encrypted payload to determine if it is a NanoTDF or TDF3 and decrypts accordingly + * - encrypt: Encrypts a plaintext string as either a ZTDF (TDF3) by default or a NanoTDF if configured. + * - decrypt: Decrypts an encrypted TDF payload (handles both TDF3 and NanoTDF automatically). */ export function useTDF() { const { user } = useAuth(); + const platformUrl = config.dsp.baseUrl; + + // Initialize unified DSP/OpenTDF client + const initializeClient = async () => { + const authProvider = await createAuthProvider(user); + // New DSP client instance + const dsp = new DSP({ + authProvider, + platformUrl: platformUrl, + disableDPoP: true, + }); + + return dsp; + }; const encryptNano = async (plaintext: string, attrs: string[]): Promise => { - const client = new NanoTDFClient({ - authProvider: await createAuthProvider(user), - kasEndpoint: config.dsp.kasUrl, - dpopEnabled: false, + const dsp = await initializeClient(); + const tdfPayload = await dsp.createNanoTDF({ + source: stringToSource(plaintext), + attributes: attrs, }); - for (const attr of attrs) { - client.addAttribute(attr); - } - return client.encrypt(plaintext); + return new Response(tdfPayload).arrayBuffer(); }; const encryptZTDF = async (plaintext: string, attrs: string[]): Promise => { - const client = new TDF3Client({ - authProvider: await createAuthProvider(user), - kasEndpoint: config.dsp.kasUrl, - dpopEnabled: false, - allowedKases: [config.dsp.kasUrl], - }); - const readable = await client.encrypt({ - scope: { attributes: attrs }, - source: stringToReadableStream(plaintext), - offline: true, + const dsp = await initializeClient(); + const tdfPayload = await dsp.createZTDF({ + source: stringToSource(plaintext), + attributes: attrs, }); - return readable.toBuffer(); + + return new Response(tdfPayload).arrayBuffer(); }; const encrypt = async (plaintext: string, attrs: string[]): Promise => { // environment variables end up strings even when defined as boolean in TS if (config.formSubmitNanoTdf === 'false' || !config.formSubmitNanoTdf) { - console.debug('Encrypting as TDF3...'); + console.debug('Encrypting as TDF3 using DSP SDK...'); return encryptZTDF(plaintext, attrs); } else { - console.debug('Encrypting as NanoTDF...'); + console.debug('Encrypting as NanoTDF using DSP SDK...'); return encryptNano(plaintext, attrs); } }; - const decryptNano = async (ciphertext: ArrayBuffer): Promise => { - const client = new NanoTDFClient({ - authProvider: await createAuthProvider(user), - kasEndpoint: config.dsp.kasUrl, - dpopEnabled: false, - }); - const buffer = await client.decrypt(ciphertext); - return new TextDecoder().decode(buffer); - }; - - const decryptTdf3 = async (ciphertext: ArrayBuffer): Promise => { - const client = new TDF3Client({ - authProvider: await createAuthProvider(user), - kasEndpoint: config.dsp.kasUrl, - dpopEnabled: false, - allowedKases: [config.dsp.kasUrl], - }); - const buffered: DecryptSource = { + const decrypt = async (ciphertext: ArrayBuffer): Promise => { + const dsp = await initializeClient(); + const bufferedSource: BufferSource = { type: 'buffer', location: new Uint8Array(ciphertext), }; - return (await client.decrypt({ source: buffered })).toString(); - }; - const decrypt = async (ciphertext: ArrayBuffer): Promise => { - // Expected bytes corresponding to Magic Number 'L1L' ASCII characters - // For more info, see: https://github.com/opentdf/spec/tree/main/schema/nanotdf#3311-magic-number--version - const expectedBytes = new Uint8Array([0x4c, 0x31, 0x4c]); - - // Create a Uint8Array view of the buffer - const view = new Uint8Array(ciphertext); - - // Check if the first three bytes match the Magic Number - for (let i = 0; i < 3; i++) { - if (view[i] !== expectedBytes[i]) { - console.debug('Detected TDF3 and decrypting...'); - return decryptTdf3(ciphertext); - } - } + console.debug('Decrypting TDF/NanoTDF using DSP SDK...'); - console.debug('Detected NanoTDF and decrypting...'); - return decryptNano(ciphertext); + const stream = await dsp.read({ + source: bufferedSource, + }); + + return new Response(stream).text(); }; return { decrypt, encrypt, }; -} +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/pages/SourceTypes/CreateDialog.tsx b/common-operating-picture/ui/src/pages/SourceTypes/CreateDialog.tsx index de0c47c..dac52be 100644 --- a/common-operating-picture/ui/src/pages/SourceTypes/CreateDialog.tsx +++ b/common-operating-picture/ui/src/pages/SourceTypes/CreateDialog.tsx @@ -1,4 +1,4 @@ -import { useRef, useState, useEffect } from 'react'; +import { useRef, useState, useContext } from 'react'; import { LatLng } from 'leaflet'; import { useTDF } from '@/hooks/useTdf'; import { useRpcClient } from '@/hooks/useRpcClient'; @@ -13,10 +13,12 @@ import { customizeValidator } from '@rjsf/validator-ajv8'; import { Theme as RJSFFormMuiTheme } from '@rjsf/mui'; import { getAttributes } from '@/utils/attributes'; import { Country, countryFromPoint } from '@/utils/countries'; -import { CreateTdfObjectRequest } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { CreateTdfObjectRequest } from '@/proto/tdf_object/v1/tdf_object_pb.ts'; import { PartialMessage, Timestamp } from '@bufbuild/protobuf'; import dayjs from 'dayjs'; import { Alert } from '@mui/material'; +import { BannerContext } from '@/contexts/BannerContext'; +import { checkAndSetUnavailableAttributes } from '@/utils/attributes'; type Props = { open: boolean; @@ -30,7 +32,10 @@ const formIdPrefix = 'srcTypeForm'; export function CreateDialog({ open, onClose }: Props) { const [mapPosition, setMapPosition] = useState(); const [ unavailableAttrs, setUnavailAttrs ] = useState([]); - const [ entitlements, setEntitlements ] = useState>(new Set()); + + const { + activeEntitlements, + } = useContext(BannerContext); const formRef = useRef | null>(null); @@ -39,6 +44,10 @@ export function CreateDialog({ open, onClose }: Props) { const { encrypt } = useTDF(); const { createTdfObject } = useRpcClient(); + const handleCancel = () => { + onClose(); + }; + const handleMapPositionChange = (newPosition: LatLng) => { if (!formRef.current) { return; @@ -64,25 +73,13 @@ export function CreateDialog({ open, onClose }: Props) { const handleChange = (data: IChangeEvent, fieldName?: string) => { const { formData } = data; - if (!formData) { - return; - } - - const pendingUnavailAttrs = Object.entries(formData).reduce((acc: string[], [key, value]) => { - if (attrFields?.includes(key)) { - if (!Array.isArray(value)) { - value = [value as string]; - } - (value as string[]).forEach((v: string) => { - if (v && !entitlements.has(v)) { - acc.push(v); - } - }); - } - return acc; - }, []); - - setUnavailAttrs(pendingUnavailAttrs); + // Use new util in attributes.ts + checkAndSetUnavailableAttributes( + data, + attrFields, + activeEntitlements, + setUnavailAttrs + ); if (!geoField) { return; @@ -109,6 +106,12 @@ export function CreateDialog({ open, onClose }: Props) { return; } + // Disable submit if unauthorized entitlements + if (unavailableAttrs.length > 0) { + console.warn('Attempted search with missing entitlements. Submission blocked.'); + return; + } + try { const attrs: string[] = []; for (const field of attrFields || []) { @@ -116,6 +119,7 @@ export function CreateDialog({ open, onClose }: Props) { attrs.push(...getAttributes(formData[field])); } } + const tdfBlob = await encrypt(JSON.stringify(formData), attrs); const tdfObject: PartialMessage = { @@ -154,11 +158,8 @@ export function CreateDialog({ open, onClose }: Props) { const utcDate = dayjs(formData[tsField]).utc().toDate(); tdfObject.ts = Timestamp.fromDate(utcDate); } + await createTdfObject(tdfObject); - const response = await createTdfObject(tdfObject); - console.debug('Form submission successful:', response); - - // todo: do we need to pass the created object back to the parent? onClose(); } catch (err) { console.error('Form submission failed:', err); @@ -173,15 +174,16 @@ export function CreateDialog({ open, onClose }: Props) { ); } - - + + /** * todo: Hack for loading state during entitlements retrieval - * + * * The entitlements are loaded and will either be a populated or empty set, and * the 'loading' entry will be removed at that point. */ - if (entitlements.has('loading')) { + // Use active enetilements + if (activeEntitlements.size === 0 && user?.entitlements?.length) { return ( Loading entitlements... @@ -203,12 +205,6 @@ export function CreateDialog({ open, onClose }: Props) { return null; }; - useEffect(() => { - if (user) { - setEntitlements(new Set(user.entitlements)); - } - }, [user]); - return ( {renderAttributesAlert()} @@ -238,7 +234,7 @@ export function CreateDialog({ open, onClose }: Props) { - + diff --git a/common-operating-picture/ui/src/pages/SourceTypes/SearchFilter.tsx b/common-operating-picture/ui/src/pages/SourceTypes/SearchFilter.tsx index 2225511..7c1ccd0 100644 --- a/common-operating-picture/ui/src/pages/SourceTypes/SearchFilter.tsx +++ b/common-operating-picture/ui/src/pages/SourceTypes/SearchFilter.tsx @@ -1,6 +1,6 @@ import { useEffect, useState, useRef, useContext } from 'react'; import { useSearchParams } from 'react-router-dom'; -import { TdfObjectResponse, useRpcClient } from '@/hooks/useRpcClient'; +import { useRpcClient } from '@/hooks/useRpcClient'; import { Alert, Backdrop, Box, Button, CircularProgress, Popover } from '@mui/material'; import { FilterAlt } from '@mui/icons-material'; import { useSourceType } from './SourceTypeContext'; @@ -9,12 +9,14 @@ import { RJSFSchema } from '@rjsf/utils'; import Form, { IChangeEvent, withTheme } from '@rjsf/core'; import { Theme as RJSFFormMuiTheme } from '@rjsf/mui'; import { customizeValidator } from '@rjsf/validator-ajv8'; -import { BannerContext, ClassificationPriority, Classifications, extractValues } from '@/contexts/BannerContext'; +import { BannerContext } from '@/contexts/BannerContext'; import { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from 'lz-string'; import { LatLng, Map } from 'leaflet'; -import { TimestampSelector } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { TimestampSelector } from '@/proto/tdf_object/v1/tdf_object_pb.ts'; import dayjs from 'dayjs'; import { Timestamp } from '@bufbuild/protobuf'; +import { useAuth } from '@/hooks/useAuth'; +import { checkAndSetUnavailableAttributes, checkObjectEntitlements } from '@/utils/attributes'; const validator = customizeValidator(); const SearchForm = withTheme(RJSFFormMuiTheme); @@ -29,15 +31,26 @@ type QueryParamState = { type Props = { map: Map | null; - onSearch: (results: TdfObjectResponse[]) => void; } -export function SearchFilter({ map, onSearch }: Props) { +export function SearchFilter({ map }: Props) { //onSearch removed const [menuAnchorEl, setMenuAnchorEl] = useState(null); const [searchParams, setSearchParams] = useSearchParams(); + // Define entitlements and unavailableAttrs state correctly + const [unavailableAttrs, setUnavailAttrs] = useState([]); + + // Use useAuth to get user and error status + const { user, error: authCtxError } = useAuth(); + const { id: srcTypeId, searchFormSchema } = useSourceType(); - const { setClassification, setNeedToKnow, setRelTo, setSearchIsActive, setHasResults } = useContext(BannerContext); + + const { + setHasResults, + activeEntitlements, + setTdfObjects, + } = useContext(BannerContext); + const { queryTdfObjects } = useRpcClient(); const formRef = useRef | null>(null); @@ -46,19 +59,62 @@ export function SearchFilter({ map, onSearch }: Props) { const [loading, setLoading] = useState(false); const [error, setError] = useState(''); - const updateBanner = (response: TdfObjectResponse[]) => { - let classPriority = 0; - let needToKnow = new Set(); - let relTo = new Set(); - setHasResults(true); - response.forEach((o) => { - classPriority = Math.max(classPriority, ClassificationPriority[extractValues(o.decryptedData.attrClassification) as keyof typeof ClassificationPriority]); - needToKnow = new Set([...needToKnow, ...extractValues(o.decryptedData.attrNeedToKnow || []).split(', ')]); - relTo = new Set([...relTo, ...extractValues(o.decryptedData.attrRelTo || []).split(', ')]); - }); - setClassification(Classifications[classPriority]); - setNeedToKnow([...needToKnow].join(', ')); - setRelTo([...relTo].join(', ')); + // Handler to open the menu and save current banner state + const handleOpenMenu = (e: React.MouseEvent) => { + setMenuAnchorEl(e.currentTarget); // Open the popover + }; + + // Handler to close the menu, restoring original banner state + const handleCancel = () => { + setMenuAnchorEl(null); // Close the popover + }; + + const { geoField, attrFields } = useSourceType(); + + const renderAttributesAlert = () => { + if (authCtxError) { + return ( + + Error loading entitlements, please reauthenticate to try again. + + ); + } + + // Add logic for checking entitlements loading state + if (activeEntitlements.size === 0 && user?.entitlements?.length) { + return ( + + Loading entitlements... + + ); + } + + if (unavailableAttrs.length) { + return ( + + The following attributes are not available to you: + {unavailableAttrs.map(attr => ( +
  • {attr}
  • + ))} +
    + ); + } + + return null; + }; + + const handleChange = (data: IChangeEvent) => { + // Use new util in attributes.ts + checkAndSetUnavailableAttributes( + data, + attrFields, + activeEntitlements, + setUnavailAttrs + ); + + if (!geoField) { + return; + } }; const fetchTdfObjects = async (searchFormData: any) => { @@ -69,22 +125,20 @@ export function SearchFilter({ map, onSearch }: Props) { const dayJsValue = dayjs(startDate); tsRange.greaterOrEqualTo = Timestamp.fromDate(dayJsValue.toDate()); } - if (endDate) { const dayJsValue = dayjs(endDate); tsRange.lesserOrEqualTo = Timestamp.fromDate(dayJsValue.toDate()); } - + let geoLocation = ''; if (map) { // todo: prob a simpler way to create the bbox to pass to RPC request, but it works - + const bounds = map.getBounds(); const nw = bounds.getNorthWest(); const ne = bounds.getNorthEast(); const se = bounds.getSouthEast(); const sw = bounds.getSouthWest(); - const bboxPolygon: GeoJSON.Polygon = { type: 'Polygon', coordinates: [ @@ -93,14 +147,14 @@ export function SearchFilter({ map, onSearch }: Props) { [ne.lng, ne.lat], [se.lng, se.lat], [sw.lng, sw.lat], - // duplicated because polygon type requires the first and last coords to be the same + // duplicated because polygon type requires the + // first and last coords to be the same [nw.lng, nw.lat], ], ], }; geoLocation = JSON.stringify(bboxPolygon); } - return queryTdfObjects({ srcType: srcTypeId, tsRange, @@ -120,6 +174,12 @@ export function SearchFilter({ map, onSearch }: Props) { return; } + // Block search if unavailiable attributes + if (unavailableAttrs.length > 0) { + console.warn('Attempted search with missing entitlements. Submission blocked.'); + return; + } + try { setError(''); setLoading(true); @@ -127,13 +187,21 @@ export function SearchFilter({ map, onSearch }: Props) { const response = await fetchTdfObjects(searchFormData); - if (response.length) { - updateBanner(response); + const filteredResponse = response.filter(tdfObject => { + // Keep the queried tdf object if it does not contain unavailable attributes + return !checkObjectEntitlements(tdfObject, activeEntitlements); + }); + + if (filteredResponse.length) { + setHasResults(true); + } else { + setHasResults(false); } setMenuAnchorEl(null); setFormData(searchFormData); - onSearch(response); + setTdfObjects(filteredResponse); + setSearchParams(params => { const queryState: QueryParamState = { formData: searchFormData, @@ -150,7 +218,7 @@ export function SearchFilter({ map, onSearch }: Props) { console.error('Error querying TDF objects:', err); setError('Server error encountered, please try again later.'); setHasResults(false); - onSearch([]); + setTdfObjects([]); setSearchParams(params => { params.delete('q'); return params; @@ -162,7 +230,6 @@ export function SearchFilter({ map, onSearch }: Props) { useEffect(() => { const query = searchParams.get('q'); - if (!query) { setFormData({}); return; @@ -187,17 +254,15 @@ export function SearchFilter({ map, onSearch }: Props) { } }, [searchParams, map]); - useEffect(() => { - setSearchIsActive(Boolean(menuAnchorEl)); - }), [menuAnchorEl]; - return ( <> - - setMenuAnchorEl(e.currentTarget)} startIcon={}>Filter */} + + setMenuAnchorEl(null)} + // onClose={() => setMenuAnchorEl(null)} + onClose={handleCancel} anchorOrigin={{ vertical: 'bottom', horizontal: 'left', @@ -208,31 +273,14 @@ export function SearchFilter({ map, onSearch }: Props) { Results limited to data within viewable map bounds
    {error && {error}} - { - id = id || ''.replace('root_', ''); - let fx; - switch(id) { - case 'attrClassification': - fx = setClassification; - break; - case 'attrNeedToKnow': - fx = setNeedToKnow; - break; - case 'attrRelTo': - fx = setRelTo; - break; - default: - fx = () => {}; - } - - fx(data.formData[id]); - }} + onChange={handleChange} onSubmit={handleSearch} templates={{ ErrorListTemplate }} noHtml5Validate @@ -240,6 +288,7 @@ export function SearchFilter({ map, onSearch }: Props) { + loading... diff --git a/common-operating-picture/ui/src/pages/SourceTypes/SearchResults.tsx b/common-operating-picture/ui/src/pages/SourceTypes/SearchResults.tsx index 821fd85..356a6ab 100644 --- a/common-operating-picture/ui/src/pages/SourceTypes/SearchResults.tsx +++ b/common-operating-picture/ui/src/pages/SourceTypes/SearchResults.tsx @@ -1,62 +1,113 @@ import { LatLng } from 'leaflet'; -import { Accordion, AccordionDetails, AccordionSummary, Box, Card, CardContent, Stack, Typography, IconButton } from '@mui/material'; -import { ExpandMore, GpsFixed } from '@mui/icons-material'; +import { Card, CardContent, Typography } from '@mui/material'; import { TdfObjectResponse } from '@/hooks/useRpcClient'; -import { useSourceType } from './SourceTypeContext'; -import { formatDateTime } from '@/utils/format'; -import { propertyOf } from 'lodash'; +import { useState, useEffect, useCallback } from 'react'; +import { ClassificationPriority, extractValues } from '@/contexts/BannerContext'; +import { TdfObjectResult } from './TdfObjectResult'; +import { useEntitlements } from '@/hooks/useEntitlements'; type Props = { tdfObjects: TdfObjectResponse[]; onFlyToClick: (location: LatLng) => void; }; -export function SearchResults({ tdfObjects, onFlyToClick }: Props) { - const { displayFields, getFieldTitle } = useSourceType(); +// Type defining the structure of search attributes extracted from TDF objects and notes +interface TDFObjectSearchAttributes { + attrClassification?: string[]; + attrNeedtoknow?: string[]; + attrRelto?: string[]; +} - const handleFlyToClick = (o: TdfObjectResponse) => { - const coordinates = JSON.parse(o.tdfObject.geo).coordinates; +// Define the attribute structure coming from the TdfObjectResult component +interface NoteAttributeData { + noteId: string; + searchAttributes: string; +} - // NOTE: tdfObject provides coordinates as long/lat, but Leaflet expects coordinates as lat/long - onFlyToClick(new LatLng(coordinates[1], coordinates[0])); - }; +export function SearchResults({ tdfObjects, onFlyToClick }: Props) { + const [allNoteAttributes, setAllNoteAttributes] = useState>({}); + const { categorizedData } = useEntitlements(); - const renderHeader = (o: TdfObjectResponse) => { - let formattedDateTime = 'Time Not Recorded'; - - if (o.tdfObject.ts) { - formattedDateTime = formatDateTime(o.tdfObject.ts.toDate().toISOString()); - } + // Handler to receive updated notes + const handleNotesUpdated = useCallback((objectId: string, notes: NoteAttributeData[]) => { + // Only update state if the notes have actually changed + setAllNoteAttributes((prev) => { + const currentNotes = prev[objectId] || []; + if (JSON.stringify(currentNotes) !== JSON.stringify(notes)) { + return { + ...prev, + [objectId]: notes, + }; + } + return prev; // No update if the notes are the same + }); + }, []); - const value = propertyOf(o.decryptedData)(displayFields?.header || 'id'); + // Function to combine banner attributes from all TDF objects and their notes + const combineAndUpdateBanner = useCallback(() => { + let classPriority = 0; + let needToKnow = new Set(); + let relTo = new Set(); - return ( - - - {getFieldTitle(displayFields?.header)}: {value} - - - {formattedDateTime} - - - ); - }; + // Iterate over tdfobjects + tdfObjects.forEach((o) => { + // Classification + const objClassification = extractValues(o.decryptedData.attrClassification); + const classificationKey = objClassification as keyof typeof ClassificationPriority; + if (ClassificationPriority.hasOwnProperty(classificationKey)) { + classPriority = Math.max(classPriority, ClassificationPriority[classificationKey]); + } + // NeedToKnows and RelTos + const objNeedToKnows = extractValues(o.decryptedData.attrNeedToKnow || []).split(', ').filter(v => v.trim() !== ''); + objNeedToKnows.forEach(v => needToKnow.add(v)); + const objRelTo = extractValues(o.decryptedData.attrRelTo || []).split(', ').filter(v => v.trim() !== ''); + objRelTo.forEach(v => relTo.add(v)); + }); + + // Iterate over notes to extract their attributes + Object.values(allNoteAttributes).flat().forEach((note) => { + let parsedNote: TDFObjectSearchAttributes = {}; + try { + parsedNote = JSON.parse(note.searchAttributes); + } catch (e) { + console.error("Failed to parse note search attributes:", e); + return; + } - const renderDetails = (o: TdfObjectResponse) => { - const oa = propertyOf(o.decryptedData); + // Note attribute extractor + const extractNoteAttr = (attrArray: string[] | undefined): string[] => { + if (!attrArray || attrArray.length === 0) return []; - const details = (displayFields?.details || []).map(field => { - const value = oa(field); + // Iterate over all attributes in the array + return attrArray.map((attrUrl: string) => + attrUrl.split('/').pop()?.toUpperCase() || '' + ).filter(v => v.trim() !== ''); + }; - return ( - - {getFieldTitle(field)}: {value} - - ); + // Classification + const noteClassification = extractNoteAttr(parsedNote.attrClassification); + if (noteClassification.length > 0) { + const classificationKey = noteClassification[0] as keyof typeof ClassificationPriority; + if (ClassificationPriority.hasOwnProperty(classificationKey)) { + classPriority = Math.max(classPriority, ClassificationPriority[classificationKey]); + } + } + // NeedToKnows and RelTos + extractNoteAttr(parsedNote.attrNeedtoknow).forEach(v => needToKnow.add(v)); + extractNoteAttr(parsedNote.attrRelto).forEach(v => relTo.add(v)); }); - - return details; - }; + + }, [ + tdfObjects, + allNoteAttributes, + ]); + + + // UseEffect that triggers the update when new objects or collected notes change + useEffect(() => { + combineAndUpdateBanner(); + //console.log("SearchResults useEffect triggered banner update."); + }, [combineAndUpdateBanner]); if (!tdfObjects.length) { return ( @@ -68,18 +119,13 @@ export function SearchResults({ tdfObjects, onFlyToClick }: Props) { ); } - return tdfObjects.map((o, idx) => ( - - }> - {renderHeader(o)} - {/* todo: add attributes chips here? */} - - - {renderDetails(o)} - handleFlyToClick(o)}> - - - - + return tdfObjects.map((o) => ( + )); } diff --git a/common-operating-picture/ui/src/pages/SourceTypes/SourceTypeProvider.tsx b/common-operating-picture/ui/src/pages/SourceTypes/SourceTypeProvider.tsx index bde4bd1..7e31dab 100644 --- a/common-operating-picture/ui/src/pages/SourceTypes/SourceTypeProvider.tsx +++ b/common-operating-picture/ui/src/pages/SourceTypes/SourceTypeProvider.tsx @@ -66,6 +66,7 @@ type Props = { }; export function SourceTypeProvider({ children, srcType }: Props) { + const [createFormSchema, setCreateFormSchema] = useState({ form: {}, ui: {} }); const [searchFormSchema, setSearchFormSchema] = useState({ form: {}, ui: {} }); @@ -81,7 +82,8 @@ export function SourceTypeProvider({ children, srcType }: Props) { throw new Error('SourceType does not have a form schema'); } - const createFormSchema: RJSFSchema = formSchema.toJson(); + // Clone schema to safely mutate + let createFormSchema: RJSFSchema = JSON.parse(JSON.stringify(formSchema.toJson())); const searchFormSchema: RJSFSchema = { type: 'object', @@ -99,11 +101,18 @@ export function SourceTypeProvider({ children, srcType }: Props) { }, // pull property definitions for searchable fields ...(metadata?.searchFields || []).reduce((schema: any, field: string) => { - schema[field] = createFormSchema.properties[field]; + const prop = createFormSchema.properties?.[field]; + + if (!prop) { + console.warn(`Field "${field}" is not defined in createFormSchema.properties`); + return schema; + } + + schema[field] = prop; return schema; }, {}), }, - }; + }; const createUiSchema = buildUiSchema(uiSchema); @@ -130,7 +139,7 @@ export function SourceTypeProvider({ children, srcType }: Props) { form: searchFormSchema, ui: searchUiSchema, }); - + }, [srcType]); if (!srcType) { diff --git a/common-operating-picture/ui/src/pages/SourceTypes/TdfObjectResult.tsx b/common-operating-picture/ui/src/pages/SourceTypes/TdfObjectResult.tsx new file mode 100644 index 0000000..63dd202 --- /dev/null +++ b/common-operating-picture/ui/src/pages/SourceTypes/TdfObjectResult.tsx @@ -0,0 +1,371 @@ +import { useState, useEffect, useCallback, useRef, useContext } from 'react'; +import { LatLng } from 'leaflet'; +import { Accordion, AccordionDetails, AccordionSummary, Autocomplete, Box, Button, Chip, + IconButton, TextField, Stack, Typography, FormControl, InputLabel, Select, MenuItem } from '@mui/material'; +import { ExpandMore, GpsFixed } from '@mui/icons-material'; +import { TdfObjectResponse, TdfNotesResponse, useRpcClient } from '@/hooks/useRpcClient'; +import { useSourceType } from './SourceTypeContext'; +import { formatDateTime } from '@/utils/format'; +import { propertyOf } from 'lodash'; +import { CreateTdfNoteRequest } from '@/proto/tdf_object/v1/tdf_note_pb'; +import { PartialMessage } from '@bufbuild/protobuf'; +import { useTDF } from '@/hooks/useTdf'; +import { BannerContext, extractValues } from '@/contexts/BannerContext'; +import { checkNoteEntitlements, checkRelToEntitlements, reltoMap } from '@/utils/attributes'; +import { ObjectBanner } from '@/components/ObjectBanner'; + +// Note data structure to pass note attributes back to parent +interface NoteAttributeData { + noteId: string; + searchAttributes: string; +} + +// TDF Object search attributes +interface TDFObjectSearchAttributes { + attrClassification?: string[]; + attrNeedtoknow?: string[]; + attrRelto?: string[]; +} + +// New component props +type Props = { + tdfObjectResponse: TdfObjectResponse; + categorizedData: Record; + onFlyToClick: (location: LatLng) => void; + onNotesUpdated: (objectId: string, notes: NoteAttributeData[]) => void; +}; + +export function TdfObjectResult({ tdfObjectResponse: o, categorizedData, onFlyToClick, onNotesUpdated }: Props) { + const { displayFields, getFieldTitle } = useSourceType(); + const { encrypt } = useTDF(); + const { createNoteObject, queryNotes } = useRpcClient(); + const { activeEntitlements } = useContext(BannerContext); + // Isolated note text box state + const [noteText, setNoteText] = useState(''); + // Isolated state for managing dropdown selections + const [localSelectedValues, setLocalSelectedValues] = useState<{ [key: string]: string | string[] }>({}); + // Isolated state for note results for this object + const [objectNotes, setObjectNotes] = useState([]); + // Loading state + const [isLoading, setIsLoading] = useState(true); + const prevObjectId = useRef(null); + // fetchNotes given objectId + const fetchNotes = useCallback(async (objectId: string, isNoteSubmission = false) => { + + // Skip refetch if same objectId and not a note submission to prevent unnecessary/looping calls + if (objectId === prevObjectId.current && !isNoteSubmission) return; + + // Update previous objectId reference + if (!isNoteSubmission) { + prevObjectId.current = objectId; + setIsLoading(true); + } + + try { + //console.log(`Fetching notes for object ID: ${objectId}`); + const notes = await queryNotes({ parentId: objectId }); + + // Filter notes for attributes not in activeEntitlements + const filteredNotes = notes.filter(note => { + // Keep the queried note if it does not contain unavailable attributes + return !checkNoteEntitlements(note, activeEntitlements); + }); + + setObjectNotes(filteredNotes); + //console.log("Fetched notes: ", notes); + + // Map notes to the simpler structure for parent + const noteAttributes = filteredNotes.map(note => ({ + noteId: note.tdfNote.id, + searchAttributes: note.tdfNote.search, + })); + + // Pass notes back to parent + onNotesUpdated(objectId, noteAttributes); + } catch (error) { + console.error('Error fetching notes:', error); + } finally { + setIsLoading(false); // End loading + } +}, [queryNotes, onNotesUpdated]); + + // Initial fetch on mount or if the tdfObject changes + useEffect(() => { + fetchNotes(o.tdfObject.id); + }, [o.tdfObject.id, fetchNotes]); + + const handleFlyToClick = () => { + const coordinates = JSON.parse(o.tdfObject.geo).coordinates; + // NOTE: tdfObject provides coordinates as long/lat, but Leaflet expects coordinates as lat/long + onFlyToClick(new LatLng(coordinates[1], coordinates[0])); + }; + + // Only updates the local note text state + const handleNoteChange = (e: React.ChangeEvent) => { + setNoteText(e.target.value); + }; + + // Handles dropdown changes for local state + const handleDropdownChange = (category: string, value: string | string[]) => { + setLocalSelectedValues((prevValues) => ({ + ...prevValues, + [category]: value, + })); + }; + + // Submits the note along with selected attributes + const handleNoteSubmit = async () => { + // Validation Checks + // Ensure note text is not empty and classification is selected if required + const trimmedNoteText = noteText.trim(); + const classificationSelected = localSelectedValues['classification']; + + if (!trimmedNoteText) { + window.alert("Note Submission Error: Note needs to have text, cannot be empty."); + return; + } + + const hasClassificationEntitlements = Object.keys(categorizedData).includes('classification'); + if (hasClassificationEntitlements && !classificationSelected) { + window.alert("Note Submission Error: Must have a classification attribute selected."); + return; + } + + // Prepare an object to store the attributes for encryption + const attrs: { [key: string]: string[] } = { + attrClassification: [], + attrNeedtoknow: [], + attrRelto: [], + }; + + // Loop through each category and populate attrs based on local selections + Object.keys(categorizedData).forEach((category) => { + const selectedValue = localSelectedValues[category]; + if (!selectedValue) return; + + // Get the selected value for the category from selectedValues + const categoryKey = `attr${category.charAt(0).toUpperCase() + category.slice(1)}`; + + // Handle both single and multiple selections + const valuesToProcess = Array.isArray(selectedValue) ? selectedValue : [selectedValue]; + + if (attrs[categoryKey]) { + valuesToProcess.forEach(val => { + // Check if it's relto to apply the specific format + if (category.toLowerCase() === 'relto') { + // Force lowercase for the value in the URL + attrs[categoryKey].push(`https://demo.com/attr/relto/value/${val.toLowerCase()}`); + } else { + attrs[categoryKey].push(`https://demo.com/attr/${category}/value/${val}`); + } + }); + } + }); + + // Check entitlements for the selected relTo before submission + if (checkRelToEntitlements(attrs.attrRelto, activeEntitlements)) { + window.alert("You do not have the required RelTo entitlements to submit this note."); + return; + } + + // Encrypt and submit + const tdfBlob = await encrypt(JSON.stringify(trimmedNoteText), Object.values(attrs).flat()); + + // Ensure search is either a valid stringified object or null if empty + const search = Object.keys(attrs).some(key => attrs[key].length > 0) ? JSON.stringify(attrs) : ""; + + const tdfNote: PartialMessage = { + parentId: o.tdfObject.id, + search: search, + tdfBlob: new Uint8Array(tdfBlob), + }; + + // Create the note (submit) + await createNoteObject(tdfNote); + + // Re-fetch notes and update parent + setNoteText(''); // Clear text box + + // Must indicate that this fetch is due to a note submission + await fetchNotes(o.tdfObject.id, true); + }; + + // Render Functions + const renderHeader = () => { + let formattedDateTime = 'Time Not Recorded'; + if (o.tdfObject.ts) { + formattedDateTime = formatDateTime(o.tdfObject.ts.toDate().toISOString()); + } + const value = propertyOf(o.decryptedData)(displayFields?.header || 'id'); + return ( + + + {getFieldTitle(displayFields?.header || 'id')}: {value} + + {formattedDateTime} + + ); + }; + + const renderDetailsAndNotes = () => { + const details = (displayFields?.details || []).map((field) => { + let value = propertyOf(o.decryptedData)(field); + if (typeof value === 'object' && value !== null) { + if ('country' in value) { + value = value.country; + } else { + value = JSON.stringify(value); + } + } + return ( + + {getFieldTitle(field)}: {value} + + ); + }); + + const extractAndJoin = (attrArray: string[] | undefined, prefix: string = ''): string => { + if (!attrArray || attrArray.length === 0) return ''; + const values = attrArray.map(attrUrl => attrUrl.split('/').pop()).filter(v => v && v.trim() !== ''); + return values.length > 0 ? `${prefix}${values.join(' // ')}` : ''; + } + + const notes = objectNotes.length > 0 ? ( + objectNotes.map((note, index) => { + let parsedNote: TDFObjectSearchAttributes = {}; + try { + parsedNote = JSON.parse(note.tdfNote.search); + } catch (e) { + console.error("Failed to parse note:", e); + } + + const classificationControl = extractAndJoin(parsedNote.attrClassification); + const needToKnowControls = extractAndJoin(parsedNote.attrNeedtoknow, classificationControl ? ' // ' : ''); + const relToPrefix = (classificationControl || needToKnowControls) ? ' // rel to ' : parsedNote.attrRelto?.length ? 'rel to ' : ''; + const relToControls = extractAndJoin(parsedNote.attrRelto, relToPrefix); + + // Concatenate all parts for the final display + const controlsDisplay = `${classificationControl}${needToKnowControls}${relToControls}`; + + return ( + + Note {index + 1}: {note.decryptedData} + { + + {/* Display the combined controls */} + Control Set: {controlsDisplay} + + } + + ); + }) + ) : ( + + No notes available for this object + + ); + + return (<>{details}{notes}); + }; + + const objClass = extractValues(o.decryptedData.attrClassification || []).split(', '); + const objNTK = extractValues(o.decryptedData.attrNeedToKnow || []).split(', '); + const objRel = extractValues(o.decryptedData.attrRelTo || []).split(', '); + + if (isLoading) { + return null; + } + + return ( + + }> + + + {renderHeader()} + + + + {renderDetailsAndNotes()} + + + + + + {/* Dynamic Dropdowns */} + + {Object.keys(categorizedData).map((category) => { + const isRelTo = category.toLowerCase() === 'relto'; + const isMultiSelect = category === 'needtoknow' || isRelTo; + const options = isRelTo ? Object.keys(reltoMap) : categorizedData[category]; + const currentValue = localSelectedValues[category] || (isMultiSelect ? [] : ''); + + if (isMultiSelect) { + return ( + + isRelTo ? reltoMap[option]?.label || option : option} + value={Array.isArray(currentValue) ? currentValue : []} + onChange={(_, newValue) => handleDropdownChange(category, newValue)} + renderInput={(params) => ( + + )} + renderTags={(tagValue, getTagProps) => + tagValue.map((option, index) => ( + + )) + } + /> + + ); + } + + return ( + + + {category.charAt(0).toUpperCase() + category.slice(1)} + + + + ); + })} + + + + + + + + ); +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/pages/SourceTypes/index.tsx b/common-operating-picture/ui/src/pages/SourceTypes/index.tsx index 63f9b3d..5cd4dab 100644 --- a/common-operating-picture/ui/src/pages/SourceTypes/index.tsx +++ b/common-operating-picture/ui/src/pages/SourceTypes/index.tsx @@ -1,8 +1,8 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState, useContext, useCallback, useMemo } from 'react'; import { useSearchParams } from 'react-router-dom'; import { LayersControl, MapContainer, TileLayer } from 'react-leaflet'; import { LatLng, Map } from 'leaflet'; -import { Box, Button, Grid } from '@mui/material'; +import { Box, Button, Grid, IconButton, Typography } from '@mui/material'; import { AddCircle } from '@mui/icons-material'; import { TdfObjectResponse, useRpcClient } from '@/hooks/useRpcClient'; import { PageTitle } from '@/components/PageTitle'; @@ -11,9 +11,36 @@ import { CreateDialog } from './CreateDialog'; import { SourceTypeSelector } from './SourceTypeSelector'; import { SearchFilter } from './SearchFilter'; import { SearchResults } from './SearchResults'; -import { SrcType } from '@/proto/tdf_object/v1/tdf_object_pb'; +import { SrcType, TdfObject} from '@/proto/tdf_object/v1/tdf_object_pb.ts'; import { config } from '@/config'; import { TdfObjectsMapLayer } from '@/components/Map/TdfObjectsMapLayer'; +import { BannerContext } from '@/contexts/BannerContext'; +import { VehicleLayer } from '@/components/Map/VehicleLayer'; +import { TimestampSelector } from '@/proto/tdf_object/v1/tdf_object_pb.ts'; +import { Timestamp } from '@bufbuild/protobuf'; +import dayjs from 'dayjs'; +import CloseIcon from '@mui/icons-material/Close'; +import { TdfObjectResult } from './TdfObjectResult'; +import { useEntitlements } from '@/hooks/useEntitlements'; + +export interface VehicleDataItem { + id: string; + pos: { lat: number; lng: number }; + rawObject: TdfObject; + data?: { + vehicleName?: string | undefined; + callsign?: string; + origin?: string; + destination?: string; + speed?: string; + altitude?: string; + heading?: string; + aircraft_type?: string; + attrClassification?: string | string[]; + attrNeedToKnow?: string[]; + attrRelTo?: string[]; + }; + } export function SourceTypes() { const [searchParams, setSearchParams] = useSearchParams(); @@ -27,28 +54,52 @@ export function SourceTypes() { const { getSrcType } = useRpcClient(); const [srcType, setSrcType] = useState(); - const [tdfObjects, setTdfObjects] = useState([]); + const { tdfObjects, setTdfObjects, activeEntitlements } = useContext(BannerContext); + const { queryTdfObjectsLight } = useRpcClient(); + + const [vehicleData, setVehicleData] = useState([]); + const [vehicleSrcType, setVehicleSrcType] = useState(); + const vehicleSourceTypeId = "vehicles"; - const fetchSrcType = async (id: string) => { + const [poppedOutVehicle, setPoppedOutVehicle] = useState(null); + + const { categorizedData } = useEntitlements(); + + const filteredVehicleData = useMemo(() => { + if (!activeEntitlements || activeEntitlements.size === 0 || activeEntitlements.has("NoAccess")) { + return vehicleData; + } + + return vehicleData.filter(vehicle => { + const classification = vehicle.data?.attrClassification; + if (!classification) return true; + + const classStr = Array.isArray(classification) ? classification[0] : classification; + if (!classStr) return true; + + return activeEntitlements.has(classStr); + }); + }, [vehicleData, activeEntitlements]); + + const fetchSrcType = useCallback(async (id: string) => { try { const { srcType } = await getSrcType({ srcType: id }); setSrcType(srcType); } catch (err) { - // getSrcType returns a 500 error when srcType doesn't exist in the database. console.warn(`'${id}' is not a valid soure type.`); setSrcType(undefined); setSearchParams(new URLSearchParams()); } - }; + }, [getSrcType, setSearchParams]); - const handleSrcTypeIdChange = (id: string) => { + const handleSrcTypeIdChange = useCallback((id: string) => { const newSearchParams = new URLSearchParams(searchParams); newSearchParams.set('type', id); if (id !== srcTypeId) { newSearchParams.delete('q'); } setSearchParams(newSearchParams); - }; + }, [searchParams, srcTypeId, setSearchParams]); const handleDialogOpen = () => { const newSearchParams = new URLSearchParams(searchParams); @@ -64,13 +115,107 @@ export function SourceTypes() { setDialogOpen(false); }; - const handleFlyToClick = ({ lat, lng }: LatLng) => { - if (!map) { + const handleFlyToClick = useCallback(({ lat, lng }: LatLng) => { + if (!map) { return; } - map.flyTo({ lat, lng }, map.getZoom()); - }; + }, [map]); + + const handleVehicleClick = useCallback((vehicle: VehicleDataItem) => { + console.log("Selected vehicle:", vehicle); + }, []); + + const fetchVehicles = useCallback(async (id: string) => { + try { + const tsRange = new TimestampSelector(); + + const dayjsStart = dayjs().subtract(24000, 'hour'); + tsRange.greaterOrEqualTo = Timestamp.fromDate(dayjsStart.toDate()); + + const response = await queryTdfObjectsLight({ + srcType: id, + tsRange: tsRange, + }); + + // Transform the TdfObjectResponse into VehicleDataItem[] + const vehicleData: VehicleDataItem[] = response + .filter(o => o.geo) // Only include objects with geo data + .map(o => { + const geoJson = JSON.parse(o.geo); + + // GeoJSON Point coordinates are [longitude, latitude] + const [lng, lat] = geoJson.coordinates; + + let telemetry = {}; + try { + if (o.metadata && o.metadata !== "null") { + telemetry = JSON.parse(o.metadata); + } + } catch (e) { + console.error("Metadata parse error", e); + } + + let attributes = {}; + //console.log("Search field:", o.search); + try { + if (o.search && o.search !== "null") { + attributes = JSON.parse(o.search); + } + } catch (e) { + console.error("Search field parse error", e); + } + + return { + id: o.id, // Use the TDF object ID as the marker ID + // Convert to { lat: number, lng: number } + pos: { lat, lng }, + rawObject: o, + data: { ...telemetry, ...attributes }, + }; + }); + + //console.log('Vehicle data fetched:', vehicleData); + + setVehicleData(vehicleData); + } catch (error) { + console.error('Error fetching vehicles:', error); + setVehicleData([]); + } + }, [queryTdfObjectsLight]); + + useEffect(() => { + // Fetch the vehicles schema + const getVehicleSchema = async () => { + try { + const { srcType } = await getSrcType({ srcType: vehicleSourceTypeId }); + setVehicleSrcType(srcType); + } catch (err) { + console.error("Failed to fetch vehicle source type schema", err); + } + }; + + getVehicleSchema(); + }, [getSrcType, fetchVehicles]); + + // New useEffect to fetch the data on component mount + useEffect(() => { + fetchVehicles(vehicleSourceTypeId); + }, []); + + // Refresh vehicle data every so often + useEffect(() => { + + const REFRESH_INTERVAL_MS = 1000; + + const intervalId = setInterval(async () => { + console.log("Refreshing vehicle data...", vehicleSourceTypeId); + await fetchVehicles(vehicleSourceTypeId); + }, REFRESH_INTERVAL_MS); + + return () => clearInterval(intervalId); + }, []); + useEffect(() => { const type = searchParams.get('type'); @@ -93,37 +238,112 @@ export function SourceTypes() { if (mode === 'create') { setDialogOpen(true); } - }, [searchParams]); + }, [searchParams, fetchSrcType, srcTypeId, setTdfObjects]); + + const searchResultsTdfObjects = srcTypeId === vehicleSourceTypeId + ? [] // If the selected type is 'vehicles', show an empty list in SearchResults. + : tdfObjects; // Otherwise, show the actual tdfObjects (from BannerContext). return ( <> - : null} /> - - {!tdfObjects.length - ? null - : - - - } + + {/* Base Layers */} + + + + + + + + + + + {/* Overlay Layers */} + {filteredVehicleData.length > 0 && ( + + {/* Vehicle Layer - key forces re-render when entitlements change */} + + + )} + {/* TDF Object Layer */} + {tdfObjects.length > 0 && ( + + + + )} + - setTdfObjects(results)} /> + - + + {poppedOutVehicle && ( + + + Vehicle Details & Notes + setPoppedOutVehicle(null)} sx={{ color: 'white' }}> + + + + + + { + console.log(`Notes updated for ${objectId}`, notes); + }} + /> + + + + )} ); -} - +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_connect.ts b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_connect.ts new file mode 100644 index 0000000..6b1d81b --- /dev/null +++ b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_connect.ts @@ -0,0 +1,63 @@ +// @generated by protoc-gen-connect-es v1.4.0 with parameter "target=ts,import_extension=none" +// @generated from file tdf_object/v1/tdf_note.proto (package tdf_notes.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { CreateTdfNoteRequest, CreateTdfNoteResponse, GetTdfNoteRequest, GetTdfNoteResponse, QueryTdfNotesRequest, QueryTdfNotesResponse, StreamTdfNotesRequest, StreamTdfNotesResponse } from "./tdf_note_pb"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * Service definition for handling TDF notes + * + * @generated from service tdf_notes.v1.TdfNoteService + */ +export const TdfNoteService = { + typeName: "tdf_notes.v1.TdfNoteService", + methods: { + /** + * RPC for creating a new TDF note + * + * @generated from rpc tdf_notes.v1.TdfNoteService.CreateTdfNote + */ + createTdfNote: { + name: "CreateTdfNote", + I: CreateTdfNoteRequest, + O: CreateTdfNoteResponse, + kind: MethodKind.Unary, + }, + /** + * RPC for retrieving a TDF note by ID + * + * @generated from rpc tdf_notes.v1.TdfNoteService.GetTdfNote + */ + getTdfNote: { + name: "GetTdfNote", + I: GetTdfNoteRequest, + O: GetTdfNoteResponse, + kind: MethodKind.Unary, + }, + /** + * RPC for querying notes associated with a TDF object + * + * @generated from rpc tdf_notes.v1.TdfNoteService.QueryTdfNotes + */ + queryTdfNotes: { + name: "QueryTdfNotes", + I: QueryTdfNotesRequest, + O: QueryTdfNotesResponse, + kind: MethodKind.Unary, + }, + /** + * RPC for streaming TDF notes (e.g., for real-time updates) + * + * @generated from rpc tdf_notes.v1.TdfNoteService.StreamTdfNotes + */ + streamTdfNotes: { + name: "StreamTdfNotes", + I: StreamTdfNotesRequest, + O: StreamTdfNotesResponse, + kind: MethodKind.ServerStreaming, + }, + } +} as const; + diff --git a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.d.ts b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.d.ts new file mode 100644 index 0000000..e864db5 --- /dev/null +++ b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.d.ts @@ -0,0 +1,282 @@ +// package: tdf_notes.v1 +// file: tdf_note/v1/tdf_note.proto + +import * as jspb from "google-protobuf"; +import * as google_protobuf_timestamp_pb from "google-protobuf/google/protobuf/timestamp_pb"; + +export class TdfNote extends jspb.Message { + getId(): string; + setId(value: string): void; + + hasTs(): boolean; + clearTs(): void; + getTs(): google_protobuf_timestamp_pb.Timestamp | undefined; + setTs(value?: google_protobuf_timestamp_pb.Timestamp): void; + + getParentId(): string; + setParentId(value: string): void; + + getSearch(): string; + setSearch(value: string): void; + + getTdfBlob(): Uint8Array | string; + getTdfBlob_asU8(): Uint8Array; + getTdfBlob_asB64(): string; + setTdfBlob(value: Uint8Array | string): void; + + getTdfUri(): string; + setTdfUri(value: string): void; + + hasCreatedAt(): boolean; + clearCreatedAt(): void; + getCreatedAt(): google_protobuf_timestamp_pb.Timestamp | undefined; + setCreatedAt(value?: google_protobuf_timestamp_pb.Timestamp): void; + + getCreatedBy(): string; + setCreatedBy(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TdfNote.AsObject; + static toObject(includeInstance: boolean, msg: TdfNote): TdfNote.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: TdfNote, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TdfNote; + static deserializeBinaryFromReader(message: TdfNote, reader: jspb.BinaryReader): TdfNote; +} + +export namespace TdfNote { + export type AsObject = { + id: string, + ts?: google_protobuf_timestamp_pb.Timestamp.AsObject, + parentId: string, + search: string, + tdfBlob: Uint8Array | string, + tdfUri: string, + createdAt?: google_protobuf_timestamp_pb.Timestamp.AsObject, + createdBy: string, + } +} + +export class CreateTdfNoteRequest extends jspb.Message { + getParentId(): string; + setParentId(value: string): void; + + getSearch(): string; + setSearch(value: string): void; + + getTdfBlob(): Uint8Array | string; + getTdfBlob_asU8(): Uint8Array; + getTdfBlob_asB64(): string; + setTdfBlob(value: Uint8Array | string): void; + + getTdfUri(): string; + setTdfUri(value: string): void; + + hasTs(): boolean; + clearTs(): void; + getTs(): google_protobuf_timestamp_pb.Timestamp | undefined; + setTs(value?: google_protobuf_timestamp_pb.Timestamp): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CreateTdfNoteRequest.AsObject; + static toObject(includeInstance: boolean, msg: CreateTdfNoteRequest): CreateTdfNoteRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: CreateTdfNoteRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CreateTdfNoteRequest; + static deserializeBinaryFromReader(message: CreateTdfNoteRequest, reader: jspb.BinaryReader): CreateTdfNoteRequest; +} + +export namespace CreateTdfNoteRequest { + export type AsObject = { + parentId: string, + search: string, + tdfBlob: Uint8Array | string, + tdfUri: string, + ts?: google_protobuf_timestamp_pb.Timestamp.AsObject, + } +} + +export class CreateTdfNoteResponse extends jspb.Message { + getId(): string; + setId(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CreateTdfNoteResponse.AsObject; + static toObject(includeInstance: boolean, msg: CreateTdfNoteResponse): CreateTdfNoteResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: CreateTdfNoteResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CreateTdfNoteResponse; + static deserializeBinaryFromReader(message: CreateTdfNoteResponse, reader: jspb.BinaryReader): CreateTdfNoteResponse; +} + +export namespace CreateTdfNoteResponse { + export type AsObject = { + id: string, + } +} + +export class GetTdfNoteRequest extends jspb.Message { + getId(): string; + setId(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTdfNoteRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetTdfNoteRequest): GetTdfNoteRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetTdfNoteRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTdfNoteRequest; + static deserializeBinaryFromReader(message: GetTdfNoteRequest, reader: jspb.BinaryReader): GetTdfNoteRequest; +} + +export namespace GetTdfNoteRequest { + export type AsObject = { + id: string, + } +} + +export class GetTdfNoteResponse extends jspb.Message { + hasTdfNote(): boolean; + clearTdfNote(): void; + getTdfNote(): TdfNote | undefined; + setTdfNote(value?: TdfNote): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTdfNoteResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetTdfNoteResponse): GetTdfNoteResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetTdfNoteResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTdfNoteResponse; + static deserializeBinaryFromReader(message: GetTdfNoteResponse, reader: jspb.BinaryReader): GetTdfNoteResponse; +} + +export namespace GetTdfNoteResponse { + export type AsObject = { + tdfNote?: TdfNote.AsObject, + } +} + +export class QueryTdfNotesRequest extends jspb.Message { + getParentId(): string; + setParentId(value: string): void; + + hasStartTs(): boolean; + clearStartTs(): void; + getStartTs(): google_protobuf_timestamp_pb.Timestamp | undefined; + setStartTs(value?: google_protobuf_timestamp_pb.Timestamp): void; + + hasEndTs(): boolean; + clearEndTs(): void; + getEndTs(): google_protobuf_timestamp_pb.Timestamp | undefined; + setEndTs(value?: google_protobuf_timestamp_pb.Timestamp): void; + + getSearch(): string; + setSearch(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): QueryTdfNotesRequest.AsObject; + static toObject(includeInstance: boolean, msg: QueryTdfNotesRequest): QueryTdfNotesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: QueryTdfNotesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): QueryTdfNotesRequest; + static deserializeBinaryFromReader(message: QueryTdfNotesRequest, reader: jspb.BinaryReader): QueryTdfNotesRequest; +} + +export namespace QueryTdfNotesRequest { + export type AsObject = { + parentId: string, + startTs?: google_protobuf_timestamp_pb.Timestamp.AsObject, + endTs?: google_protobuf_timestamp_pb.Timestamp.AsObject, + search: string, + } +} + +export class QueryTdfNotesResponse extends jspb.Message { + clearTdfNotesList(): void; + getTdfNotesList(): Array; + setTdfNotesList(value: Array): void; + addTdfNotes(value?: TdfNote, index?: number): TdfNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): QueryTdfNotesResponse.AsObject; + static toObject(includeInstance: boolean, msg: QueryTdfNotesResponse): QueryTdfNotesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: QueryTdfNotesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): QueryTdfNotesResponse; + static deserializeBinaryFromReader(message: QueryTdfNotesResponse, reader: jspb.BinaryReader): QueryTdfNotesResponse; +} + +export namespace QueryTdfNotesResponse { + export type AsObject = { + tdfNotesList: Array, + } +} + +export class StreamTdfNotesRequest extends jspb.Message { + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): StreamTdfNotesRequest.AsObject; + static toObject(includeInstance: boolean, msg: StreamTdfNotesRequest): StreamTdfNotesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: StreamTdfNotesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): StreamTdfNotesRequest; + static deserializeBinaryFromReader(message: StreamTdfNotesRequest, reader: jspb.BinaryReader): StreamTdfNotesRequest; +} + +export namespace StreamTdfNotesRequest { + export type AsObject = { + } +} + +export class StreamTdfNotesResponse extends jspb.Message { + getEventType(): StreamEventTypeMap[keyof StreamEventTypeMap]; + setEventType(value: StreamEventTypeMap[keyof StreamEventTypeMap]): void; + + getEventDetail(): string; + setEventDetail(value: string): void; + + clearTdfNotesList(): void; + getTdfNotesList(): Array; + setTdfNotesList(value: Array): void; + addTdfNotes(value?: TdfNote, index?: number): TdfNote; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): StreamTdfNotesResponse.AsObject; + static toObject(includeInstance: boolean, msg: StreamTdfNotesResponse): StreamTdfNotesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: StreamTdfNotesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): StreamTdfNotesResponse; + static deserializeBinaryFromReader(message: StreamTdfNotesResponse, reader: jspb.BinaryReader): StreamTdfNotesResponse; +} + +export namespace StreamTdfNotesResponse { + export type AsObject = { + eventType: StreamEventTypeMap[keyof StreamEventTypeMap], + eventDetail: string, + tdfNotesList: Array, + } +} + +export interface StreamEventTypeMap { + STREAM_EVENT_TYPE_UNSPECIFIED: 0; + STREAM_EVENT_TYPE_STARTUP: 1; + STREAM_EVENT_TYPE_SHUTDOWN: 2; + STREAM_EVENT_TYPE_RESTART: 3; + STREAM_EVENT_TYPE_MAINTENANCE: 4; + STREAM_EVENT_TYPE_CONNECTED: 5; + STREAM_EVENT_TYPE_HEARTBEAT: 6; + STREAM_EVENT_TYPE_GENERIC_ERROR: 10; + STREAM_EVENT_TYPE_SERVER_ERROR: 11; + STREAM_EVENT_TYPE_DATA_ERROR: 12; + STREAM_EVENT_TYPE_TDF_NOTES_NEW: 20; +} + +export const StreamEventType: StreamEventTypeMap; + diff --git a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.ts b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.ts new file mode 100644 index 0000000..4918d9e --- /dev/null +++ b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_note_pb.ts @@ -0,0 +1,581 @@ +// @generated by protoc-gen-es v1.9.0 with parameter "target=ts,import_extension=none" +// @generated from file tdf_object/v1/tdf_note.proto (package tdf_notes.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3, Timestamp } from "@bufbuild/protobuf"; + +/** + * The StreamEventType enum is reused from the previous schema + * + * @generated from enum tdf_notes.v1.StreamEventType + */ +export enum StreamEventType { + /** + * @generated from enum value: STREAM_EVENT_TYPE_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * system events + * + * @generated from enum value: STREAM_EVENT_TYPE_STARTUP = 1; + */ + STARTUP = 1, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_SHUTDOWN = 2; + */ + SHUTDOWN = 2, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_RESTART = 3; + */ + RESTART = 3, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_MAINTENANCE = 4; + */ + MAINTENANCE = 4, + + /** + * data events + * + * @generated from enum value: STREAM_EVENT_TYPE_CONNECTED = 5; + */ + CONNECTED = 5, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_HEARTBEAT = 6; + */ + HEARTBEAT = 6, + + /** + * generic events + * + * @generated from enum value: STREAM_EVENT_TYPE_GENERIC_ERROR = 10; + */ + GENERIC_ERROR = 10, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_SERVER_ERROR = 11; + */ + SERVER_ERROR = 11, + + /** + * @generated from enum value: STREAM_EVENT_TYPE_DATA_ERROR = 12; + */ + DATA_ERROR = 12, + + /** + * tdf_notes stream events + * + * @generated from enum value: STREAM_EVENT_TYPE_TDF_NOTES_NEW = 20; + */ + TDF_NOTES_NEW = 20, +} +// Retrieve enum metadata with: proto3.getEnumType(StreamEventType) +proto3.util.setEnumType(StreamEventType, "tdf_notes.v1.StreamEventType", [ + { no: 0, name: "STREAM_EVENT_TYPE_UNSPECIFIED" }, + { no: 1, name: "STREAM_EVENT_TYPE_STARTUP" }, + { no: 2, name: "STREAM_EVENT_TYPE_SHUTDOWN" }, + { no: 3, name: "STREAM_EVENT_TYPE_RESTART" }, + { no: 4, name: "STREAM_EVENT_TYPE_MAINTENANCE" }, + { no: 5, name: "STREAM_EVENT_TYPE_CONNECTED" }, + { no: 6, name: "STREAM_EVENT_TYPE_HEARTBEAT" }, + { no: 10, name: "STREAM_EVENT_TYPE_GENERIC_ERROR" }, + { no: 11, name: "STREAM_EVENT_TYPE_SERVER_ERROR" }, + { no: 12, name: "STREAM_EVENT_TYPE_DATA_ERROR" }, + { no: 20, name: "STREAM_EVENT_TYPE_TDF_NOTES_NEW" }, +]); + +/** + * Represents a note associated with a TDF object + * + * @generated from message tdf_notes.v1.TdfNote + */ +export class TdfNote extends Message { + /** + * Unique identifier for the note + * + * @generated from field: string id = 1; + */ + id = ""; + + /** + * Timestamp of the note creation + * + * @generated from field: google.protobuf.Timestamp ts = 2; + */ + ts?: Timestamp; + + /** + * Parent TDF object ID (foreign key to tdf_objects) + * + * @generated from field: string parent_id = 3; + */ + parentId = ""; + + /** + * Plaintext JSON search index for searching notes + * + * @generated from field: string search = 4; + */ + search = ""; + + /** + * Binary TDF data for the note + * + * @generated from field: bytes tdf_blob = 5; + */ + tdfBlob = new Uint8Array(0); + + /** + * URI pointing to the note data + * + * @generated from field: string tdf_uri = 6; + */ + tdfUri = ""; + + /** + * Timestamp of when the note was created + * + * @generated from field: google.protobuf.Timestamp _created_at = 7; + */ + CreatedAt?: Timestamp; + + /** + * Who created the note + * + * @generated from field: string _created_by = 8; + */ + CreatedBy = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.TdfNote"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "ts", kind: "message", T: Timestamp }, + { no: 3, name: "parent_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + { no: 6, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "_created_at", kind: "message", T: Timestamp }, + { no: 8, name: "_created_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TdfNote { + return new TdfNote().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TdfNote { + return new TdfNote().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TdfNote { + return new TdfNote().fromJsonString(jsonString, options); + } + + static equals(a: TdfNote | PlainMessage | undefined, b: TdfNote | PlainMessage | undefined): boolean { + return proto3.util.equals(TdfNote, a, b); + } +} + +/** + * Request message for creating a new note + * + * @generated from message tdf_notes.v1.CreateTdfNoteRequest + */ +export class CreateTdfNoteRequest extends Message { + /** + * Parent TDF object ID (foreign key to tdf_objects) + * + * @generated from field: string parent_id = 1; + */ + parentId = ""; + + /** + * Plaintext JSON search index for searching notes + * + * @generated from field: string search = 2; + */ + search = ""; + + /** + * Binary TDF data for the note + * + * @generated from field: bytes tdf_blob = 3; + */ + tdfBlob = new Uint8Array(0); + + /** + * URI pointing to the note data + * + * @generated from field: string tdf_uri = 4; + */ + tdfUri = ""; + + /** + * Timestamp of the note + * + * @generated from field: google.protobuf.Timestamp ts = 5; + */ + ts?: Timestamp; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.CreateTdfNoteRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "parent_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + { no: 4, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "ts", kind: "message", T: Timestamp }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateTdfNoteRequest { + return new CreateTdfNoteRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateTdfNoteRequest { + return new CreateTdfNoteRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateTdfNoteRequest { + return new CreateTdfNoteRequest().fromJsonString(jsonString, options); + } + + static equals(a: CreateTdfNoteRequest | PlainMessage | undefined, b: CreateTdfNoteRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateTdfNoteRequest, a, b); + } +} + +/** + * Response message for creating a new note + * + * @generated from message tdf_notes.v1.CreateTdfNoteResponse + */ +export class CreateTdfNoteResponse extends Message { + /** + * Unique identifier of the newly created note + * + * @generated from field: string id = 1; + */ + id = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.CreateTdfNoteResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateTdfNoteResponse { + return new CreateTdfNoteResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateTdfNoteResponse { + return new CreateTdfNoteResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateTdfNoteResponse { + return new CreateTdfNoteResponse().fromJsonString(jsonString, options); + } + + static equals(a: CreateTdfNoteResponse | PlainMessage | undefined, b: CreateTdfNoteResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateTdfNoteResponse, a, b); + } +} + +/** + * Request message to retrieve a note by ID + * + * @generated from message tdf_notes.v1.GetTdfNoteRequest + */ +export class GetTdfNoteRequest extends Message { + /** + * The ID of the note to retrieve + * + * @generated from field: string id = 1; + */ + id = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.GetTdfNoteRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetTdfNoteRequest { + return new GetTdfNoteRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetTdfNoteRequest { + return new GetTdfNoteRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetTdfNoteRequest { + return new GetTdfNoteRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetTdfNoteRequest | PlainMessage | undefined, b: GetTdfNoteRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetTdfNoteRequest, a, b); + } +} + +/** + * Response message for retrieving a note by ID + * + * @generated from message tdf_notes.v1.GetTdfNoteResponse + */ +export class GetTdfNoteResponse extends Message { + /** + * The note object + * + * @generated from field: tdf_notes.v1.TdfNote tdf_note = 1; + */ + tdfNote?: TdfNote; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.GetTdfNoteResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tdf_note", kind: "message", T: TdfNote }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetTdfNoteResponse { + return new GetTdfNoteResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetTdfNoteResponse { + return new GetTdfNoteResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetTdfNoteResponse { + return new GetTdfNoteResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetTdfNoteResponse | PlainMessage | undefined, b: GetTdfNoteResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetTdfNoteResponse, a, b); + } +} + +/** + * Request message for querying notes associated with a TDF object + * + * @generated from message tdf_notes.v1.QueryTdfNotesRequest + */ +export class QueryTdfNotesRequest extends Message { + /** + * Parent TDF object ID (foreign key to tdf_objects) + * + * @generated from field: string parent_id = 1; + */ + parentId = ""; + + /** + * Start timestamp for querying notes + * + * @generated from field: google.protobuf.Timestamp start_ts = 2; + */ + startTs?: Timestamp; + + /** + * End timestamp for querying notes + * + * @generated from field: google.protobuf.Timestamp end_ts = 3; + */ + endTs?: Timestamp; + + /** + * Search query for filtering notes + * + * @generated from field: string search = 4; + */ + search = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.QueryTdfNotesRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "parent_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "start_ts", kind: "message", T: Timestamp }, + { no: 3, name: "end_ts", kind: "message", T: Timestamp }, + { no: 4, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): QueryTdfNotesRequest { + return new QueryTdfNotesRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): QueryTdfNotesRequest { + return new QueryTdfNotesRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): QueryTdfNotesRequest { + return new QueryTdfNotesRequest().fromJsonString(jsonString, options); + } + + static equals(a: QueryTdfNotesRequest | PlainMessage | undefined, b: QueryTdfNotesRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(QueryTdfNotesRequest, a, b); + } +} + +/** + * Response message for querying notes associated with a TDF object + * + * @generated from message tdf_notes.v1.QueryTdfNotesResponse + */ +export class QueryTdfNotesResponse extends Message { + /** + * List of notes associated with the parent TDF object + * + * @generated from field: repeated tdf_notes.v1.TdfNote tdf_notes = 1; + */ + tdfNotes: TdfNote[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.QueryTdfNotesResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tdf_notes", kind: "message", T: TdfNote, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): QueryTdfNotesResponse { + return new QueryTdfNotesResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): QueryTdfNotesResponse { + return new QueryTdfNotesResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): QueryTdfNotesResponse { + return new QueryTdfNotesResponse().fromJsonString(jsonString, options); + } + + static equals(a: QueryTdfNotesResponse | PlainMessage | undefined, b: QueryTdfNotesResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(QueryTdfNotesResponse, a, b); + } +} + +/** + * todo: intentionally left empty until we decide if any filtering needs to be done + * + * @generated from message tdf_notes.v1.StreamTdfNotesRequest + */ +export class StreamTdfNotesRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.StreamTdfNotesRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): StreamTdfNotesRequest { + return new StreamTdfNotesRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): StreamTdfNotesRequest { + return new StreamTdfNotesRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): StreamTdfNotesRequest { + return new StreamTdfNotesRequest().fromJsonString(jsonString, options); + } + + static equals(a: StreamTdfNotesRequest | PlainMessage | undefined, b: StreamTdfNotesRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(StreamTdfNotesRequest, a, b); + } +} + +/** + * Stream response for streaming note events (similar to streaming TDF objects) + * + * @generated from message tdf_notes.v1.StreamTdfNotesResponse + */ +export class StreamTdfNotesResponse extends Message { + /** + * Type of stream event (e.g., new note) + * + * @generated from field: tdf_notes.v1.StreamEventType event_type = 1; + */ + eventType = StreamEventType.UNSPECIFIED; + + /** + * Details about the event + * + * @generated from field: string event_detail = 2; + */ + eventDetail = ""; + + /** + * List of notes being streamed + * + * @generated from field: repeated tdf_notes.v1.TdfNote tdf_notes = 6; + */ + tdfNotes: TdfNote[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_notes.v1.StreamTdfNotesResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "event_type", kind: "enum", T: proto3.getEnumType(StreamEventType) }, + { no: 2, name: "event_detail", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 6, name: "tdf_notes", kind: "message", T: TdfNote, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): StreamTdfNotesResponse { + return new StreamTdfNotesResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): StreamTdfNotesResponse { + return new StreamTdfNotesResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): StreamTdfNotesResponse { + return new StreamTdfNotesResponse().fromJsonString(jsonString, options); + } + + static equals(a: StreamTdfNotesResponse | PlainMessage | undefined, b: StreamTdfNotesResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(StreamTdfNotesResponse, a, b); + } +} + diff --git a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_connect.ts b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_connect.ts index a7d2354..eeb0185 100644 --- a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_connect.ts +++ b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_connect.ts @@ -1,9 +1,9 @@ // @generated by protoc-gen-connect-es v1.4.0 with parameter "target=ts,import_extension=none" -// @generated from file tdf_object/v1/tdf_object.proto (package tdf_object.v1, syntax proto3) +// @generated from file proto/tdf_object/v1/tdf_object.proto (package tdf_object.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck -import { CreateTdfObjectRequest, CreateTdfObjectResponse, GetEntitlementsRequest, GetEntitlementsResponse, GetSrcTypeRequest, GetSrcTypeResponse, GetTdfObjectRequest, GetTdfObjectResponse, ListSrcTypesRequest, ListSrcTypesResponse, QueryTdfObjectsRequest, QueryTdfObjectsResponse, StreamTdfObjectsRequest, StreamTdfObjectsResponse } from "./tdf_object_pb"; +import { CreateTdfObjectRequest, CreateTdfObjectResponse, GetEntitlementsRequest, GetEntitlementsResponse, GetSrcTypeRequest, GetSrcTypeResponse, GetTdfObjectRequest, GetTdfObjectResponse, ListSrcTypesRequest, ListSrcTypesResponse, QueryTdfObjectsRequest, QueryTdfObjectsResponse, StreamTdfObjectsRequest, StreamTdfObjectsResponse, UpdateTdfObjectRequest, UpdateTdfObjectResponse } from "./tdf_object_pb"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -21,6 +21,15 @@ export const TdfObjectService = { O: CreateTdfObjectResponse, kind: MethodKind.Unary, }, + /** + * @generated from rpc tdf_object.v1.TdfObjectService.UpdateTdfObject + */ + updateTdfObject: { + name: "UpdateTdfObject", + I: UpdateTdfObjectRequest, + O: UpdateTdfObjectResponse, + kind: MethodKind.Unary, + }, /** * @generated from rpc tdf_object.v1.TdfObjectService.GetTdfObject */ diff --git a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_pb.ts b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_pb.ts index cbe9d83..ff13a48 100644 --- a/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_pb.ts +++ b/common-operating-picture/ui/src/proto/tdf_object/v1/tdf_object_pb.ts @@ -1,10 +1,10 @@ // @generated by protoc-gen-es v1.9.0 with parameter "target=ts,import_extension=none" -// @generated from file tdf_object/v1/tdf_object.proto (package tdf_object.v1, syntax proto3) +// @generated from file proto/tdf_object/v1/tdf_object.proto (package tdf_object.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3, Struct, Timestamp } from "@bufbuild/protobuf"; +import { BytesValue, Message, proto3, StringValue, Struct, Timestamp } from "@bufbuild/protobuf"; /** * @generated from enum tdf_object.v1.StreamEventType @@ -124,17 +124,24 @@ export class TdfObject extends Message { */ search = ""; + /** + * plaintext json metadata index + * + * @generated from field: string metadata = 6; + */ + metadata = ""; + /** * tdf bytes * - * @generated from field: bytes tdf_blob = 6; + * @generated from field: bytes tdf_blob = 7; */ tdfBlob = new Uint8Array(0); /** * tdf data uri * - * @generated from field: string tdf_uri = 7; + * @generated from field: string tdf_uri = 8; */ tdfUri = ""; @@ -151,8 +158,9 @@ export class TdfObject extends Message { { no: 3, name: "src_type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 4, name: "geo", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 5, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 6, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 7, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 6, name: "metadata", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + { no: 8, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TdfObject { @@ -595,24 +603,31 @@ export class CreateTdfObjectRequest extends Message { */ search = ""; + /** + * plaintext json metadata index + * + * @generated from field: string metadata = 4; + */ + metadata = ""; + /** * tdf bytes * - * @generated from field: bytes tdf_blob = 4; + * @generated from field: bytes tdf_blob = 5; */ tdfBlob = new Uint8Array(0); /** * tdf data uri * - * @generated from field: string tdf_uri = 5; + * @generated from field: string tdf_uri = 6; */ tdfUri = ""; /** * timestamp of data * - * @generated from field: google.protobuf.Timestamp ts = 6; + * @generated from field: google.protobuf.Timestamp ts = 7; */ ts?: Timestamp; @@ -627,9 +642,10 @@ export class CreateTdfObjectRequest extends Message { { no: 1, name: "src_type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "geo", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 5, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 6, name: "ts", kind: "message", T: Timestamp }, + { no: 4, name: "metadata", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "tdf_blob", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, + { no: 6, name: "tdf_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "ts", kind: "message", T: Timestamp }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): CreateTdfObjectRequest { @@ -686,6 +702,138 @@ export class CreateTdfObjectResponse extends Message { } } +/** + * Uses wrappers to enable optional fields + * + * @generated from message tdf_object.v1.UpdateTdfObjectRequest + */ +export class UpdateTdfObjectRequest extends Message { + /** + * @generated from field: string id = 1; + */ + id = ""; + + /** + * source type of data (MARS? what else?) + * + * @generated from field: google.protobuf.StringValue src_type = 2; + */ + srcType?: string; + + /** + * geospatial data of location of data + * + * @generated from field: google.protobuf.StringValue geo = 3; + */ + geo?: string; + + /** + * plaintext json search index + * + * @generated from field: google.protobuf.StringValue search = 4; + */ + search?: string; + + /** + * plaintext json metadata index + * + * @generated from field: google.protobuf.StringValue metadata = 5; + */ + metadata?: string; + + /** + * tdf bytes + * + * @generated from field: google.protobuf.BytesValue tdf_blob = 6; + */ + tdfBlob?: Uint8Array; + + /** + * tdf data uri + * + * @generated from field: google.protobuf.StringValue tdf_uri = 7; + */ + tdfUri?: string; + + /** + * timestamp of data + * + * @generated from field: google.protobuf.Timestamp ts = 8; + */ + ts?: Timestamp; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_object.v1.UpdateTdfObjectRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "src_type", kind: "message", T: StringValue }, + { no: 3, name: "geo", kind: "message", T: StringValue }, + { no: 4, name: "search", kind: "message", T: StringValue }, + { no: 5, name: "metadata", kind: "message", T: StringValue }, + { no: 6, name: "tdf_blob", kind: "message", T: BytesValue }, + { no: 7, name: "tdf_uri", kind: "message", T: StringValue }, + { no: 8, name: "ts", kind: "message", T: Timestamp }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateTdfObjectRequest { + return new UpdateTdfObjectRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateTdfObjectRequest { + return new UpdateTdfObjectRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateTdfObjectRequest { + return new UpdateTdfObjectRequest().fromJsonString(jsonString, options); + } + + static equals(a: UpdateTdfObjectRequest | PlainMessage | undefined, b: UpdateTdfObjectRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateTdfObjectRequest, a, b); + } +} + +/** + * @generated from message tdf_object.v1.UpdateTdfObjectResponse + */ +export class UpdateTdfObjectResponse extends Message { + /** + * @generated from field: string id = 1; + */ + id = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "tdf_object.v1.UpdateTdfObjectResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateTdfObjectResponse { + return new UpdateTdfObjectResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateTdfObjectResponse { + return new UpdateTdfObjectResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateTdfObjectResponse { + return new UpdateTdfObjectResponse().fromJsonString(jsonString, options); + } + + static equals(a: UpdateTdfObjectResponse | PlainMessage | undefined, b: UpdateTdfObjectResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateTdfObjectResponse, a, b); + } +} + /** * @generated from message tdf_object.v1.GetTdfObjectRequest */ @@ -784,6 +932,11 @@ export class QueryTdfObjectsRequest extends Message { */ search = ""; + /** + * @generated from field: string metadata = 5; + */ + metadata = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -796,6 +949,7 @@ export class QueryTdfObjectsRequest extends Message { { no: 2, name: "src_type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "geo_location", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 4, name: "search", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "metadata", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): QueryTdfObjectsRequest { diff --git a/common-operating-picture/ui/src/styles/leaflet.css b/common-operating-picture/ui/src/styles/leaflet.css index 0d65b41..da67683 100644 --- a/common-operating-picture/ui/src/styles/leaflet.css +++ b/common-operating-picture/ui/src/styles/leaflet.css @@ -3,3 +3,259 @@ .leaflet-popup-content p { margin: 0; } + +/* ===== NEED TO MOVE THESE VEHICLE RELATED CSS TO ITS OWN FILE ===== */ +.leaflet-tooltip.custom-compact-tooltip { + padding: 0 !important; + border: none !important; + box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4) !important; + background: #fff !important; +} + +.leaflet-tooltip-pane .leaflet-tooltip-content { + padding: 0 !important; + margin: 0 !important; + background: #fff !important; +} + +.custom-compact-tooltip { + padding: 0 !important; + background: #fff !important; + border: none !important; + box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.15) !important; +} + +.leaflet-popup-content-wrapper { + padding: 0 !important; + overflow: hidden; + border-radius: 8px; +} + +.leaflet-popup-content { + margin: 0 !important; + width: auto !important; + display: block; +} + +/* Adjusting the tip (triangle) at the bottom */ +.leaflet-popup-tip-container { + margin-top: -1px; +} + +/* ===== TOOLTIP CONTAINER ===== */ +.tooltip-container { + min-width: 280px; + max-width: 320px; + padding: 10px; + background-color: #f7f7f7 !important; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + position: relative; +} + +/* ===== HEADER SECTION ===== */ +.tooltip-header { + margin-bottom: 12px; + padding-bottom: 8px; + border-bottom: 2px solid #1976d2; +} + +.vehicle-name { + color: #1976d2; + font-weight: 700; + line-height: 1.2; + margin-bottom: 4px; +} + +.callsign-container { + display: flex; + align-items: center; + gap: 4px; +} + +.callsign-label { + color: #666; + font-weight: 600; +} + +.callsign-value { + color: #000; + font-weight: 700; + background-color: rgba(0, 0, 0, 0.04); + padding: 2px 6px; + border-radius: 4px; +} + +/* ===== SECTION STYLES ===== */ +.tooltip-section { + margin-bottom: 12px; +} + +.tooltip-section:last-child { + margin-bottom: 0; +} + +.section-title { + font-weight: 700; + margin-bottom: 8px; + color: #1976d2; +} + +/* ===== TELEMETRY GRID ===== */ +.telemetry-grid { + display: grid; + grid-template-columns: 1fr 2fr; + gap: 12px; + align-items: center; +} + +.speed-gauge-column { + display: flex; + flex-direction: column; + align-items: center; +} + +.telemetry-details-column { + display: flex; + flex-direction: column; + gap: 6px; +} + +/* ===== SPEED GAUGE ===== */ +.speed-gauge-container { + position: relative; + display: inline-flex; +} + +.speed-gauge-bg { + color: rgba(0, 0, 0, 0.2); + position: absolute; +} + +.speed-gauge-progress { + position: relative; +} + +.speed-gauge-progress.speed-high { + color: #d32f2f; +} + +.speed-gauge-progress.speed-medium { + color: #ed6c02; +} + +.speed-gauge-progress.speed-low { + color: #2e7d32; +} + +.speed-gauge-content { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.speed-value { + font-weight: bold; + line-height: 1; +} + +.speed-unit { + font-size: 0.65rem; + line-height: 1; + margin-top: 2px; +} + +.speed-gauge-na { + width: 60px; + height: 60px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0.04); +} + +/* ===== DETAIL ITEMS ===== */ +.detail-item { + display: flex; + align-items: center; + margin-bottom: 6px; + padding: 4px 6px; + border-radius: 4px; + background-color: rgba(0, 0, 0, 0.04); + transition: background-color 0.2s; +} + +.detail-item:hover { + background-color: rgba(0, 0, 0, 0.08); +} + +.detail-item:last-child { + margin-bottom: 0; +} + +.detail-icon { + margin-right: 8px; + font-size: 1.1rem; + color: #000; +} + +.detail-label { + font-weight: 600; + margin-right: 4px; + color: #666; +} + +.detail-value { + font-weight: 500; +} + +/* Container for the "window" that pops out */ +.popped-out-window { + position: fixed; + bottom: 20px; + right: 20px; + width: 400px; + background: white; + z-index: 2000; /* Higher than Leaflet */ + box-shadow: 0px 10px 30px rgba(0,0,0,0.3); + border-radius: 8px; + border: 1px solid #ccc; + display: flex; + flex-direction: column; + animation: slideIn 0.3s ease-out; +} + +.window-header { + background: #f5f5f5; + padding: 8px 12px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #ffffff; + border-radius: 8px 8px 0 0; + cursor: move; /* Aesthetic only unless you add drag logic */ +} + +@keyframes slideIn { + from { transform: translateY(100%); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +/* Customizing the Leaflet Popup to look cleaner */ +.custom-vehicle-popup .leaflet-popup-content-wrapper { + padding: 0; + overflow: hidden; + border-radius: 4px; +} + +.custom-vehicle-popup .leaflet-popup-content { + margin: 0; + width: 300px !important; +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/utils/ClassificationSelectorModal.tsx b/common-operating-picture/ui/src/utils/ClassificationSelectorModal.tsx new file mode 100644 index 0000000..ea54978 --- /dev/null +++ b/common-operating-picture/ui/src/utils/ClassificationSelectorModal.tsx @@ -0,0 +1,247 @@ +import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@mui/material'; +import { RJSFSchema } from '@rjsf/utils'; +import { IChangeEvent, withTheme } from '@rjsf/core'; +import { useContext, useState, useMemo } from 'react'; +import { BannerContext, Classifications, ClassificationPriority } from '@/contexts/BannerContext'; +import { attributes, getSubordinateClassifications } from '@/utils/attributes'; +import { customizeValidator } from '@rjsf/validator-ajv8'; +import { Theme as RJSFFormMuiTheme } from '@rjsf/mui'; + +// Configure RJSF +const validator = customizeValidator(); +const SetClassForm = withTheme(RJSFFormMuiTheme); + +// Define the shape of the form data +type ClassificationFormData = { + activeClassification: string; + activeNeedToKnow: string[]; + activeRelTo: string[]; +}; + +type ClassificationModalProps = { + isOpen: boolean; + onClose: () => void; + userEntitlements: string[]; +}; + +interface AttributeValue { + value: string; + label: string; + group?: string; +} + +export function ClassificationSelectorModal({ isOpen, onClose, userEntitlements }: ClassificationModalProps) { + const { + setHasResults, + setActiveEntitlements, + setTdfObjects, + activeEntitlements, + } = useContext(BannerContext); + + const extractEntitlementValues = (category: string) => + userEntitlements + .filter(entitlement => entitlement.includes(`/attr/${category}/value/`)) + .map(entitlement => entitlement.split('/').pop()?.toUpperCase()) + .filter((name): name is string => name !== undefined); + + const defaultNeedToKnows = extractEntitlementValues('needtoknow'); + const defaultRelTo = extractEntitlementValues('relto'); + + // Find the user's highest entitlement + const userHighestClassification = useMemo(() => { + let maxPriority = -1; + let highestClass = Classifications[0]; + + userEntitlements + // Filter entitlement to get classification name + .map(entitlement => entitlement.split('/').pop()?.toUpperCase()) + .forEach(name => { + if (name && ClassificationPriority.hasOwnProperty(name)) { + const priority = ClassificationPriority[name as keyof typeof ClassificationPriority]; + if (priority > maxPriority) { + maxPriority = priority; + highestClass = name; + } + } + }); + return highestClass; + }, [userEntitlements]); + + const activeValues = useMemo(() => { + let currentClass = userHighestClassification; + const currentNeedToKnow: string[] = []; + const currentRelTo: string[] = []; + let maxPriority = -1; + + // Iterate over the currently active entitlements set + activeEntitlements.forEach(entitlement => { + const simpleName = entitlement.split('/').pop()?.toUpperCase(); + if (!simpleName) return; + + if (entitlement.includes('/attr/classification/value/')) { + // Find the highest active classification + if (ClassificationPriority.hasOwnProperty(simpleName)) { + const priority = ClassificationPriority[simpleName as keyof typeof ClassificationPriority]; + if (priority > maxPriority) { + maxPriority = priority; + currentClass = simpleName; + } + } + } else if (entitlement.includes('/attr/needtoknow/value/')) { + // Collect all active needtoknows + currentNeedToKnow.push(simpleName); + } else if (entitlement.includes('/attr/relto/value/')) { + // Collect all active relto + currentRelTo.push(simpleName); + } + }); + + return { + activeClassification: currentClass, + activeNeedToKnow: currentNeedToKnow, + activeRelTo: currentRelTo, + }; + }, [activeEntitlements, userHighestClassification]); + + // Initialize Form + + const [formData, setFormData] = useState({ + activeClassification: activeValues.activeClassification, + activeNeedToKnow: activeValues.activeNeedToKnow.length > 0 ? activeValues.activeNeedToKnow : defaultNeedToKnows, + activeRelTo: activeValues.activeRelTo.length > 0 ? activeValues.activeRelTo : defaultRelTo, + }); + + const handleChange = (e: IChangeEvent) => { + if (e.formData) { + setFormData(e.formData); + } + }; + + const extractSimpleNames = (attributeList: AttributeValue[]): string[] => { + return attributeList + .map(attr => attr.value.split('/').pop()?.toUpperCase()) + .filter((name): name is string => name !== undefined); + }; + + const availableOptions = useMemo(() => { + // Dropdown options for based on all user entitlements + const simpleEntitledClasses = userEntitlements + .map(entitlement => entitlement.split('/').pop()?.toUpperCase()) + .filter((name): name is string => name !== undefined && Classifications.includes(name)); + + const entitledClasses = Classifications.filter(c => simpleEntitledClasses.includes(c)); + const finalAvailableOptions = entitledClasses; + + const allKnownNeedToKnows = extractSimpleNames(attributes.needToKnow); + const availableNeedToKnows = allKnownNeedToKnows + .filter(val => defaultNeedToKnows.includes(val)); + + const allKnownRelTo = extractSimpleNames(attributes.relto); + const availableRelTo = allKnownRelTo + .filter(val => defaultRelTo.includes(val)); + + return { + classification: finalAvailableOptions, + needToKnow: availableNeedToKnows, + relTo: availableRelTo, + }; + + }, [userEntitlements]); + + // Handle the submission of new active classification level + const handleSubmit = () => { + const { activeClassification, activeNeedToKnow, activeRelTo } = formData; + const allEntitlements = userEntitlements; + + // Determine the subordinate classification names for the new class + const subordinateClasses = getSubordinateClassifications(activeClassification) + + // Filter user entitlements + const newActiveEntitlements = new Set( + allEntitlements.filter(entitlement => { + const simpleName = entitlement.split('/').pop()?.toUpperCase(); + if (!simpleName) return false; + + // Classification Filtering + if (entitlement.includes('/attr/classification/value/')) { + return subordinateClasses.includes(simpleName); + } + + // Needtoknow Filtering + if (entitlement.includes('/attr/needtoknow/value/')) { + // Keep the entitlement if its simple name is in the user's *selection* + return activeNeedToKnow.includes(simpleName); + } + + // Relto Filtering + if (entitlement.includes('/attr/relto/value/')) { + return activeRelTo.includes(simpleName); + } + + return true; + }) + ); + setActiveEntitlements(newActiveEntitlements); + + //Refresh results after setting new classification + setHasResults(false); + setTdfObjects([]); + + onClose(); + }; + + // The RJSF Schema for the form + const schema: RJSFSchema = { + type: 'object', + required: ['activeClassification'], + properties: { + activeClassification: { + type: 'string', + title: 'Active Classification', + enum: availableOptions.classification, + enumNames: availableOptions.classification.map(c => c.toUpperCase()), + }, + activeNeedToKnow: { + type: 'array', + title: 'Active Need-to-Knows', + items: { + type: 'string', + enum: availableOptions.needToKnow, + enumNames: availableOptions.needToKnow.map(c => c.toUpperCase()), + }, + uniqueItems: true, + }, + activeRelTo: { + type: 'array', + title: 'Active RelTo', + items: { + type: 'string', + enum: availableOptions.relTo, + enumNames: availableOptions.relTo.map(c => c.toUpperCase()), + }, + uniqueItems: true, + }, + }, + }; + + return ( + + Set Active Classification + + + + + + + + + ); +} \ No newline at end of file diff --git a/common-operating-picture/ui/src/utils/attributes.ts b/common-operating-picture/ui/src/utils/attributes.ts index 43d1e3b..c1ca130 100644 --- a/common-operating-picture/ui/src/utils/attributes.ts +++ b/common-operating-picture/ui/src/utils/attributes.ts @@ -2,9 +2,202 @@ // same YAML provisioned into the DSP policy database. // @ts-expect-error TS2307 - policy yaml schema is enforced by DSP and should not be defined in frontend import { attributes as policy } from '@root/sample.federal_policy.yaml'; +import { IChangeEvent } from '@rjsf/core'; +import { RJSFSchema } from '@rjsf/utils'; +import { ClassificationPriority, extractValues } from '@/contexts/BannerContext'; +import { TdfObjectResponse, TdfNotesResponse } from '@/hooks/useRpcClient'; const namespace = policy[0].namespace; +export const extractAttributeValueFromFqn = (fqn: string): string => { + const value = fqn.split('/').pop(); + return (value || '').toUpperCase(); +}; + +interface TDFObjectSearchAttributes { + attrClassification?: string[]; + attrNeedtoknow?: string[]; + attrRelto?: string[]; +} + +export const checkObjectEntitlements = (tdfObject: TdfObjectResponse, activeEntitlements: Set): boolean => { + // Get the raw attribute data from the object + const classification = tdfObject.decryptedData.attrClassification; + const needToKnow = tdfObject.decryptedData.attrNeedToKnow || []; + const relTo = tdfObject.decryptedData.attrRelTo || []; + + // Process and split attributes into arrays + const splitValues = (val: any) => extractValues(val).split(', ').filter(v => v.trim() !== ''); + + const objClassification = splitValues(classification); + const objNeedToKnows = splitValues(needToKnow); + const objRelTo = splitValues(relTo); + + // Prepare user entitlements + const trimmedEntitlements = new Set( + [...activeEntitlements].map(extractAttributeValueFromFqn) + ); + + // All of check (Classification & Need To Know) + // User must have every single one of these attributes. + const allofAttributes = [...objClassification, ...objNeedToKnows]; + for (const attr of allofAttributes) { + if (!trimmedEntitlements.has(attr.toUpperCase())) { + return true; // Fail due to missing a required all of attribute + } + } + + // "any of" check for RelTo + // If RelTo attributes exist, the user only needs to match ONE. + if (objRelTo.length > 0) { + const hasAtLeastOneRelTo = objRelTo.some(rel => + trimmedEntitlements.has(rel.toUpperCase()) + ); + + if (!hasAtLeastOneRelTo) { + return true; // Fail if user does not match any of the RelTo values + } + } + + return false; // Success: All checks passed +}; + +export const checkNoteEntitlements = (tdfNote: TdfNotesResponse, activeEntitlements: Set): boolean => { + + let searchAttributes: TDFObjectSearchAttributes = { + attrClassification: [], + attrNeedtoknow: [], + attrRelto: [] + }; + + try { + // Parse the JSON string from tdfNote.search + searchAttributes = JSON.parse(tdfNote.tdfNote.search || '{}'); + } catch (e) { + console.error("Failed to parse note search attributes for entitlement check:", e); + return true; + } + + const extractNoteAttr = (attrArray: string[] | undefined): string[] => { + if (!attrArray || attrArray.length === 0) return []; + return attrArray.map((attrUrl: string) => + attrUrl.split('/').pop()?.toUpperCase() || '' + ).filter(v => v.trim() !== ''); + }; + + // Prepare the user's entitlements (normalized to uppercase) + const trimmedEntitlements = new Set( + [...activeEntitlements].map(extractAttributeValueFromFqn) + ); + + // Normalize Note Attributes + const noteClass = extractNoteAttr(searchAttributes.attrClassification); + const noteNTK = extractNoteAttr(searchAttributes.attrNeedtoknow); + const noteRelTo = extractNoteAttr(searchAttributes.attrRelto); + + // All of check (Classification & NeedToKnow) + // The user must have every single one of these attributes. + const allofAttributes = [...noteClass, ...noteNTK]; + for (const attr of allofAttributes) { + if (!trimmedEntitlements.has(attr)) { + return true; // Fail due to missing a required all of attribute + } + } + + // Any of check + // If RelTo attributes exist, the user only needs to match ONE. + if (noteRelTo.length > 0) { + const hasAtLeastOneRelTo = noteRelTo.some(rel => trimmedEntitlements.has(rel)); + + if (!hasAtLeastOneRelTo) { + // console.log("User does not have any of the required RelTo attributes"); + return true; // Fail user has none of the specified RelTo values + } + } + + return false; // Success: All checks passed +}; + +// Checks if the user has the required RelTo entitlements. Returns true if the user is missing required RelTo values. +export const checkRelToEntitlements = (relToAttrs: string[] | undefined, activeEntitlements: Set): boolean => { + if (!relToAttrs || relToAttrs.length === 0) return false; // No RelTo attributes means no entitlement check needed + + // Check if the user has any of the RelTo attributes with array check for overlapping elements between relToAttrs and activeEntitlements + const hasAtLeastOneRelTo = relToAttrs.some(rel => activeEntitlements.has(rel)); + + if (!hasAtLeastOneRelTo) { + return true; // Fail if user does not have any of the specified RelTo values + } + + return false; // Success: User has at least one of the required RelTo values +}; + +// Utility to calculate all subordinate classifications for a selected classification. +export const getSubordinateClassifications = (selectedClass: string): string[] => { + // Look up the priority of the selected class + const selectedPriority = ClassificationPriority[selectedClass as keyof typeof ClassificationPriority]; + if (selectedPriority === undefined) return []; + + // Filter all classifications whose priority is less than or equal to the selected one. + return Object.keys(ClassificationPriority).filter( + (key) => ClassificationPriority[key as keyof typeof ClassificationPriority] <= selectedPriority + ); +}; + +// Checks form data against user entitlements to find unavailable attributes. +export const checkAndSetUnavailableAttributes = ( + data: IChangeEvent, + attrFields: string[] | undefined, + entitlements: Set, + setUnavailAttrs: React.Dispatch> +) => { + const { formData } = data; + + if (!formData || !attrFields) { + setUnavailAttrs([]); + return; + } + + const pendingUnavailAttrs = Object.entries(formData).reduce((acc: string[], [key, value]) => { + if (attrFields.includes(key)) { + // Normalize value to an array if it's a single select/string + let values = Array.isArray(value) ? value : [value as string]; + + if (key === 'attrRelTo') { + // Check if the user has any of these values in their entitlements + const hasAtLeastOne = values.some(v => entitlements.has(v)); + + // If they have none of the values mark the whole set as unavailable + if (!hasAtLeastOne && values.length > 0) { + acc.push(...values); + } + } + // All of logic for the rest of the attributes + else { + values.forEach((v: string) => { + if (v && !entitlements.has(v)) { + acc.push(v); + } + }); + } + } + return acc; + }, []); + + setUnavailAttrs(pendingUnavailAttrs); +}; + +// Sets the entitlements state based on the user object from useAuth. +export const updateEntitlementsFromUser = ( + user: { entitlements: string[] } | null | undefined, + setEntitlements: React.Dispatch>> +) => { + if (user && user.entitlements) { + setEntitlements(new Set(user.entitlements)); + } +}; + + export function attrFqn(attr: string, value: string) { return `https://${namespace}/attr/${attr}/value/${value}`.toLowerCase(); } @@ -21,7 +214,7 @@ export function getAttributes(...attrs: Array): s return flattened; } -const reltoMap: { +export const reltoMap: { [attrValue: string]: { label: string; group?: string; diff --git a/common-operating-picture/ui/src/workers/decrypt.worker.ts b/common-operating-picture/ui/src/workers/decrypt.worker.ts new file mode 100644 index 0000000..d5f2c0a --- /dev/null +++ b/common-operating-picture/ui/src/workers/decrypt.worker.ts @@ -0,0 +1,89 @@ +import { AuthProviders, DSP } from '@virtru/dsp-sdk'; + +// Worker's input data +interface WorkerInitData { + config: any; + user: { refreshToken: string; accessToken: string; }; +} + +interface WorkerMessageData { + tdfBlobBuffer: ArrayBuffer; +} + +async function createAuthProvider(user: WorkerInitData['user'], config: WorkerInitData['config']) { + if (!user || !user.refreshToken) { + throw new Error('TDF AuthProvider creation failed in worker: no refresh token found'); + } + + return await AuthProviders.refreshAuthProvider({ + clientId: config.dsp.keycloak.clientId, + exchange: 'refresh', + refreshToken: user.refreshToken, + oidcOrigin: config.dsp.keycloak.serverUrl, + }); +} + +async function decryptWorkerPayload(ciphertext: ArrayBuffer, config: WorkerInitData['config'], user: WorkerInitData['user']): Promise { + const authProvider = await createAuthProvider(user, config); + + // Initialize unified DSP client + const dsp = new DSP({ + authProvider, + platformUrl: config.dsp.baseUrl, + disableDPoP: true, + }); + + const bufferedSource = { + type: 'buffer' as const, + location: new Uint8Array(ciphertext), + }; + + // dsp.read handles both Nano and ZTDF/TDF3 automatically + const stream = await dsp.read({ + source: bufferedSource, + }); + + // Convert the resulting stream/ReadableStream to text + return new Response(stream).text(); +} + +let isInitialized = false; +let workerConfig: WorkerInitData['config']; +let workerUser: WorkerInitData['user']; + +self.onmessage = async (event: MessageEvent) => { + // Initialization + if ('config' in event.data && 'user' in event.data) { + workerConfig = event.data.config; + workerUser = event.data.user; + isInitialized = true; + self.postMessage({ type: 'init-complete' }); + return; + } + + // Decryption + if (!isInitialized) { + console.error('Worker received decryption message before initialization.'); + return; + } + + const { tdfBlobBuffer } = event.data as WorkerMessageData; + + let decryptedPayload: string | null = null; + let error = null; + + if (tdfBlobBuffer && tdfBlobBuffer.byteLength > 0) { + try { + decryptedPayload = await decryptWorkerPayload(tdfBlobBuffer, workerConfig, workerUser); + } catch (err) { + error = err; + console.error('Worker Decryption Error:', err); + } + } + + self.postMessage({ + type: 'decryption-result', + decryptedPayload, + error: error ? String(error) : null, + }); +}; \ No newline at end of file