Dynamic Tool Discovery: Azure AI Agent Service + MCP Server Integration
May 12, 2025How to Monitor Automated Backups in Azure SQL Managed Instance Using T-SQL and SQL Agent
May 12, 2025This is the second instalment of a miniseries where I am building an end-to-end AI home security and cross platform system.
I recommend reading Part 1 before reading on. To recap, the main requirements for this system are:
- Detect motion
- Capture photo
- Create message with photo attached
- Send message to defined Telegram bot
- Detect who is in the photo, if the person is me, then do not invoke the Telegram bot with a message and image
In this blog post, we implement core functionality that lets us convert images to vectors using OpenAIs free CLIP SDK and ViT-B-32 model.
These can then be used to perform real-time similarity checks against new incoming data.
~
What is CLIP
CLIP (Contrastive Language–Image Pre-training) is an AI model developed by OpenAI that can understand the relationship between images and text.
CLIP makes it easy for you to encode images into high-dimensional vectors (embeddings). With images in vector format, you can then perform:
- Semantic similarity search (image-to-image or image-to-text).
- Zero-shot classification (without retraining).
- Content-based image retrieval.
Vector representations of visual content can then be compared using mathematical operations like cosine similarity.
Watch this 2-minute explainer to help you understand how cosine similarity works.
~
Why Use CLIP
I selected CLIP because:
- no need for custom model training and it works out-of-the-box
- fast and efficient – runs locally with support for CPU or GPU
- versatile – can compare images or map them to descriptive text
For the home security system, this means:
- privacy is maintained as no need to send images to cloud APIs
- responsive and quick as no cloud latency
- can train the system on known people or objects using sample images
- can match new images in real-time to these known entities
It means that when the Raspberry Pi detects an image, it can be sent to CLIP to perform image classification and recognition.
Within the context of the home security system, it makes it possible to check the newly captured image against a set of locally embedded training images (safe list).
If an image is captured and someone is on the “safe list”, the Telegram message will not be sent to my cell phone.
Finally, CLIP is FREE. No cloud costs! Find out more here.
~
Implementing the CLIP Server
The CLIP server runs on a self-hosted Python server and the following technologies are used:
- Python 3.9+
- FastAPI for HTTP handling
- PyTorch for model execution
- OpenAI’s CLIP GitHub package
- Uvicorn to serve the API
The following code listing contains everything you need to spin up a locally running CLIP server:
from fastapi import FastAPI, UploadFile, File from fastapi.responses import JSONResponse from PIL import Image import torch import clip import io app = FastAPI() device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = clip.load("ViT-B/32", device=device) @app.post("/embed") async def embed_image(file: UploadFile = File(...)): image_bytes = await file.read() image = Image.open(io.BytesIO(image_bytes)).convert('RGB') image_input = preprocess(image).unsqueeze(0).to(device) with torch.no_grad(): image_features = model.encode_image(image_input) embedding = image_features[0].cpu().tolist() return JSONResponse(content={"embedding": embedding}) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=5003)
You’ll see from the above that a single API endpoint (/embed) is made available.
~
How Does the CLIP Server Work
This CLIP server accepts image uploads and returns 512-dimensional vector embeddings. The main steps are:
- Uploads an image to the
/embed
endpoint - Processes the image with the CLIP model.
- Returns the embedding as a JSON array.
Under the hood, OpenAI’s CLIP ViT-B/32 model is used. This model is fetched the first time the server loads.
It’s then added to the local cache for subsequent runs (see below).
This makes it a fully offline solution.
You can find the model here: %USERPROFILE%.cacheclip
~
Running the CLIP Server in Visual Studio Code
We can run the CLIP server in VS Code. The CLIP server is surfaced via an API endpoint with the following command:
uvicorn.run(app, host="0.0.0.0", port=5003)
We can see this in the terminal in VS Code:
With the API running, we can test it using Postman.
~
Testing the CLIP Server using Postman
The API exposes the /embed
endpoint at the following address:
http://localhost:5003/embed
The code below handles requests sent to the endpoint:
async def embed_image(file: UploadFile = File(...)): image_bytes = await file.read() image = Image.open(io.BytesIO(image_bytes)).convert('RGB') image_input = preprocess(image).unsqueeze(0).to(device) with torch.no_grad(): image_features = model.encode_image(image_input) embedding = image_features[0].cpu().tolist() return JSONResponse(content={"embedding": embedding})
A POST request containing the image in required. The API will then return JSON with vector embeddings that represent the image you send.
The high-level steps are:
- Run the server on port 5003.
- Send a POST request to http://localhost:5003/embed.
- Attach an image as file in form-data.
- Inspect the returned embedding.
We check the CLIP server is running in VS Code:
We create a POST request for the /embed endpoint, attaching a file:
We submit the request and vector embeddings are returned:
Perfect.
~
Demo
In this demo, you can see the CLIP server in action. We create a POST request, submit it, and vectors embeddings are returned:
~
How Does This Fit Within the Wider Solution?
The CLIP server forms a key component of the wider solution and helps satisfy the following requirement:
- Detect who is in the photo, if the person is me, then do not invoke the Telegram bot with a message and image
Process
- When a photo is captured by the Raspberry Pi, it will be sent a .NET API that consumes the CLIP Server.
- An embedding is generated and compared against a collection of existing training images that have already been converted to embeddings (images of me).
- The result of the embeddings comparison as a cosine similarity score.
- If the score matches a given threshold and for existing images labelled “me”, the API will return a match with a high score. This will invoke the Telegram message notification.
- If the score does not match a given threshold, no Telegram message will be sent.
All the above will happen in milliseconds and doesn’t require extension compute.
~
Summary
In Part 3 of this series, , we’ll expose the CLIP server running on Python using a .NET Web API.
The .NET Web API will leverage the CLIP server to generate embeddings in a few different ways:
- Generate embeddings for training image data
- Generate embeddings for real-time data being captured from the camera
Stay tuned.
~
.fca_eoi_form{ margin: auto; } .fca_eoi_form p { width: auto; } #fca_eoi_form_560 input{ max-width: 9999px; }#fca_eoi_form_560 .fca_eoi_layout_name_field_wrapper {display: none !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper {float:none;margin-left:auto;margin-right:auto;}#fca_eoi_form_560 .fca_eoi_form_input_element::-webkit-input-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element::-moz-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element:-ms-input-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_form_input_element:-moz-placeholder {opacity:0.6;color:#000000;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper:hover, #fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input:hover {background-color:#1e73be !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper {width:100%;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input {width:100%;}div.fca_eoi_form_text_element,input.fca_eoi_form_input_element,input.fca_eoi_form_button_element{display:block;margin:0;padding:0;line-height:normal;font-size:14px;letter-spacing:normal;word-spacing:normal;text-indent:0;text-shadow:none;text-decoration:none;text-transform:none;white-space:normal;width:inherit;height:inherit;background-image:none;border:none;border-radius:0;box-shadow:none;box-sizing:border-box;transition:none;outline:none;-webkit-transition:none;-webkit-appearance:none;-moz-appearance:none;color:#000;font-family:”Open Sans”, sans-serif;font-weight:normal;transition:background 350ms linear;}div.fca_eoi_form_text_element{text-align:center;}div.fca_eoi_layout_headline_copy_wrapper{font-weight:bold;}div.fca_eoi_layout_0,form.fca_eoi_layout_0{display:inline-block;}div.fca_eoi_layout_0.fca_eoi_layout_widget,form.fca_eoi_layout_0.fca_eoi_layout_widget{max-width:300px;}div.fca_eoi_layout_0.fca_eoi_layout_postbox,form.fca_eoi_layout_0.fca_eoi_layout_postbox{max-width:600px;}div.fca_eoi_layout_0.fca_eoi_layout_popup,form.fca_eoi_layout_0.fca_eoi_layout_popup{max-width:650px;}div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper{margin:20px;}div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper{border:solid 1px transparent;width:49%;border-radius:3px;margin-bottom:10px;position:relative;}div.fca_eoi_layout_0 div.fca_eoi_layout_name_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_name_field_wrapper{float:left;box-sizing:border-box;display:inline-block;}div.fca_eoi_layout_0 div.fca_eoi_layout_email_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_email_field_wrapper{float:right;box-sizing:border-box;display:inline-block;}div.fca_eoi_layout_0 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input,div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input:focus,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper input:focus{border:none !important;width:100%;height:auto;font-size:16px;line-height:1.2em;padding:7px 0;outline:none;background:none !important;box-shadow:none;}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper{clear:both;transition:background 350ms linear, border-color 350ms linear;margin-left:auto;margin-right:auto;}div.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a{display:block;margin:10px 0 0;font-size:12px;}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:13px !important;}}@media (min-width:1px) and (max-width:320px),(min-height:1px) and (max-height:320px){div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:12px !important;}}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_content_wrapper{margin:8px 13px;}div.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_0 div.fca_eoi_layout_fatcatapps_link_wrapper a{margin:0;}div.fca_eoi_layout_0 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper,form.fca_eoi_layout_0 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper{margin-bottom:5px;}}@media (min-width:1px) and (max-width:768px){div.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_field_wrapper{float:none;width:100%;}}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper{text-align:center;width:100%;}div.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_0 div.fca_eoi_layout_submit_button_wrapper input{width:100%;border:0 !important;}#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox { background-color: #ffffff !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_headline_copy_wrapper div { font-size: 25px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_headline_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper p, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper div { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper p, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper input { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper input { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper input { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper input { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper { border-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { font-size: 23px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { color: #ffffff !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input { background-color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_privacy_copy_wrapper div { font-size: 14px !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_privacy_copy_wrapper div { color: #000000 !important; }#fca_eoi_form_560 .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a, .fca_eoi_layout_0.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a:hover { color: #3197e1 !important; }